From 53b2b84a893d5d4f40307a88a9c1b05ee9016f2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Sanz?= Date: Mon, 6 Jul 2026 13:42:59 +0200 Subject: [PATCH] v2.0.0: schema-driven node pack (one node per Runware model) --- .github/workflows/publish.yml | 24 + .gitignore | 20 +- README.md | 224 +- __init__.py | 323 +- assets/image-inference.png | Bin 722458 -> 0 bytes assets/video-inference.png | Bin 799130 -> 0 bytes clientlibs/main.js | 237 - clientlibs/types.js | 754 -- clientlibs/utils.js | 6243 ----------------- modules/acceleratorOptions.py | 172 - modules/advancedFeatureSettings/__init__.py | 2 - .../wanAnimateAdvancedFeatureSettings.py | 99 - modules/apiManager.py | 84 - modules/audioInference.py | 577 -- modules/audioInferenceInputs.py | 171 - modules/audioInferenceReferenceVoices.py | 74 - modules/audioInferenceSpeech.py | 145 - modules/audioInferenceSpeechVoices.py | 86 - modules/audioInput.py | 68 - modules/audioModelSearch.py | 130 - modules/audioSections.py | 66 - modules/audioSettings.py | 552 -- modules/audioSettingsVoiceModify.py | 98 - modules/bgremoval.py | 171 - modules/bridges/mainRoute.py | 143 - modules/controlNet.py | 169 - modules/controlNetCombine.py | 37 - modules/controlNetPreprocessor.py | 119 - modules/embeddingSearch.py | 80 - modules/embeddingsCombine.py | 37 - modules/frameImages.py | 72 - modules/imageCaptioning.py | 134 - modules/imageInference.py | 536 -- modules/imageInferenceAdvancedFeatures.py | 80 - modules/imageInferenceInputs.py | 160 - modules/imageInferenceInputsFonts.py | 60 - modules/imageInferenceSettingsColorPalette.py | 59 - modules/imageInferenceSettingsMoodboards.py | 56 - .../imageInferenceSettingsPromptEnhance.py | 103 - .../imageInferenceSettingsScoringRubric.py | 171 - .../imageInferenceSettingsStructuredPrompt.py | 216 - modules/imageMasking.py | 101 - .../imageRegionalPromptingAdvancedFeature.py | 80 - ...RegionalPromptingAdvancedFeatureRegions.py | 196 - modules/imageUpscalerSettings.py | 61 - modules/imageWatermarkAdvancedFeature.py | 162 - modules/inputAudios.py | 44 - modules/ipAdapter.py | 54 - modules/ipAdapterCombine.py | 37 - modules/loadMesh.py | 55 - modules/loraCombine.py | 37 - modules/loraSearch.py | 87 - modules/mediaUpload.py | 296 - modules/modelSearch.py | 89 - modules/multiInference.py | 109 - modules/outpaintSettings.py | 99 - modules/photoMaker.py | 191 - modules/providerSettings/__init__.py | 5 - .../alibabaProviderSettings.py | 114 - .../blackForestProviderSettings.py | 66 - modules/providerSettings/briaProviderMask.py | 228 - .../providerSettings/briaProviderSettings.py | 349 - .../bytedanceProviderSettings.py | 132 - .../elevenlabsProviderSettings.py | 65 - .../elevenlabsProviderSettingsSections.py | 56 - .../googleProviderSettings.py | 108 - .../klingMultiPromptSegment.py | 47 - .../providerSettings/klingProviderSettings.py | 230 - .../klingProviderSettingsMultiPrompt.py | 91 - .../lightricksProviderSettings.py | 102 - .../providerSettings/lumaProviderSettings.py | 146 - .../midjourneyProviderSettings.py | 120 - .../minimaxProviderSettings.py | 50 - .../mireloProviderSettings.py | 67 - .../openaiProviderSettings.py | 68 - .../pixverseProviderSettings.py | 148 - .../recraftProviderSettings.py | 68 - .../recraftProviderSettingsColor.py | 40 - .../runwayProviderSettings.py | 56 - .../sourcefulProviderSettings.py | 72 - .../sourcefulProviderSettingsFonts.py | 76 - .../providerSettings/syncProviderSettings.py | 157 - modules/providerSettings/syncSegment.py | 104 - .../ultralyticsProviderSettings.py | 142 - .../providerSettings/viduProviderSettings.py | 118 - .../providerSettings/xaiProviderSettings.py | 54 - modules/referenceAudios.py | 48 - modules/referenceImages.py | 50 - modules/referenceVideos.py | 79 - modules/referenceVoices.py | 43 - modules/refiner.py | 56 - modules/runwareBFL.py | 139 - modules/runwareImagen.py | 111 - modules/safetyInputs.py | 91 - modules/save3D.py | 124 - modules/saveImage.py | 110 - modules/saveText.py | 37 - modules/settings.py | 486 -- modules/speechInput.py | 81 - modules/speechInputCombine.py | 59 - modules/textInference.py | 117 - modules/textInferenceInputs.py | 52 - modules/textInferenceInputsImages.py | 50 - modules/textInferenceInputsVideos.py | 51 - modules/textInferenceMessage.py | 33 - modules/textInferenceMessages.py | 58 - modules/textInferenceSettings.py | 245 - modules/textInferenceSettingsCache.py | 64 - modules/textInferenceToolChoice.py | 73 - modules/textModelSearch.py | 98 - modules/threeDInference.py | 208 - modules/threeDInferenceInputs.py | 75 - modules/threeDInferenceSettings.py | 628 -- ...threeDInferenceSettingsDracoCompression.py | 109 - modules/threeDInferenceSettingsMeshCluster.py | 90 - modules/threeDInferenceSettingsShapeSlat.py | 88 - .../threeDInferenceSettingsSparseStructure.py | 88 - modules/threeDInferenceSettingsTexSlat.py | 88 - modules/threeDModelSearch.py | 91 - modules/ultralyticsInputs.py | 156 - modules/upscaler.py | 291 - modules/utils/runwareUtils.py | 1135 --- modules/vaeSearch.py | 69 - modules/vectorize.py | 209 - modules/version.py | 1 - modules/videoAdvancedFeatureInputs.py | 121 - modules/videoBgRemoval.py | 145 - modules/videoInference.py | 553 -- modules/videoInferenceElements.py | 216 - modules/videoInferenceInputs.py | 169 - modules/videoInferenceLora.py | 35 - ...renceSettingsActiveSpeakerBoundingBoxes.py | 73 - ...InferenceSettingsActiveSpeakerDetection.py | 97 - modules/videoInferenceSettingsControl.py | 137 - modules/videoInferenceSettingsSegments.py | 101 - .../videoInferenceSettingsSourcePosition.py | 74 - modules/videoInferenceSettingsTts.py | 67 - modules/videoInferenceSpeechInput.py | 112 - modules/videoInputsFrame.py | 117 - ...sReferenceImagesMultipleImagesConnector.py | 46 - modules/videoInputsReferences.py | 107 - modules/videoModelSearch.py | 616 -- modules/videoOutputs.py | 75 - modules/videoSettings.py | 449 -- modules/videoTranscription.py | 136 - modules/videoUpscaler.py | 227 - nodes.json | 1 + pyproject.toml | 28 + requirements.txt | 9 +- runware_nodes.py | 864 +++ web/runware.js | 644 ++ workflows/01_basic_image.json | 152 + workflows/02_image_lora.json | 243 + workflows/03_controlnet.json | 315 + workflows/04_video.json | 127 + workflows/05_audio_tts.json | 172 + workflows/06_generic_custom.json | 116 + .../Runware-Image-Inference-Wan_2_7.json | 1 - workflows/Runware_3D_Inference_Hyper.json | 1 - workflows/Runware_3D_Inference_Meshy_6.json | 1 - ...Inference_Trellis_2_Draco_Compression.json | 1 - ...Runware_3D_Inference_Tripo_FBX_Output.json | 1 - .../Runware_3D_Inference_meta_sam_3d.json | 1 - ...unware_3D_Inference_microsoft_trellis.json | 1 - ...nce_microsoft_trellis_meshFile_upload.json | 1 - ...nware_3D_inference_Tencent_Hunyuan_3D.json | 1 - ...ware_3d_Inference_Trellis_2_alphamode.json | 1 - workflows/Runware_Adetailer.json | 1 - workflows/Runware_Audio_Inference.json | 1 - workflows/Runware_Audio_Inference_ACE.json | 1 - .../Runware_Audio_Inference_Ace_Step_1_5.json | 1 - workflows/Runware_Audio_Inference_Dia.json | 1 - workflows/Runware_Audio_Inference_Dia_2.json | 1 - ...re_Audio_Inference_Dia_2_input_audios.json | 1 - ...nference_Elevanlabs_Provider_Settings.json | 1 - .../Runware_Audio_Inference_Fish_S_2_1.json | 1 - ...Audio_Inference_Google_Gemini_3_1_TTS.json | 1 - .../Runware_Audio_Inference_Inworld_TTS.json | 1 - ...Runware_Audio_Inference_Inworld_TTS_2.json | 1 - workflows/Runware_Audio_Inference_Kling.json | 1 - ...unware_Audio_Inference_Minimax_Speech.json | 1 - ...relo_Provider_Settings_generate_audio.json | 1 - ...relo_Provider_Settings_generate_video.json | 1 - workflows/Runware_Audio_Inference_Qwen.json | 1 - .../Runware_Audio_Inference_Seed_Audio_1.json | 1 - workflows/Runware_Audio_Inference_xAI.json | 1 - workflows/Runware_Audio_Minimax_2_6.json | 1 - .../Runware_Basic_Background_Removal.json | 1 - workflows/Runware_Basic_Image_Inference.json | 1 - ...are_Basic_Image_Inference_ Kandinsky5.json | 1 - ...h ago sirshendu.ganguly_Z-Image-Turbo.json | 1 - ...Runware_Basic_Image_Inference_Hunyuan.json | 1 - ...nware_Basic_Image_Inference_IPAdapter.json | 1 - ...ware_Basic_Image_Inference_ImagineArt.json | 1 - ...re_Basic_Image_Inference_ImagineArt_2.json | 1 - ...asic_Image_Inference_Kling_Omni_Image.json | 1 - .../Runware_Basic_Image_Inference_Lora.json | 1 - ..._Basic_Image_Inference_Midjourney_I2V.json | 1 - ...are_Basic_Image_Inference_NanoBanana2.json | 1 - .../Runware_Basic_Image_Inference_Ponyv7.json | 1 - ...Basic_Image_Inference_Qwen-Image_2512.json | 1 - ...ic_Image_Inference_Qwen-Image_Layered.json | 1 - ...re_Basic_Image_Inference_Runway_Gen_4.json | 1 - ..._Basic_Image_Inference_TwinFlowZImage.json | 1 - ...e_Basic_Image_Inference_Z-Image-Turbo.json | 1 - ...age_Inference_allow_save_image_output.json | 1 - workflows/Runware_Basic_Image_Upscaling.json | 1 - ...Runware_Basic_Image_Upscaling_P_image.json | 1 - workflows/Runware_ControlNet.json | 1 - ...unware_Image_Inference_ seedream_v4_5.json | 1 - .../Runware_Image_Inference_BFL_7_1.json | 1 - .../Runware_Image_Inference_Bria_Fibo.json | 1 - ...unware_Image_Inference_Bria_Fibo_Edit.json | 1 - ...ware_Image_Inference_Bria_Fibo_Edit_2.json | 1 - ...mage_Inference_Bria_ReplaceBackground.json | 1 - .../Runware_Image_Inference_Captioning.json | 1 - .../Runware_Image_Inference_Embedding.json | 1 - workflows/Runware_Image_Inference_Ernie.json | 1 - .../Runware_Image_Inference_Exactly.json | 1 - workflows/Runware_Image_Inference_FLUX2.json | 1 - ...are_Image_Inference_FLUX2_Open_Source.json | 1 - .../Runware_Image_Inference_Fibo_Lite.json | 1 - .../Runware_Image_Inference_Flux_Erase.json | 1 - ...Runware_Image_Inference_Flux_Klein_9B.json | 1 - ...Runware_Image_Inference_Flux_Outpaint.json | 1 - workflows/Runware_Image_Inference_GLM.json | 1 - .../Runware_Image_Inference_Grok_Imagine.json | 1 - .../Runware_Image_Inference_Highres.json | 1 - ...are_Image_Inference_Ideogram_Layerize.json | 1 - .../Runware_Image_Inference_Ideogram_V4.json | 1 - ...are_Image_Inference_Ideogram_V4_remix.json | 1 - ..._Inference_Ideogram_v3_upscale_factor.json | 1 - .../Runware_Image_Inference_Imagineart_2.json | 1 - ...e_Image_Inference_Krea_2_medium_turbo.json | 1 - .../Runware_Image_Inference_Luma_UNI_1.json | 1 - .../Runware_Image_Inference_Openai_GPT_2.json | 1 - .../Runware_Image_Inference_Pruna_Image.json | 1 - .../Runware_Image_Inference_Pruna_Try_On.json | 1 - .../Runware_Image_Inference_Qwen_edit_2.json | 1 - .../Runware_Image_Inference_Recraft_V4.json | 1 - .../Runware_Image_Inference_Refiner.json | 1 - ...re_Image_Inference_Regional_Prompting.json | 1 - .../Runware_Image_Inference_Riverflow2.json | 1 - ...nference_Riverflow2_provider_settings.json | 1 - ...Runware_Image_Inference_Riverflow_2_5.json | 1 - .../Runware_Image_Inference_Seedream_5.json | 1 - .../Runware_Image_Inference_Ultralytics.json | 1 - ...age_Inference_Ultralytics_InpaintSize.json | 1 - workflows/Runware_Image_Inference_VAE.json | 1 - workflows/Runware_Image_Inference_VTO.json | 1 - .../Runware_Image_Inference_Wan_2_5.json | 1 - .../Runware_Image_Inference_Wan_2_6.json | 1 - .../Runware_Image_Inference_Watermark.json | 1 - .../Runware_Image_Inference_layerDiffuse.json | 1 - ...e_Image_Inference_nano_banana_flash_2.json | 1 - ...nware_Image_Inference_openai_hazel.py.json | 1 - ..._Image_Inference_prunaai_lora_support.json | 1 - ...are_Image_Provider_Settings_Bytedance.json | 1 - workflows/Runware_Image_to_Video.json | 1 - .../Runware_Image_to_Video_Kling2.5.json | 1 - ...nware_Image_to_Video_Kling_Omni_Video.json | 1 - workflows/Runware_Image_to_Video_Ovi.json | 1 - .../Runware_Image_to_Video_Pixverse.json | 1 - .../Runware_Image_to_Video_Pixverse_v5.5.json | 1 - .../Runware_Image_to_Video_Pixverse_v5.6.json | 1 - ...nware_Image_to_Video_Pixverse_v5_fast.json | 1 - .../Runware_Image_to_Video_Pixverse_v6.json | 1 - workflows/Runware_Inpainting.json | 1 - workflows/Runware_Media_Upload.json | 1 - workflows/Runware_Multi_Inference.json | 1 - workflows/Runware_Outpainting.json | 1 - workflows/Runware_PhotoMaker_v2.json | 1 - .../Runware_Text_Inference_Anthropic.json | 1 - workflows/Runware_Text_Inference_GLM_5_1.json | 1 - workflows/Runware_Text_Inference_GPT5_4.json | 1 - ...Runware_Text_Inference_Gemini_3_Flash.json | 1 - .../Runware_Text_Inference_Minimax_2_7.json | 1 - workflows/Runware_Text_To_Video.json.json | 1 - workflows/Runware_Vectorize.json | 1 - workflows/Runware_Vectorize_Recraft.json | 1 - workflows/Runware_VideoInference_LTX-2.json | 1 - workflows/Runware_VideoInference_LTX-2_3.json | 1 - .../Runware_VideoInference_LTX-Retake.json | 1 - workflows/Runware_VideoInference_LTX.json | 1 - workflows/Runware_Video_Age_Detection.json | 1 - .../Runware_Video_Background_Removal.json | 1 - ...e_Video_Inference_Alibaba_Happy_Horse.json | 1 - .../Runware_Video_Inference_Bria_Eraser.json | 1 - ..._Video_Inference_Creatify_Aurora_fast.json | 1 - ...are_Video_Inference_Google_Omni_Flash.json | 1 - ...erence_Google_ProviderSettings_resize.json | 1 - ...eo_Inference_Grok_Imagine_1_5_Preview.json | 1 - ...nware_Video_Inference_Happy_Horse_1_1.json | 1 - .../Runware_Video_Inference_HeyGen_Agent.json | 1 - ...Runware_Video_Inference_HeyGen_Avatar.json | 1 - ...nware_Video_Inference_HeyGen_Avatar_V.json | 1 - .../Runware_Video_Inference_Hunyuan_1_5.json | 1 - .../Runware_Video_Inference_Kadinsky5.json | 1 - workflows/Runware_Video_Inference_Kling.json | 1 - .../Runware_Video_Inference_Kling_2_6.json | 1 - ...nware_Video_Inference_Kling_2_6_voice.json | 1 - ...Runware_Video_Inference_Kling_3_Turbo.json | 1 - .../Runware_Video_Inference_Kling_Avatar.json | 1 - ...unware_Video_Inference_Kling_Elements.json | 1 - ...are_Video_Inference_Kling_Multiprompt.json | 1 - .../Runware_Video_Inference_Kling_o3_4k.json | 1 - ...Inference_Klingo3standard_Multiprompt.json | 1 - workflows/Runware_Video_Inference_Luma.json | 1 - .../Runware_Video_Inference_Luma_3_2.json | 1 - ...o_Inference_Minimax_Provider_Settings.json | 1 - .../Runware_Video_Inference_Omnihuman1_5.json | 1 - ...nware_Video_Inference_PixverseLipSync.json | 1 - ...Video_Inference_PixverseLipSyncSpeech.json | 1 - ...nware_Video_Inference_Pixverse_Modify.json | 1 - ...Runware_Video_Inference_Pruna_Animate.json | 1 - .../Runware_Video_Inference_Pruna_Avatar.json | 1 - ...Runware_Video_Inference_Pruna_Replace.json | 1 - .../Runware_Video_Inference_Pruna_Video.json | 1 - .../Runware_Video_Inference_Runway_Aleph.json | 1 - ...unware_Video_Inference_Runway_Aleph_2.json | 1 - ...e_Video_Inference_Runway_Gen4_5_Turbo.json | 1 - ...are_Video_Inference_Runway_Gen4_Turbo.json | 1 - .../Runware_Video_Inference_Seedance_2.json | 1 - ...nware_Video_Inference_Seedance_2_Mini.json | 1 - ...re_Video_Inference_Skyreels_Ref_Image.json | 1 - ...re_Video_Inference_Skyreels_Ref_Video.json | 1 - workflows/Runware_Video_Inference_Sync3.json | 1 - ...unware_Video_Inference_Sync_LipSync_2.json | 1 - .../Runware_Video_Inference_Sync_React1.json | 1 - workflows/Runware_Video_Inference_Veed.json | 1 - .../Runware_Video_Inference_Veed_Speech.json | 1 - workflows/Runware_Video_Inference_Veo3_1.json | 1 - ...re_Video_Inference_Veo3_1_FrameImages.json | 1 - .../Runware_Video_Inference_Veo3_1_lite.json | 1 - .../Runware_Video_Inference_Veo_3_R2V.json | 1 - ...Video_Inference_Veo_3_Video_Extension.json | 1 - .../Runware_Video_Inference_Vidu_Q3.json | 1 - ...Runware_Video_Inference_Vidu_Q3_Turbo.json | 1 - ...are_Video_Inference_Wan2_2_Last_Frame.json | 1 - .../Runware_Video_Inference_Wan_2_6.json | 1 - ...Runware_Video_Inference_Wan_2_6_flash.json | 1 - .../Runware_Video_Inference_Wan_2_7.json | 1 - .../Runware_Video_Inference_Wan_Animate.json | 1 - .../Runware_Video_Inference_XaI_Grok_1_5.json | 1 - .../Runware_Video_Inference_xAI_Grok.json | 1 - ...re_Video_Inference_xAI_Grok_Ref_Image.json | 1 - workflows/Runware_Video_Seedance_1_5_Pro.json | 1 - ...unware_Video_Seedance_1_5_Pro_draftId.json | 1 - workflows/Runware_Video_Sora_Remix.json | 1 - workflows/Runware_Video_Transcription.json | 1 - workflows/Runware_Video_Upscale.json | 1 - .../Runware_Video_Upscaler_Topazlabs.json | 1 - workflows/Runware_Vidu_Video_Template.json | 1 - 353 files changed, 2769 insertions(+), 26781 deletions(-) create mode 100644 .github/workflows/publish.yml delete mode 100644 assets/image-inference.png delete mode 100644 assets/video-inference.png delete mode 100644 clientlibs/main.js delete mode 100644 clientlibs/types.js delete mode 100644 clientlibs/utils.js delete mode 100644 modules/acceleratorOptions.py delete mode 100644 modules/advancedFeatureSettings/__init__.py delete mode 100644 modules/advancedFeatureSettings/wanAnimateAdvancedFeatureSettings.py delete mode 100644 modules/apiManager.py delete mode 100644 modules/audioInference.py delete mode 100644 modules/audioInferenceInputs.py delete mode 100644 modules/audioInferenceReferenceVoices.py delete mode 100644 modules/audioInferenceSpeech.py delete mode 100644 modules/audioInferenceSpeechVoices.py delete mode 100644 modules/audioInput.py delete mode 100644 modules/audioModelSearch.py delete mode 100644 modules/audioSections.py delete mode 100644 modules/audioSettings.py delete mode 100644 modules/audioSettingsVoiceModify.py delete mode 100644 modules/bgremoval.py delete mode 100644 modules/bridges/mainRoute.py delete mode 100644 modules/controlNet.py delete mode 100644 modules/controlNetCombine.py delete mode 100644 modules/controlNetPreprocessor.py delete mode 100644 modules/embeddingSearch.py delete mode 100644 modules/embeddingsCombine.py delete mode 100644 modules/frameImages.py delete mode 100644 modules/imageCaptioning.py delete mode 100644 modules/imageInference.py delete mode 100644 modules/imageInferenceAdvancedFeatures.py delete mode 100644 modules/imageInferenceInputs.py delete mode 100644 modules/imageInferenceInputsFonts.py delete mode 100644 modules/imageInferenceSettingsColorPalette.py delete mode 100644 modules/imageInferenceSettingsMoodboards.py delete mode 100644 modules/imageInferenceSettingsPromptEnhance.py delete mode 100644 modules/imageInferenceSettingsScoringRubric.py delete mode 100644 modules/imageInferenceSettingsStructuredPrompt.py delete mode 100644 modules/imageMasking.py delete mode 100644 modules/imageRegionalPromptingAdvancedFeature.py delete mode 100644 modules/imageRegionalPromptingAdvancedFeatureRegions.py delete mode 100644 modules/imageUpscalerSettings.py delete mode 100644 modules/imageWatermarkAdvancedFeature.py delete mode 100644 modules/inputAudios.py delete mode 100644 modules/ipAdapter.py delete mode 100644 modules/ipAdapterCombine.py delete mode 100644 modules/loadMesh.py delete mode 100644 modules/loraCombine.py delete mode 100644 modules/loraSearch.py delete mode 100644 modules/mediaUpload.py delete mode 100644 modules/modelSearch.py delete mode 100644 modules/multiInference.py delete mode 100644 modules/outpaintSettings.py delete mode 100644 modules/photoMaker.py delete mode 100644 modules/providerSettings/__init__.py delete mode 100644 modules/providerSettings/alibabaProviderSettings.py delete mode 100644 modules/providerSettings/blackForestProviderSettings.py delete mode 100644 modules/providerSettings/briaProviderMask.py delete mode 100644 modules/providerSettings/briaProviderSettings.py delete mode 100644 modules/providerSettings/bytedanceProviderSettings.py delete mode 100644 modules/providerSettings/elevenlabsProviderSettings.py delete mode 100644 modules/providerSettings/elevenlabsProviderSettingsSections.py delete mode 100644 modules/providerSettings/googleProviderSettings.py delete mode 100644 modules/providerSettings/klingMultiPromptSegment.py delete mode 100644 modules/providerSettings/klingProviderSettings.py delete mode 100644 modules/providerSettings/klingProviderSettingsMultiPrompt.py delete mode 100644 modules/providerSettings/lightricksProviderSettings.py delete mode 100644 modules/providerSettings/lumaProviderSettings.py delete mode 100644 modules/providerSettings/midjourneyProviderSettings.py delete mode 100644 modules/providerSettings/minimaxProviderSettings.py delete mode 100644 modules/providerSettings/mireloProviderSettings.py delete mode 100644 modules/providerSettings/openaiProviderSettings.py delete mode 100644 modules/providerSettings/pixverseProviderSettings.py delete mode 100644 modules/providerSettings/recraftProviderSettings.py delete mode 100644 modules/providerSettings/recraftProviderSettingsColor.py delete mode 100644 modules/providerSettings/runwayProviderSettings.py delete mode 100644 modules/providerSettings/sourcefulProviderSettings.py delete mode 100644 modules/providerSettings/sourcefulProviderSettingsFonts.py delete mode 100644 modules/providerSettings/syncProviderSettings.py delete mode 100644 modules/providerSettings/syncSegment.py delete mode 100644 modules/providerSettings/ultralyticsProviderSettings.py delete mode 100644 modules/providerSettings/viduProviderSettings.py delete mode 100644 modules/providerSettings/xaiProviderSettings.py delete mode 100644 modules/referenceAudios.py delete mode 100644 modules/referenceImages.py delete mode 100644 modules/referenceVideos.py delete mode 100644 modules/referenceVoices.py delete mode 100644 modules/refiner.py delete mode 100644 modules/runwareBFL.py delete mode 100644 modules/runwareImagen.py delete mode 100644 modules/safetyInputs.py delete mode 100644 modules/save3D.py delete mode 100644 modules/saveImage.py delete mode 100644 modules/saveText.py delete mode 100644 modules/settings.py delete mode 100644 modules/speechInput.py delete mode 100644 modules/speechInputCombine.py delete mode 100644 modules/textInference.py delete mode 100644 modules/textInferenceInputs.py delete mode 100644 modules/textInferenceInputsImages.py delete mode 100644 modules/textInferenceInputsVideos.py delete mode 100644 modules/textInferenceMessage.py delete mode 100644 modules/textInferenceMessages.py delete mode 100644 modules/textInferenceSettings.py delete mode 100644 modules/textInferenceSettingsCache.py delete mode 100644 modules/textInferenceToolChoice.py delete mode 100644 modules/textModelSearch.py delete mode 100644 modules/threeDInference.py delete mode 100644 modules/threeDInferenceInputs.py delete mode 100644 modules/threeDInferenceSettings.py delete mode 100644 modules/threeDInferenceSettingsDracoCompression.py delete mode 100644 modules/threeDInferenceSettingsMeshCluster.py delete mode 100644 modules/threeDInferenceSettingsShapeSlat.py delete mode 100644 modules/threeDInferenceSettingsSparseStructure.py delete mode 100644 modules/threeDInferenceSettingsTexSlat.py delete mode 100644 modules/threeDModelSearch.py delete mode 100644 modules/ultralyticsInputs.py delete mode 100644 modules/upscaler.py delete mode 100644 modules/utils/runwareUtils.py delete mode 100644 modules/vaeSearch.py delete mode 100644 modules/vectorize.py delete mode 100644 modules/version.py delete mode 100644 modules/videoAdvancedFeatureInputs.py delete mode 100644 modules/videoBgRemoval.py delete mode 100644 modules/videoInference.py delete mode 100644 modules/videoInferenceElements.py delete mode 100644 modules/videoInferenceInputs.py delete mode 100644 modules/videoInferenceLora.py delete mode 100644 modules/videoInferenceSettingsActiveSpeakerBoundingBoxes.py delete mode 100644 modules/videoInferenceSettingsActiveSpeakerDetection.py delete mode 100644 modules/videoInferenceSettingsControl.py delete mode 100644 modules/videoInferenceSettingsSegments.py delete mode 100644 modules/videoInferenceSettingsSourcePosition.py delete mode 100644 modules/videoInferenceSettingsTts.py delete mode 100644 modules/videoInferenceSpeechInput.py delete mode 100644 modules/videoInputsFrame.py delete mode 100644 modules/videoInputsReferenceImagesMultipleImagesConnector.py delete mode 100644 modules/videoInputsReferences.py delete mode 100644 modules/videoModelSearch.py delete mode 100644 modules/videoOutputs.py delete mode 100644 modules/videoSettings.py delete mode 100644 modules/videoTranscription.py delete mode 100644 modules/videoUpscaler.py create mode 100644 nodes.json create mode 100644 pyproject.toml create mode 100644 runware_nodes.py create mode 100644 web/runware.js create mode 100644 workflows/01_basic_image.json create mode 100644 workflows/02_image_lora.json create mode 100644 workflows/03_controlnet.json create mode 100644 workflows/04_video.json create mode 100644 workflows/05_audio_tts.json create mode 100644 workflows/06_generic_custom.json delete mode 100644 workflows/Runware-Image-Inference-Wan_2_7.json delete mode 100644 workflows/Runware_3D_Inference_Hyper.json delete mode 100644 workflows/Runware_3D_Inference_Meshy_6.json delete mode 100644 workflows/Runware_3D_Inference_Trellis_2_Draco_Compression.json delete mode 100644 workflows/Runware_3D_Inference_Tripo_FBX_Output.json delete mode 100644 workflows/Runware_3D_Inference_meta_sam_3d.json delete mode 100644 workflows/Runware_3D_Inference_microsoft_trellis.json delete mode 100644 workflows/Runware_3D_Inference_microsoft_trellis_meshFile_upload.json delete mode 100644 workflows/Runware_3D_inference_Tencent_Hunyuan_3D.json delete mode 100644 workflows/Runware_3d_Inference_Trellis_2_alphamode.json delete mode 100644 workflows/Runware_Adetailer.json delete mode 100644 workflows/Runware_Audio_Inference.json delete mode 100644 workflows/Runware_Audio_Inference_ACE.json delete mode 100644 workflows/Runware_Audio_Inference_Ace_Step_1_5.json delete mode 100644 workflows/Runware_Audio_Inference_Dia.json delete mode 100644 workflows/Runware_Audio_Inference_Dia_2.json delete mode 100644 workflows/Runware_Audio_Inference_Dia_2_input_audios.json delete mode 100644 workflows/Runware_Audio_Inference_Elevanlabs_Provider_Settings.json delete mode 100644 workflows/Runware_Audio_Inference_Fish_S_2_1.json delete mode 100644 workflows/Runware_Audio_Inference_Google_Gemini_3_1_TTS.json delete mode 100644 workflows/Runware_Audio_Inference_Inworld_TTS.json delete mode 100644 workflows/Runware_Audio_Inference_Inworld_TTS_2.json delete mode 100644 workflows/Runware_Audio_Inference_Kling.json delete mode 100644 workflows/Runware_Audio_Inference_Minimax_Speech.json delete mode 100644 workflows/Runware_Audio_Inference_Mirelo_Provider_Settings_generate_audio.json delete mode 100644 workflows/Runware_Audio_Inference_Mirelo_Provider_Settings_generate_video.json delete mode 100644 workflows/Runware_Audio_Inference_Qwen.json delete mode 100644 workflows/Runware_Audio_Inference_Seed_Audio_1.json delete mode 100644 workflows/Runware_Audio_Inference_xAI.json delete mode 100644 workflows/Runware_Audio_Minimax_2_6.json delete mode 100644 workflows/Runware_Basic_Background_Removal.json delete mode 100644 workflows/Runware_Basic_Image_Inference.json delete mode 100644 workflows/Runware_Basic_Image_Inference_ Kandinsky5.json delete mode 100644 workflows/Runware_Basic_Image_Inference_ Updated 9h ago sirshendu.ganguly_Z-Image-Turbo.json delete mode 100644 workflows/Runware_Basic_Image_Inference_Hunyuan.json delete mode 100644 workflows/Runware_Basic_Image_Inference_IPAdapter.json delete mode 100644 workflows/Runware_Basic_Image_Inference_ImagineArt.json delete mode 100644 workflows/Runware_Basic_Image_Inference_ImagineArt_2.json delete mode 100644 workflows/Runware_Basic_Image_Inference_Kling_Omni_Image.json delete mode 100644 workflows/Runware_Basic_Image_Inference_Lora.json delete mode 100644 workflows/Runware_Basic_Image_Inference_Midjourney_I2V.json delete mode 100644 workflows/Runware_Basic_Image_Inference_NanoBanana2.json delete mode 100644 workflows/Runware_Basic_Image_Inference_Ponyv7.json delete mode 100644 workflows/Runware_Basic_Image_Inference_Qwen-Image_2512.json delete mode 100644 workflows/Runware_Basic_Image_Inference_Qwen-Image_Layered.json delete mode 100644 workflows/Runware_Basic_Image_Inference_Runway_Gen_4.json delete mode 100644 workflows/Runware_Basic_Image_Inference_TwinFlowZImage.json delete mode 100644 workflows/Runware_Basic_Image_Inference_Z-Image-Turbo.json delete mode 100644 workflows/Runware_Basic_Image_Inference_allow_save_image_output.json delete mode 100644 workflows/Runware_Basic_Image_Upscaling.json delete mode 100644 workflows/Runware_Basic_Image_Upscaling_P_image.json delete mode 100644 workflows/Runware_ControlNet.json delete mode 100644 workflows/Runware_Image_Inference_ seedream_v4_5.json delete mode 100644 workflows/Runware_Image_Inference_BFL_7_1.json delete mode 100644 workflows/Runware_Image_Inference_Bria_Fibo.json delete mode 100644 workflows/Runware_Image_Inference_Bria_Fibo_Edit.json delete mode 100644 workflows/Runware_Image_Inference_Bria_Fibo_Edit_2.json delete mode 100644 workflows/Runware_Image_Inference_Bria_ReplaceBackground.json delete mode 100644 workflows/Runware_Image_Inference_Captioning.json delete mode 100644 workflows/Runware_Image_Inference_Embedding.json delete mode 100644 workflows/Runware_Image_Inference_Ernie.json delete mode 100644 workflows/Runware_Image_Inference_Exactly.json delete mode 100644 workflows/Runware_Image_Inference_FLUX2.json delete mode 100644 workflows/Runware_Image_Inference_FLUX2_Open_Source.json delete mode 100644 workflows/Runware_Image_Inference_Fibo_Lite.json delete mode 100644 workflows/Runware_Image_Inference_Flux_Erase.json delete mode 100644 workflows/Runware_Image_Inference_Flux_Klein_9B.json delete mode 100644 workflows/Runware_Image_Inference_Flux_Outpaint.json delete mode 100644 workflows/Runware_Image_Inference_GLM.json delete mode 100644 workflows/Runware_Image_Inference_Grok_Imagine.json delete mode 100644 workflows/Runware_Image_Inference_Highres.json delete mode 100644 workflows/Runware_Image_Inference_Ideogram_Layerize.json delete mode 100644 workflows/Runware_Image_Inference_Ideogram_V4.json delete mode 100644 workflows/Runware_Image_Inference_Ideogram_V4_remix.json delete mode 100644 workflows/Runware_Image_Inference_Ideogram_v3_upscale_factor.json delete mode 100644 workflows/Runware_Image_Inference_Imagineart_2.json delete mode 100644 workflows/Runware_Image_Inference_Krea_2_medium_turbo.json delete mode 100644 workflows/Runware_Image_Inference_Luma_UNI_1.json delete mode 100644 workflows/Runware_Image_Inference_Openai_GPT_2.json delete mode 100644 workflows/Runware_Image_Inference_Pruna_Image.json delete mode 100644 workflows/Runware_Image_Inference_Pruna_Try_On.json delete mode 100644 workflows/Runware_Image_Inference_Qwen_edit_2.json delete mode 100644 workflows/Runware_Image_Inference_Recraft_V4.json delete mode 100644 workflows/Runware_Image_Inference_Refiner.json delete mode 100644 workflows/Runware_Image_Inference_Regional_Prompting.json delete mode 100644 workflows/Runware_Image_Inference_Riverflow2.json delete mode 100644 workflows/Runware_Image_Inference_Riverflow2_provider_settings.json delete mode 100644 workflows/Runware_Image_Inference_Riverflow_2_5.json delete mode 100644 workflows/Runware_Image_Inference_Seedream_5.json delete mode 100644 workflows/Runware_Image_Inference_Ultralytics.json delete mode 100644 workflows/Runware_Image_Inference_Ultralytics_InpaintSize.json delete mode 100644 workflows/Runware_Image_Inference_VAE.json delete mode 100644 workflows/Runware_Image_Inference_VTO.json delete mode 100644 workflows/Runware_Image_Inference_Wan_2_5.json delete mode 100644 workflows/Runware_Image_Inference_Wan_2_6.json delete mode 100644 workflows/Runware_Image_Inference_Watermark.json delete mode 100644 workflows/Runware_Image_Inference_layerDiffuse.json delete mode 100644 workflows/Runware_Image_Inference_nano_banana_flash_2.json delete mode 100644 workflows/Runware_Image_Inference_openai_hazel.py.json delete mode 100644 workflows/Runware_Image_Inference_prunaai_lora_support.json delete mode 100644 workflows/Runware_Image_Provider_Settings_Bytedance.json delete mode 100644 workflows/Runware_Image_to_Video.json delete mode 100644 workflows/Runware_Image_to_Video_Kling2.5.json delete mode 100644 workflows/Runware_Image_to_Video_Kling_Omni_Video.json delete mode 100644 workflows/Runware_Image_to_Video_Ovi.json delete mode 100644 workflows/Runware_Image_to_Video_Pixverse.json delete mode 100644 workflows/Runware_Image_to_Video_Pixverse_v5.5.json delete mode 100644 workflows/Runware_Image_to_Video_Pixverse_v5.6.json delete mode 100644 workflows/Runware_Image_to_Video_Pixverse_v5_fast.json delete mode 100644 workflows/Runware_Image_to_Video_Pixverse_v6.json delete mode 100644 workflows/Runware_Inpainting.json delete mode 100644 workflows/Runware_Media_Upload.json delete mode 100644 workflows/Runware_Multi_Inference.json delete mode 100644 workflows/Runware_Outpainting.json delete mode 100644 workflows/Runware_PhotoMaker_v2.json delete mode 100644 workflows/Runware_Text_Inference_Anthropic.json delete mode 100644 workflows/Runware_Text_Inference_GLM_5_1.json delete mode 100644 workflows/Runware_Text_Inference_GPT5_4.json delete mode 100644 workflows/Runware_Text_Inference_Gemini_3_Flash.json delete mode 100644 workflows/Runware_Text_Inference_Minimax_2_7.json delete mode 100644 workflows/Runware_Text_To_Video.json.json delete mode 100644 workflows/Runware_Vectorize.json delete mode 100644 workflows/Runware_Vectorize_Recraft.json delete mode 100644 workflows/Runware_VideoInference_LTX-2.json delete mode 100644 workflows/Runware_VideoInference_LTX-2_3.json delete mode 100644 workflows/Runware_VideoInference_LTX-Retake.json delete mode 100644 workflows/Runware_VideoInference_LTX.json delete mode 100644 workflows/Runware_Video_Age_Detection.json delete mode 100644 workflows/Runware_Video_Background_Removal.json delete mode 100644 workflows/Runware_Video_Inference_Alibaba_Happy_Horse.json delete mode 100644 workflows/Runware_Video_Inference_Bria_Eraser.json delete mode 100644 workflows/Runware_Video_Inference_Creatify_Aurora_fast.json delete mode 100644 workflows/Runware_Video_Inference_Google_Omni_Flash.json delete mode 100644 workflows/Runware_Video_Inference_Google_ProviderSettings_resize.json delete mode 100644 workflows/Runware_Video_Inference_Grok_Imagine_1_5_Preview.json delete mode 100644 workflows/Runware_Video_Inference_Happy_Horse_1_1.json delete mode 100644 workflows/Runware_Video_Inference_HeyGen_Agent.json delete mode 100644 workflows/Runware_Video_Inference_HeyGen_Avatar.json delete mode 100644 workflows/Runware_Video_Inference_HeyGen_Avatar_V.json delete mode 100644 workflows/Runware_Video_Inference_Hunyuan_1_5.json delete mode 100644 workflows/Runware_Video_Inference_Kadinsky5.json delete mode 100644 workflows/Runware_Video_Inference_Kling.json delete mode 100644 workflows/Runware_Video_Inference_Kling_2_6.json delete mode 100644 workflows/Runware_Video_Inference_Kling_2_6_voice.json delete mode 100644 workflows/Runware_Video_Inference_Kling_3_Turbo.json delete mode 100644 workflows/Runware_Video_Inference_Kling_Avatar.json delete mode 100644 workflows/Runware_Video_Inference_Kling_Elements.json delete mode 100644 workflows/Runware_Video_Inference_Kling_Multiprompt.json delete mode 100644 workflows/Runware_Video_Inference_Kling_o3_4k.json delete mode 100644 workflows/Runware_Video_Inference_Klingo3standard_Multiprompt.json delete mode 100644 workflows/Runware_Video_Inference_Luma.json delete mode 100644 workflows/Runware_Video_Inference_Luma_3_2.json delete mode 100644 workflows/Runware_Video_Inference_Minimax_Provider_Settings.json delete mode 100644 workflows/Runware_Video_Inference_Omnihuman1_5.json delete mode 100644 workflows/Runware_Video_Inference_PixverseLipSync.json delete mode 100644 workflows/Runware_Video_Inference_PixverseLipSyncSpeech.json delete mode 100644 workflows/Runware_Video_Inference_Pixverse_Modify.json delete mode 100644 workflows/Runware_Video_Inference_Pruna_Animate.json delete mode 100644 workflows/Runware_Video_Inference_Pruna_Avatar.json delete mode 100644 workflows/Runware_Video_Inference_Pruna_Replace.json delete mode 100644 workflows/Runware_Video_Inference_Pruna_Video.json delete mode 100644 workflows/Runware_Video_Inference_Runway_Aleph.json delete mode 100644 workflows/Runware_Video_Inference_Runway_Aleph_2.json delete mode 100644 workflows/Runware_Video_Inference_Runway_Gen4_5_Turbo.json delete mode 100644 workflows/Runware_Video_Inference_Runway_Gen4_Turbo.json delete mode 100644 workflows/Runware_Video_Inference_Seedance_2.json delete mode 100644 workflows/Runware_Video_Inference_Seedance_2_Mini.json delete mode 100644 workflows/Runware_Video_Inference_Skyreels_Ref_Image.json delete mode 100644 workflows/Runware_Video_Inference_Skyreels_Ref_Video.json delete mode 100644 workflows/Runware_Video_Inference_Sync3.json delete mode 100644 workflows/Runware_Video_Inference_Sync_LipSync_2.json delete mode 100644 workflows/Runware_Video_Inference_Sync_React1.json delete mode 100644 workflows/Runware_Video_Inference_Veed.json delete mode 100644 workflows/Runware_Video_Inference_Veed_Speech.json delete mode 100644 workflows/Runware_Video_Inference_Veo3_1.json delete mode 100644 workflows/Runware_Video_Inference_Veo3_1_FrameImages.json delete mode 100644 workflows/Runware_Video_Inference_Veo3_1_lite.json delete mode 100644 workflows/Runware_Video_Inference_Veo_3_R2V.json delete mode 100644 workflows/Runware_Video_Inference_Veo_3_Video_Extension.json delete mode 100644 workflows/Runware_Video_Inference_Vidu_Q3.json delete mode 100644 workflows/Runware_Video_Inference_Vidu_Q3_Turbo.json delete mode 100644 workflows/Runware_Video_Inference_Wan2_2_Last_Frame.json delete mode 100644 workflows/Runware_Video_Inference_Wan_2_6.json delete mode 100644 workflows/Runware_Video_Inference_Wan_2_6_flash.json delete mode 100644 workflows/Runware_Video_Inference_Wan_2_7.json delete mode 100644 workflows/Runware_Video_Inference_Wan_Animate.json delete mode 100644 workflows/Runware_Video_Inference_XaI_Grok_1_5.json delete mode 100644 workflows/Runware_Video_Inference_xAI_Grok.json delete mode 100644 workflows/Runware_Video_Inference_xAI_Grok_Ref_Image.json delete mode 100644 workflows/Runware_Video_Seedance_1_5_Pro.json delete mode 100644 workflows/Runware_Video_Seedance_1_5_Pro_draftId.json delete mode 100644 workflows/Runware_Video_Sora_Remix.json delete mode 100644 workflows/Runware_Video_Transcription.json delete mode 100644 workflows/Runware_Video_Upscale.json delete mode 100644 workflows/Runware_Video_Upscaler_Topazlabs.json delete mode 100644 workflows/Runware_Vidu_Video_Template.json 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 d83f7438bbf9bfc0d27dc08e1d837bc831a0c0f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 722458 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

@$*?H|X88~vR)04A2#w0}=K&5A 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 z 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


Sr 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℞&;H^!2|&=pfem}=F6^H2s0jy1sEx{h)y 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
ULz2<2?9EUo^}zE+21DW0S&wF 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 z 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

PEIe`vB& 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

bNG|OUNJQJS=|qn&(h}tvm=N*C3jiaXmHO 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

  • 0Hl0! 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%0DFM{WQ#CO;D*>OUwAhhDo*jV*mE?%yfv( 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 WBvnkl~uiP{|wnv|}zz6xliNX!~v$yXyBwsSy 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

    X21x z4k>l|$hPM@95Z+>lT^ji`}gHz_>B9K$Tf1=s-Vtz-vw)TBfvUFx`H6Hm{82ge%`{M z{|%J-JBTJD@Z_NP1XaTj)wJS`Ggd5H^j@Za%+pXYG|Hd6^@5im&JQTjkNn`7$>c?K!kxH3;$-=34g2wuyhy`3J( z?r7R+WAK|KDo}r%FZA)`lET3NNctp=hZrAS2DV%V9uI;{>L2`?8r?4(^GKFxJGi9idRSEU`VY4Pr{`+1wpJ$Le?;>4%>SbdD8@p1h8 z?8G8H~XReDmJk!zC!cAy_U?3}2( za?7>5W-PAc;S~Mebsqon!>G`6@i&|zcfPyrK|;__{wtrs{xC`JHB-ah19TJEI(@cW zjKpQAWI(7!yc@z2VePcjQ7IHtb%ZaYPr+}9U2fYx+vIQOeVQrdDoEhCuUz8YkSXp( z>cn>`#4K#?Pnt_&Z0tN5b!kv1CA$Si3;-y9)j4d_o@om#yL))728EfDYwf%3MUgy6 zovy+@-J7!4m1!0t^U#+9xc6sUB|R?eJUe|Or0uuofBf>sE(02>#MCG(4Lf{gG}L(e2bKvUF^nZvhe=cuaQJXx+~oAtgy zx<XoWG?=ns|%H3n@0_UwZw&w3hoi*HWwn+IAUY(tz`X8T1j4)->vb*tV^SOZZ6AE4Y2p(qTC!$W_2>)|(l&?UEMN?l~ zw0mW7Q*Vj!h*LBtA0eeF&p+Duf+Z^6INi0`=Jj4~LnIv4L?j#SPmBC#Tkk*ZEa3yC zUd%GLPh{)SzL_WF*Q+%;ViLDp3bWfF@Z}6GF?!Din#Gp$=_Lp~le}hZs*JcEN#D>I zdnGl^%7*RrwfyWXVGM|JIJGk>cJl}#t~6NA=K*_KUOz*+F;4J<9l2TENkKg_|?e{!!WI4ls9$w$Dxdde zsGkH1Ub57WAhCC&Uq4JYaBRgmOg2aRrKeu`=cUbZjFv6-$u>q#jsa90M}=zcgA>JR zJ{R&phBbS&ZZ{UwVZG2rQy=K>i1QHLJ1`V%t_nR4t$C_ObgDK(vx+UFg%hMZ*d_Ee*E;KK@N zhH^1CnYOKn)QO-7dY>x<)`whLc?E@B|LbahORMJKuwjSIru`+K&CKnmM0~@M8h=}5 zg#gf}^9x}JHN7hEdS`#>esM`C5SLGR{lL%5L)!DqJF;v&|I-8yOesis7mpXOz)IrynZdldao=CkN_J#DA zI2@@n%O;oDgNihtj-2(T-4^}aY3cAb-OX?6Ah&h8fqa-dw3@w5ResDGn=`*;eAKMd zocwnU%>DoO`vb7+`ha}AL-sa3$UO8uiXGy>4;{|7=CU6Q_gb1pZ^~T%%lUtq3yKsx zmTWtfJhr!aEEm?Wb|;KSHl}0j`E4}DZ)X41_PhwN6LGOlqDHb7mZmyO$B57nEtSoP%nKbyxwkgbOeI7DC5rI&-90zQY5xr@1; z+041!+enCu!+UyraGVsr{M6Usr1@DrrJDMxowCJfXQ8A(snhf`<>*ZGU#yVU9vWF0 zDa6jeDNKFh(2S2sHk0E5C7~wvcXI)%tZ!%pN)U^GAKL%y8T+b|W-)0J9>1gK=b(lh zg|W2-?=+(jg^P}oO6xg6n7R{$$bADCYVealW#G=)GEnNmYPYw`%0>QEg{8eiN$PbE z4!Tc@^iY-c%nM>1xBXI=N}cmVFLwX z@Hx-ntxkWI#1w>yRSF|GcPV87?f{1KzB8)#BSM{pV-+mzDwh`qRx(0bxXu_pl~`0i zf+!iYkKc%&N8Mc&-T~Y@q?GzT&9bkZ=Z#t}7Eo4eqwGe;LyGA1%0^MtO_Xpb?y?`a z2e9#8%h=EgUkQ3_*_FPk`BVMW{=%wAe(7XdRy4+W@9_o90_*nJV`VYlE4MwZxLL)f zbwwJ1Khkm#R9lwbaKi>@j2lWSt2-ji?6iyHJk#_ispO;=-c~xQ{AO(vu}u7^&~W)@ zAuZ33t$ngAS0u9T;56b+;9zeCoMB~!L@Q_Nji$aH-~0OoE)-sZ{TnO!caAB7mS0M> zy|+V-@+XeKwsD99U6@XgT@>WuJWL6}^m#ii(_m)PMMAcX1#xJVlKd&sGP{>D;(S3< z0WbtWDqQ>tPP~~RB0AqE(v8f3@Knfky;BjsD*j?t4%FZcC39?b(_kO1>ULqWE zl9>mbB(2n?J2(5+dA{-ZG#>2`Lg|aFMs2MqvDZBqr}5=05YdGk;9`#N+a5}{96&Ym zeZ6*y@JTN`k|^-7v6=zw`*UHu*ayFpu4DjGZ_5NE+9ll;D&#%-&hZcAHVn%)^`hL? zp4ArJ2FD#bWDnQL(@kHcc0CqPZxmzkc|Xu?qns9LFg?%pWZN4VQxc;dfdtg;W!7+o z-6o<;g$|BwJ@pn>C;rR$0biJHWt~G?79y+Vd+Dm~v*P7(w*sZLW^IW}j4#4JsU?IW za_sJ+CzrQrN~vfK*(m*gupKr>&qgdHD}(R)V=VU}Nr^r{k0@it@Wb)>zcKRWuPNuJ zi8H`Nr?i>}8xg~0m!Hz=55WXIUL>D;5!};*Z9eJ=h(f>pn0C1Wz6xMI&;tlzF$VmV zh1b%y1qHqKhU1UCB@(b?1`|A^j>d>MW3*N2|Dev_vN%D~GVqXA`L_O0ckLp7RRJa^ zfkh}q>YtdjzISnMH>Rpb&-!D#1xRZF8Iz75!$Uo@vc`w8v zCOTT42AFXm&{y=9DhSzuvVO+AqerrnsB7(fm=0^;-A7vvuz8Y807cnVqk9F-QvaMv$nwHlW-OAdy7v1uc%7rw4@b@aK z5v*xyhj1me`~3VL&SKc_|2T`ys0+WxjMlHp zbZnY;fgjFq;G7-eeB3g&Ko;id>(jF1!QnJW4+UkzRY?u2^stP z>1|XxL8Q-L#%jIaP6OGNsBM7`*%JocG^-I=rU7TZ(AOZ}o8>Zb1$m`E<&&mk%;!5_ zsY9+wMP`^X8tSP+NJMU!0p6RvfTXkZ&JPp)mQJ2r3L}c=rfx3?#(gf_2VX|DYTwl8 z=+eGZ8`XdkORb*M=|b(10(WUwsKg-;@(p&++#|@Uh4#w1`sgYrB<- zRa_`fVB+!&&lGofRuaG@u6z!>)W9s5;1$ zqO|(#rb9rc-eIZTy7+7@3u|g%%*rt3lW=XqL`yTkL0?{Q&y5z`se>gzA?nT5#-PLS zlE#Q)EgwHN43JKyUk$GmlE5{c*M09MfY#0afyx-=A^3H*}uy{Ph0W)5E$h| z!Xt6A^;Y+pjWBYWlPF&o>nzUK!7gP)^psSnCc+1)z3DumtFlW_+BJFkr&eJkcMV49gO8d&$zg1kNKKz2tMyM z8~mhOYy=+cOi*kO#_KFpb~ovGo{c5*NT)5@k;?Iln(7J-raSa1rlZy!Nb_S}V~sUv zg|as}Z<^0)>PRpOkHi1L85CYaYu!P;sh)q27URzwhJ=8*4M3Vubj`U%izHDJ;3KBB zupGuH7XtM^vgH>;E=_B`%1hTcu$;urrn9nh5=%=n$V~hM`iZWJN^cg!W7)S%_ou!s7WLp6@%_IOBWHjqn4~w&bHJ=D-uq)u5#bx-Sv}p)F|c{;5>dm zs}pU}17y10a#%}w0P#gSzHlZApEniTwuWdAEnci2zqR>xF(>#FPTzo@%`mArqNzN= zJ0su^1G#uy^y86wdH2*OEA|4GcNaPAwKX5&LqXDF2MTYE ztb`{j><5kwqb&a1k|?l*O5Z&uTm8Q+P1bR<)+6VA zw0wWA7iL>-nl!cTI{DbZ3a~DxCjoQ>x1LQMS&i7}$&%(jBh3cH&2SrPW4^%_$Uofa z&yd|MdnDkAGeC%fayJErb&44`d|<02wCtpEWSb0^D#>EcsH44=2kRWE^D8e_bq7UA zgwT*UYD`l+hYK`GyW(4pSDgmg+AR|@xGJb8RCo21PLQhjMx*3T)tg`Iqi+Z@hm;w8 zJat|i)17geDdzUun!ULt;(4&sJQ-1em-y~WZr7tpbW(rpzev5L2eewIcAi-8E^&J2T30}J30jFz_GPpx_0XpTMR^fU z6jxVry!J^Z3ybA#OQ+-!$D+hwvx1+V%K zyU*Qi%%8O#TiqOe;{HA;geZh>2v#LqGN7&;L1qvSo=e>W6E@-qUY%5XKBOR-(<-5q zWxOXIbU8dwOFD0GY|B#^=CPD=H#}oQuBo%CE0IQ5FrXY|Fxv2o@@3)`M2T~!4g9LCbQO~n4 zLj1fbc1<2Hjm-JdI+8d;&+}>*u=6L9@2z#SBV47H*e>Yqb1e;{W{2d3(3NW&aLQEn z2}ga7b1`P!?~kki>0JL-UChNu z1Mxui1|YtdQDI!}IT;bhSb*2TR7{oqD3h1bbx@X>&4bM^Q~U-W5L)X^ntiT;NQXuO z$H4q2=#NJbRFPV6h{{Nx@aN^+l>0A66yst`n&GvW%B7lUi`|hwWEb!Y(YKpd5W;pB0%C$k4T6+r}G6qckZf1mgvOhe%9C< zfN*nblQ~l>m$4MOCv%@J9lenPaW=mCAk;J@B1phK10R?W4-AQ0=Q2j)WoHYGkp>I+ ztF%{9Ni<-|wzvDfYw7yq4d1 zE%C7)1%wfeQb`+#CnY(e2wVsXebIDii`KgA6GX4~72Sr`d7W#GC3BSvFnr6Co=8*) zH3PUf`%L>HYu|~pUS5s+hD=3A0n!2yxy+8EGr)Fp7v{9Zjpq9@FJuF-T~}k^K2@Bd zD`PJyIirYj+~UbTWTMUziHx#DVoCaFNB5GI9w_9k_MPjG8;&QxX+c{R2lG^=uO;N^W$SCsuA%2D;FQBa5zr?v00^1lym+*59Is5ry zCiaCio2j+oN5F5F3r5S_iIU^TxZ@sy5iQfc928q*8l*FJwU&1Rlj>WQGP^ZpQTpN| zsDY2_&bcJYBh7oSFdYB3lqt~~6zK1vh-n8U(5F&WG3=Zjup~|rq&FO(M}uC|S23^c zCA6zx&$O<&vZ2LXl3b)ekx6p^Q zM%TRQyM5=cFQ6HTXd!4MYq8f^_PPx_4VL4PSjO($+dpzhH6x6XYNhtqQTwAmqs=!XpNMrW3Lg9MwnOD!@o^6s(kWWR^I%;x%Tc1D7MRPkwJL^r zh7p8;_Hpz(=EccLgYL?DNR@I%v#8~kaMnW&kg%FdAMLkDp{^m z9QvRJ-19y%r4Do54kan?AYlLUoAH+ukDO*;ov{e7s`#l#ttrzfewkcm1%QOjjW%w5 zZ;uJU045o8-C_H7Zh1I!Ov`P~T4pAEqb{KlMY8WPDzd1~cVTIeyDi$Qv8)W9io(&- zQKW0}agfgeC)s!$dKgl|l3ZvnT??{BupSB~k+M9AbqwpxeA(5N9>@CPcE2CboZYI6{@b{#IGiL)B^P`O={*d|TmWQIOs}#-lun>>2fd;&3SAQ6nQ*XGPVQ#5$PldMumq6Gr80s^5p-FlE~WO@S_ zzOvQinDqDsQ;SRR%tVi;Rq%;q-K#?*;kqPk7tBt*e*L)X_q4lK8Dp1PnEEP*lU&zO|yPZ*RTCk5L-H;4nCaw z*Q^b_tM|z6xVkG&7V>S~jcdKUye6XjCr`MjS+q&B7__g!J>;cZwYaNzm|RAr9RyyM z+`><{SlAq4as4LBi~F)^o{x`vCvj2+J73KcVLs8;;>+eB!++X&e%!AjM%F=Xr9>))6MifgwWBe4HEK1Wh(##-kHVPG{gzc(TUNbrwmvH|l11sT~}2LnAr2 z7GYxHvp8OQ>)m|(;)7JKph=(ung`qkr?l}S0BMl0MOCRvXdUGfXm1(3JNG@-9T~{% z3S=h4DplD7^yxfm=MU5Txh{mMkLjRwc#@Y&OSafae!61sD=fM@&;O^l2QSZ9 zqUg`tn?|IjUkrLX1|6oZz=S=@$;HKZ4L}P60E0vmBNz=sa{+EMXGawld`~Dz zdGT^I$P$4%cF&f)h?7P!=!yvqfUx_9dGKEu_m52|^^$(5?|F=z_Nnx1&@m%ECE@jv z{G`FQKrzyo%TxXZe9>-N5LOoHj;AP3VCU?we}|%;2|2hDgf2KO_^-JgF_gvDLW!%@tyKhE3NDcH1c_RV^8?$>w+H8LV2y5bSUi@P&vhXW9C!^;)ZltA zJMg$4I|NiO|n2*#D2vW;<+)HNCV@T?y-z=H6bTmA#t|smo(4#V;C21FG&ib)c zKf#DfxDc35z>xIChrzTTW9IGoEKSUq=QQ zNuojY7kHHw#U0=g0PRipBBak*v6hUl&Wln$?z+Q0i8+{?*t6Ka{Xt*us4&e*q-tu1 zdbJi@QVs!k{mAd&H7hocH&up(?-Xu%?XM8{7v!iO?VfanlePDyIR24RC6Vh` zZLV&~XUXnm!@!~%BAMD|TTWX9`hy?cj4{?Y`!EsnF@ThXDgy`XpNXOFogD z{>1HV?o*ZBdzw?<2Y*snD*l^@pwXtgge!9?blp*Y?Mhf8WbgusbK=Z2{d!tm5&&eC zM1mt$i+jsCJkYYT-@`9dO$+C_X+cZmH~9&zGhbzxrlb2 zXG2G$6u;SpH5+J{o|D!q-4N05HNhK~X&^d7#PPy;974xAWB2aUYv3}FeCR7+-Z^T(Bp;XN_Zoc@0~f_7`^5R)Y#F^gweXk0MNdW%G!t4nyI8(r0`R0ojCt@4or86dI!d-&pwT^>mRO=OL zCW-?p(&a-%k?nk>lZv73sGuqJqX1syp9Xg2*TqZdhqaeWm#Tm^FoA`#=+E?PZ>#qJ z*1*Jo@QchRL703({7Tx@qQ}u(FO1S7Int=5!eL0{-th^ut$^revLcsN*6`M$+0kIJ z6j8Q&biXzP>{mYBH`}MNe!8oPJWOoD&N2Iy-14A3f*^PcpD*6nBUXW$Ct@+4HQrRp z`;)YxpB~3kCR{wS_gj$;9#(E25gXgf%_8>4xu{1iC}c$N6s{U_TpwAm${_mMC+0U{ zJ_N5Bp^d<9(><*YQ^WIlE09Z4-rv%+!&_RPt5K0eh$PM%=PjEfa{eQh5aIbhu|&9BrMLFezTM`>@Oqy) z`PGz|>9+<(C$N3<3%$NG)q&zSPYe*gTSz)%F`VlaZYuC`Hny!;1ptHWkvTk$ zww!g+5vPrSuY8O;231>8?d$YqzZKD!O){r$CFE;L?adflB0Mjs_U zNJ|Bcy>wX9dGi5(&;$?Z-B>zJkPjawRt>Emu*#z?c37krPBKMQd^khCJrKwPMkg)gXmuh*l+>qV!QKR z7=-;x9ctqQu{&D0jwCgOIY z3x7KoO};UB5oqR><#T-VRmjzUOM~YPQWu`!hS{Sp znfl@bWx|y>R?mu1z8Q257UAK?0!CbRN-}?0OtLriYXGh+^3LO=m4t-{pl4}&wCS-p z%P-(V#aTtR*7P|;0vG(w-yovbLcmkl>7FFoHis|yS9$4JuFoZvP!E?K-RcGWxo#?P zz{sWhW__Ls|GoEBT&6|*SR*LD5TpbDx;M^j&``NYOY1tmCt7yBUveW%N=U3F z-3v=DlkRSqIAW}@K4K1h5#b%R#trdzDUHfAf{K55^sVq!OwPT#>8%k(ICOAzJV(Bm zk>HFamC&lw<=JXKnRpgqB=cC7D7@EAn8bMA1}_s;U58(qicbm8%1XWj=HWDSd4{oL z$t3a2VTX{iv)z+iK2M0>Zt(`H2dG|*qkr((8QRa>^vvUgojyOEcAnXj`lG`w$Y*%p z;vag(;rqWfPrW>By8b<`4Ssw2HdfK#mo|;O%ZV3(XMlLZEMoerYD<+{2ni*^A)Ja~ z6#d3pXwy{MJ9BjRuDd;dVtDM zB|h1mQo0zirzQ0e|6AQsTctL+Wxi3q%JwD5X+4$u=o6{TDWVrmefFcC*DS@Os#Ga1 zF0^S*vzh%k*25FHf=aNv^poTgr7xB4U->P1(rZ*KGCVwJH}di$fGu$Nm8xbj_{`#G zq-jYyi|pdygEl*CvYhbC1Rc|0CwyS_oVc!UTlBB^#ov}bO#|tiQvP_Dla^xpj9f?I zE-yVu_nFQ;D=)7i9(-5r6YDG@?wU$svR8Y&;0JV&)NCPr z@4(=t8u5Jva#TYW%bv>aEymP#Tsu!h^+7Y0ePp5a39Xc_P>W|BBFKoQye?B#A95u0 zORQ5OB+{(^rcWXTjr{4^B0C_A%mtn4UH&r#58ON(7PIuJ6&cho;u*d{ zOm`_U@wQ37NMkMT8eZ7yedk;)^8VjkYe@Rv(wyU;|Fc>CXQq2%LfpVT#I;&XI0khU z79>9ISy(dAc`tDp(5qEWLg_vMbb_iD>)F~EaGy3~udgEDC+Ok(sGqgvM7tUe+wz;g zwU>tjeTXx2V;}R;&@js9#&M(hqTo*jQ^-bRp@WHSeRD%RGChI72a(Ml%Q0V4)4^AO z8dV`~u~$Yj>!zDl4-`gtZG$Dti-3NtXvU^-j!3XS&K~MZT5Mo&K)J>ylRE!jsBodMlWgbVcTz-5mvXo!Ip*FxAUu?pf>BgMuFVp9i z0t7t&5JyX%h)MTN5;G7dA3&z;E%<&;M0B|C1rJd%Mkk4(f$ALLL%V|V9g$(46Afj@q;0EDQnziFYaF#*pM73I+g{@Pttf>(_2 z(cX*DDI%lPx28~m1r&iBNOR-9|G+j}W(Y-*dq*0WPu;piMWk&Y~2IwQ`~LF*oGx zd-(cdmJJY8qt$o8gFJ8Bkh~pBY_4*Go~gnUPu%kEaq)3;4aUxRp_S+7{eYR7nI#r{ zF#t9Ui7CDFlS@K*0n))tk}0J-=gmcc1a-)z_6?_qyBTv@n%PkuJ{1K|UNVsypv`;$ zR!+q_@ig=jP74$&AvJ&;0=V?#OQeNwPJZj(Y#`gbq%eFR+PJ2UFD@w%YdCPw_S!l} zR=ukkj&jaw&Uub%_|ko*4|YQ3qP==qJ_a|5aH1Sf+Lz8mdykt*Hh3*DAkn(bt7zQ> z-ugVWOz_$-$GW8-g1Z&~K++(q5}nPKD3el_IVJAA)tRvbJfGL(616J$_`D z$O3b$%#t)QKOyJ28%j$!A15bqgYCTD3Yh)S>XyVoRjFyW`uaj(zkeV04Hjp8^Up~5 zE7QvFQ6z>v`Lq||OUHe#Ig~wl*Ou+uxl;K$nq- ze+W;MV?5)omf}H<7r79Lo*%it&|M68H;9&p9PuUK)+@c@;^!%rd-R-4S$PRLM-)7s z=e;IrB|wMvCw zPYhj*>dyLVs7exI+5Nk}8(;x1j0xw8OW;HY~Ozwclp z4$qIqwkPe*dm$_268f&A+JmC8SgWHxlPkgVUc*nbO^J&vYND6(=?{C?N``?FT>ygbOs@4fLm+Qfa23_T=-%ZmgxS{fF z96hf}J}K}pw0X%Bt?3}8!M zjCcD0VuyQ8hx_5^yrZdt0*C!S*z1wP_PCGIL9=ftcF-bAnIj3MSrhmjqxD>tSlh=^ zk{N0#N7i3SR8d~+1kX63pt}ODLcZ9uS242|et1E`%ZvR5iN@iMfVR9R)0aRhgmagdYbT1o*SL3vYx`sVDqM~7Sz$9QWzu{0U9 z@Px9u<)a9sL)|}i$$EC(>L7->0uKgU{DKBl8dQUnXhg3vxF*2mkzYECY3GtHRzF{#+oIe7Dcg1s5RsdN+-B@&iQ(2EfyGhJY z&lc27N_|`7#AW>;?jXszRZMG4VG1Ennx@Tk_-lc;ooZ*pzay+B_qRFy1xUonH5ZM2 z3H4@~c=mH0X1lWXqFunbHT+J#qxUXLv*2sJwPiKOQ<=`EcFqb9i(RzQw?cR>s)t7; z;RHBigtl|aBt!QBm^0T+u_Y=6vr`#P_l+a+kdLI1DzXJ_g9Z{NPEK6DwQ2MN$wFbf zxkq6VY2B-oh8$}Jr{4TGjNjG-g!HRT(`u0{cW^EqlAU+#clcj`oJ9a(id3<*{3X`qnBCE!zm(z#ego*lre+ED9p;^B4Xy zed4J~dsenSHPDrAtgyxRoWze4NzHf0?nqWyQdyCM_1JzlJHm6wq_sutabHPx@g-u7 z*vq=m;%dUFlrSU!Yi?x;ZHP(!k9*AVaa!_T!HeK(Ivo|jR$wUU>|cd~f^BqLb;shr zQjCzs^n=ipwda=0@!{h#Q-K*iXN+D?dRs6?qgu%U8rH{xwr2b^ED8PeY+rB$K z@vJk9OgWFLN>@AXU{I9JOH28)Z05}&SpoX>apO%1rEU|ons@*QQu2VI9!rndB$-S~ zJ#%vJjaq7H#c}OXUdzREK2&Jb3t9H*#m<~t32+V`qpq8_rFU9?b^n^fkZ3DYf`Rk$V8IM`vkmIk~u{zroPvoLKDdjsOS?Tq&zZX+{!gY?{6nnAx zRZa`Zh+6y7nQl1@nNjh1&C3?Zwo#L0e-^DC`a>0Xj-X5t?GP#&ln`v_q^Dz=8;C&Q z9&TLg?6T$@G+u+bc1s^V7h5R0DTdgiqHrF?A5sEB9#vcjo0ahDN&x=tO7Z0?L?$ z!_K}}VpnEid^0L3WiYc2yq^8oN}MFZ0;Q~o3qga^!3)1VAid91N&~tNtc%crXHGl? z#5_b^0;6y$XD8%tg;PJU3C{UEBDn>hfuqC;?b7P#i|iAD_yhCQyCTElu9^6*BhL9e z>JB%^A2$euc-#eSicdp=S+HsGD{m}eEV~O=po#>m}Mi@-vCs;tz$T4E zEp$j&N3H%iYZY#3pYxEyonwGCR|+^HBc`B z0}NNAtUETy8;g-lq|Em{0+VmiqI(+VEp06Nq!(%YsM_f9%d#td)oxz51>-4~y#r)Z zQbe*C$DW1Q_KERK;f_t<=TBobV&>9c|4PBp)xezu$mJ=r1-+Lt(CCY;p>O_vUgNRa zBl-6hiC$1rA+O{1=Zi|gb72U#2*VksCcg^?fwMX~ICNNEk^MkfNpvjQqv>dC`0A%V zjZ3taH%Z<1SXH3>NUo{R@%nLXOkN&|1!cLIQ*0<9!%--1a2gPz>`D z`^5Y7JdL^)DfTdHS3NNfjc~^=8C>7c=%c3E_SF1x~{bNJC-%H(Wv|9sUC%9~+I! zFK-VRtovFI6$q6E%v>Kxx;u*b z`k?oYQdEdE3X`dyY!Y}>7a%h5muTURK20FU)uEZ+cSFx64;eWlRuH zO_^C0nPvN@9fZcP_J*#nou`cN3h1J-%iM3&FF!>&GgP#s4Swj z5caRS?bz%bUWjaX!$?p$eAg=|WIxLjP?gH63g@Y{E!jl4h<~&N&{V!R>a&itE*U|& zK=HuI+h1`^<>8-iELEQhw5DO&aj$U%zy0*}6jX79;%_!v=l8%mRwSl}ZTrbf-Umad zz|vfmq$M?x=I{CqN|mUE&-GRVCbPg!ulUnB#+i`a{c;VGi{WhtNy+s#=i*oDg)pP+ z%+$x+*K?(~i&36@OKTa=ce|V3#o6hpr9-}lWcL>B}d`B&%#KwPmZ}b!)pQOI$moomL53I%qqGo%;lawk!O;AC1sv};>{b6p+OyP!s(QvPRcBFaRdw)J z6LGIQ_l%zCG&fAg*{d>Y{lR)%QwN5)C{S!VRk_2@B~t>NDriCc^Gt0z-~>H0Jug^3 z??TCg9*jMtbT(3HVR|jabUP*~f)IA+&KptzzIN&Y^`|!0kl^lVhpR3vtvRhIzwn#O zQ2UbaW6tzW6>ElC`rzP85^!*%eJgPfDIQ*`WZ-g8=j*NI%25$?nlXxG(H$;b;xC=^ zMDzLrP_ucP7wk#^yRA0RaijF9k(+?uzB7p8b8QYp-nj1p2HpuUFLUZ zfuB3n+X0eQ2tmpFnH7wYU4Qk$uP!R+yJ>IdeDW!>4Qtyi>6@+0_rCl{fh+-jyujEaUO|uUIF>7tA%9)%up}c4!j~kqYqC>yT5T# ztU@1b4h2{e0lbj-2##70+AC)~LLDOQ8Ghui5zw9uEE)q|63Nl076U1Wg$<%%Fu?u- z@S>}8`W@&UX&`y30Mgnkk8chD;$KF9tjZV0B8!e!tiRp-IqZ*|#cTjWIT36Q1ee)k zcobWIrC-iaj1*HGv60HrFOWZR0hqZ2Q)K{jP!3M##331wn%Nq#$k7Ma6k`zI$Tm^= zM*_y@HRMHF#*|xaB8e15UdmcuJ`q#qfcg*x8??IM*_S`eFNnDWkH-YfZ^@nX*o4*- zNNPJLUOT7;JEU(ZF69rLn5CCxq2w_`2Ur2EE;36tVJUCUWt0821?2r}hX|S5;*Mj( zmt%TVWb>o>2Eb~BmQ9fwEq%WT;$EPJ8-ac-6#%}dG9nWjf9J6e243*sA%pBSEIKeU z7adNGK%|Gb!dsk$fFxei=iNNbvO$-&IVtzG_Qp;e#fcKT4sG8+3d5q+EX+A3^NaUD z24cC_u#R~Tt+eK#$9J=R(=#94+kI2-MXa7WNTFgK0~-bJ_@Vny^K+B-rTE2BVi!;K zMv+(BJg4%ParDqb1 z4sDF-@-y_JwkVPFt?6)B{ndbdeEX{u&c!OdY!zEN+@Ur^e4-d%42t8RsMwr-i(K`$ ze*snwjz$rDvTZh%dT;!UNrYx;+4eActKw7R3h6;fWg9s34dpL-;0>6iERZS+|NfGZ z^s?%53cU7`#csL9ptOYAi}n3Pi;jEtU51&*66v%oA{hg8BiO*lw?*p49UW+tpbd&( zpVFTsY8DRm&&pafvJ=Qbj)&V#zf1IuP(YcCI!97rg*k zov|@eWzk(vwh-{6$lraq&Eklq+A^@m_o4Ukbna%qu147FUQZ-fq^7p`{cgS2d-SsF zM;qNy(Ew^Buva^vx6<}N+!c|9eu?KfrqhrJ@M!QtOon~qu`MA7;gv&Vh)N|>9yAq@ z?(;_9YpH$^={%{s9334UFoE~ZN6WDOliuLiR<&pOh4lj+hGmkpKbk*5DWy=IIi}Ck zWk%F2kw3+(c4)091joh1?hhi$)-iH0TLfBA%T1UhXIbZixbjwgX7`KLmI<7Zf`$6h zqVO%}T7^C~5aeIZU3Z%fq)J48|Bl%<*Qr7xmrh+3L471CIH5E6)6s4qOJAU+t;D8M z9rTQphs1otXk_(mXG-k)D`;ZTu90_!$oWDiwM2A8VJE_dEbYK@G$YK^eJSzLQ=zHl zO>=*TDjF={y1E;sf!^nBD;N2Ks%)!KfGtXIm36QBj(fx({4lSM`mdo+7KS&^4#t4rLJk6{*3YoLo)qhqmNo-^J8Jf&un><>ET&C`zMao^*XPTucg4@IZa zDP6t8s?e%Qa<-e@yE_@P1{G4WV{$}RAw*RnXa+M-e0O(hL;S##Z385j5MxIS9b?Bv zaMZD=w{!;LE%T-}78YOq^7QnpRVC~`{Uq4XzDcJyzq(~}b|H7>{y)!|SGt9IGk)3s zQfoVH#9r7$hWrPMrQ_P>)GnMB%w*Q4s_cf`OpK7Tg9`b11|gPdib!>HF&&y8hj zx16Ucc;n`GUAw*&h##z>#S&mC%+Zn1N2$(CEFGz*X$T+C>?{_@kCa#JI*U%J(ha2N z=N2Ym=#}l*a~D@+lA5V@lMVGH)ff&NZ2>@7NkaN$cZqHj^VmZTob0Xk21U*h>&L*{ zyjn)RWPQ9xy2tg~<5-Tx9cgjA`$U6=ckUy==ifaZ??GJm2R4V8gN4>XO*Y6!x*=95 z$X3Ncmp-I5`d}Ifu+nu&(5|95F`m*@ht^?d3|bjI3l8HDGcB_cMFX8)2kqO=d{T5p zDuO~H3qz$<8bA+)UlXz-%Ebv_BLawm=N29W0jHv`3CQC$+;MzZCQg+ctSap|s;_e= zWKb7g=k4c=Mc*?m$zvzzxx5g9(s^_mbx;b;1;t_{IeQWH5+QRWA}IpX6y7@*u=>90 zBX~23JpE3%lisew&g8Dk{z#@(i#|NfBCd&K1Uh5|fC%`Hok#=bYUV$;0vD0CU5` zGyZB9CFSwptzFVou% zc=*$e#m#vpGE95Q!lCkw4~nxf^cLbHG5&P!8=hgsI!(~`cf~_fW_mwtJeod=AIwK* z3h6J7#T+SZqjw+^{3i01ZsL%r>v3y&)JifGk=>jAD1b(8ogEZN;&6C2M^jH)&e>u3 z3SgIKG!YSjPk2upx_mDq;BCfw1w1Q8Zc6Cytc_&}gm-j7IW<^2Ef?o$U>itORTk`tlPlC<{#>?gnf}*p0BgDsW_C6PQ*Oxi1 zRNQ!xBf>eq$E{x?KEKYYo7~2F$NhI4w#GO-UhO&_-2|_5LO&2Fbhhx0pT5Rf#8Nz< z037hKj=zR3kh#uJEQGiM5B8*+UjYIxp~)+8l9c zlF@ah?)Hvg^@~K+^dkiwpG>xR=(DMe&Z~?_Z{-WSUiG5oLk#QqEALLbIJ^)QEkCj- zkH>TT&!j>InoDjolXrH)lxc}z1w&Crb6Pw#zrTvR1>m$pq2YSXZ-5w98aUxvdCQ3J z@#2#qe1{2HGEUt{uD4E}0j|OabD!zu3;z-N+MTAYPLt|Trx%g~8QVWBZ|*(~puyam zP@D>kd~S|hV|{1hs@MoW@#+wiI?`4`uWAe46zb{fdWU1U2O6;RLy~z)Pcor`HD(42 z5s18?Ijd~FQ?*--A9Z}7+8wr-5)*ZWAG-x1=8>~*un9froW`zc&H8k?X#S5Pp>G)bFLcMt#2=biN`*bk( z^Q!QP;_xWBGS$TJPPST}XtxQSp)9`o4*a$}9@D z1G#$K{@aI3u*@=+5thbZ7%1LTN!<6U!EyBw_FlBlZk+0<*Q0>s^69KL<$NLil z-ljiZBc?ZhmO@5&-emMnhjG=pvEA6~lOiyn!`nt%eSBDnV6CcduM6unD*$ZTCx)Ve zLdHro*TgCeCl=uw)i-e#YPmj=F6-i4Lie4KL7|I1Dz7Yj7AWa13w#^;yZ5Kwjirj~ z@lfvc z_6M5t2a)UUXSyLE84e|d|0AjzDjEraV*bWnt3%`x!(%6u*qp+GO+W|Sc?%o@(6kFv zv8Oc>;QgE}!IW({sSIQj2qVaC`icy+f^~+t3M{S@{pJ4HNA|a z634=rA$hgyqeI;*@P4g0*}<3WdE<2^DRgjRz{&j?U7X<64+*11k?%Ode;eHdSc~o6 zDUUuFaBbd)qSXrq`1l_!Lje^z>`F>N0)ii$FFQ6moc5@`q8~v~QB0%dfRSrFNJhWv z9XOZVW&@2WEfonhq*!oL{f#M11b8op_1EWjGtix(?bGEbYkjdZ#ar2LuR=AhqGiG6 zb7o_?Mhjb=2&*J7XXqped+_qjR}d97Uhop24TwkM&7+sS`Gz+>@yM6Hw_ zhn)0FNYT;;EWz~+BafwdY_vt@r|#E7Z$Uv4Y~R31#&%qk_HPq$diOttlIJ-`T8^~X z?x+JYl{Mu>{vTy$+0_Qywdo|dTd@+{T?-*Nv{1ncE$&*1yA=o&DWwF8Q@pfDvEZ(u zxI=Mw30B-E_w&j#Gizqens507$-YuWAFN=I=Q=cxoQFeB!Ih6SYAUm#+B*}_crn=TvW0BzTE`(Kx zxukNnw}59Xf?`loucxFVG zri7W5hQdAGQJa0~O*hNjHa4X8u@8Bs&)<(}7y~^xaKyn>K3P9V%QRqTOki|l8;7J90cq2yyaA~rq zaEhP+LQM>&{VYB=zA$9M?!dt;*}v{R7fNr&)kg)Wk7E`AF3txP;Es%PP7pQfD{m%^ zyn_F3VQ}jNy5V1c+j0UP1x52$)%CTw+@(n9d~z%oDAv``;3XktB5SjwJ&G$C&U7~k zeZw~Ko|$AjSUud&yakbDsQSUlJWNKJK}7z>nx-WDoSlPzXu3wzY^en4hR)-VC5(cW3skR1ii zm9x6a&DvJf7bPxLIQON3hy24%>ux5zXMiFV9=~oD>?6&-4ZYvf(`xp}g~+|CTP^~~ zyCH54UfoUS144)ckWhR!T+Qh&gblQhsMj{&=KO4zoo-3SzLZ6YZHRxs_RMaNp{9g6 zMDBJa3*MGJWZM1W?~nV8C}OYfmO$yfYnAFXz1s!*Wc8az(2@GaEc!Q^hru`uUxxgL zM?u7WHuS+jef1EkLc#8&V^;f)WBTESmi*gSaKU$G3v7)intA9~Y?C`R+Bc~pEqlfn zznl3G*4ak_Vzog`(7qB2Z0TD`0g(Kp^vQ*XKS}R>tUZ6L_=Q{&MaRE zl6ul>Zro0Aa*Fo_ukRKe4O2sj_GYKgem!aMSpjX$CYO=D7QRJtv-f4fSRJi>JlMho z)jSh^ADa~Y@T@42&y_6Xt9iYMu3GL;z45|S%%}yF@14Du&)_@omb*N_-IVm+vT!9V zJ4PENTOS7=UIYs6mUsBN$UVDqOmhRxCQosnJX{-E5O9~(d*7i0Lo^TQG8^V0i%&+O5!Y;={HtmWsE-|nR$2ZHdsYFgBV(}OdYgl zX2U|>@|WKjnRbsTTcyq%V%Bhu6sd8=T;PJNX0s0Af)HM_wfpi6_UMg9_CZ~jqh8Le zFV}y4u4S5~!k5#{3Si|GY_Y?VyhY-9Eq7}4)3wZnRXDVr;j113v(GWd>uX zjFu+!oqW4Sz;B+Rbq8$5+)IWzop%yPuieBSwlmkA_v^rZ$}PZm*H-ha&SAddR{yym z{nrpWR67Wm!jO)A@;FH_h;;N6ar>@MxAnyNsNagjMM}Mackct1^n6^w_(QU2ly?Pi9Vsw9AeIDD0AMtVMWFMT3Sujd<{8%uv z^*M35__TPy%0QuLXtsSAnFrH48mtE>yE2Kj({wzeC0%<$P%19Q@cc8VBDK}pvcAI{Fng*?RTjn@eFm{d_BFxS!KekS{9p&?PS6W z%UXHN+tYyc3a^%B4+sfmeJ=mKtW_}FasrQQgrjZ@MBs?SgxUXTUxY)E(uPd^$*fNk z{ZZKIj|A5CBq`y1Q1viZ9iB}bL!8mv_fve90SLD z6Vu<$g;TD#4&?CR79u76p$w+9ZWyr}gsj}z%1<1AYknauNa4iBK|lIp!A*R~q+m}{ zb7PF<)q%xHI$8I&m~A56FZ|`(z7`&p!Gh(%?wp(!sqmuHpG~Twn~QTmCM_@Q{OG$d zq1oh!3@?CL-qTOdGpg3vrDf>yN{dNbsxV@yZP{}eW4>JczWop$TD8;<@MFcn1~#gg z)AYG?(tc)~icPfc;!8C9g{Zl_AIUZ6^iDCv20!L0CE6^suTkLo!>c@C!-rHF7qqec==VOK@cM;WiXIJx|AON~qy_{^aK5dCTbk9|0D)Qj6bOydDvptfhK><#!=AXGurzXc~lkmVw^qp{Ap2}V)@64$!_DZ7^ z9e>Yz8`CccUH)1*;^*v`Udip@S&k4*^0gF7V7&dvi38a2)3=Jg?__J}V9s!ucW>~r zE!?^_dDU1K@dOo+^v1OQ8?OJ&``=3*I&>m#78a|Ixt4D|^5}L4<2Je9u>+XuDqF7I zhzpvb&$FyYXJS@3usp1gKE$M?E`0PS&|&%|zcOPH+j>vW$t+2Cv}Mdd=We$`GH)wM zBVe~RvMpgtiyrj?N5>01tN}ft@V7rqnWQwMc&@FSaa%+7oD}v-1m8;^^YP-%;)RNt zW_RmS;%noXF4^?lCC5EyQ1oUsIp5JwSuhe2zT4{+qEu7P6@NGFb@)L#GecL@D-D+8 z{?d2(c0n_+hO8Ak=^ELqKI2NHQ{`-Q!lwiwIg&QoEm!Aa`V{UPud3^y;J zGvi``9?~0>(qsUyJFAj?$D8fkm~g>>okJQ+3}3jbtQ_UVvA~qr&D#YJ3TuhZegDN1 zmnu?}9ToT!M8t$97=vJBIR^*) z_k3)KbLrPF(01#YkQj8iyZaw_eCD5wwr>L}F*l6?l9@|b@t9vR6DD$@aoqMY7aeF- zHF8V#qQ0&yaSl3Lm^~>u{e5>ddF@JzBN)xBi6!kzn?l09-UT>z2QYss0^e^=hdi|K zCf`h)gx37HP5KdWI&(3R)u1hV5$zafRC8P@nCgvIoL7|G6!^WB$wHMgM{br1WOfVLJoaUSviA}hqiTqxcx4@n(%9C|YGX*{rz zKy7_pgWina&&EHXJ9-uge%@r=oi}IsM>GfMFa6DJk@KzWc4_k4a+kxDWh>Rw)*;bJJQz?hLN z-LM$q-Wt`iSy&nQrTK3CRxeft(H_6%4GgD5f*rDf9opFI7oM8~l5MRl>UYFo7c`tA z9YEwG^o7-Wv+t4baneqZ=qbr*n0orr+w= zuUV)h{09D1b2)7|kUDl;+O=f8uOGvLv@4DiEj*O10X)Ssz$JC07;>TV(pHb4&sKJ? zG#eGDDA!R>^mIy$#4T91Rr-Rrd)7u1CsReR{F%%AZx6)p$7362v(47IQ0jSX>Em!m z98wK=ZJl|ly=vfdEsJ}QQ~1<8a5*lT1Hpb1BM52vFy%_PjQ#HQJG&S+5nrng<^rI| z1pE_LD*+5r(f0Zg+vfV{i!R~7WQBsoqX)M(4rm&YM1hQGO--NcOrQr<5iQ&;xrQsQ z9$Bi*T~+JkJS^Y!o>gN;q|L?N-qvc2wyUBe9%Y{fCEXXaJg?4np9wQI4mI02@pI)5 zc^6V6`FCeWY!Jh!XMjR%l_`WLxiaK!Ja0HUzQcFwouF3~n4T)K=oZ?JiPn{V-h(`C zsmv@@Q$(v|M!yE0{}CH%Nz}xwL$y1>RSDy>O7LMgpCZ(B0B@tF!+ghQfl28ml#>Qw zOMS2*Yv9v$iKq6u^V3#gz3 z2G#=e{z@Sz`pp|c@6G=#_!USM^O1uRHIuG56yBbn&9kV61dr%5{h(wD=FzZlH7RcufIWE5iKss2x5ORQhc_-vV<(7G|v7*a#!-%a7kv=Arzgm$rTvvwT~Wh93CH*K2h}u-Rn_@feEOh&ODn4@YALI z1u8T7g4YNDc61fxSRvr4 zRsY?S_m%d}47w&W9w39EndED&!}B{)xf9VTl%l2q)9@4cR*+vs>D^^q&cpqMEua`y z)eT-smfz)+J&rUxAb%An7d|?7gQR2a#~_g=RR9Cu?fIiRBPm9SiOzV0Yz=`jw0X1W zY9Keg+k@#E-HS{Ohxqf*Zu&V3nLUC{0vf|xr-1Gg=^unIf?66$tSkNIPri!pOTKI~ zu_>C&&-@_YezJ(J=n=aRuCMb>w;wBmzS{1&v8UYdAim+hDLe$L+yse( zX>PXz8yCEr4_3OB45t!(23>+AUj75e|0fbC(TLqtcGU8#)|;t#peZKe^|9UEr&p|} z)|)p48=1ZA)Bj))KmCg4`}Y$IGkqtZhko4%V}5(B|LbeghI0-2?a6k~+3E|nX8!s4 z>s`t62}_~-*Y{fw7eNGV6BK?C4NBT{OutwCQaTibrSV2IPJ`##;t4 zy8MCq36zX-1E`4$DymeJ;iixw_WOo~MMSivKPOYa(av}5t@DY+( zltpX0Rm@m%4Gs*rVdJlitV9Yyq#q#@dV6L8E`}lrZ1PI}ba1t4$;!}LX%{mw4>IC1 ze-}u)q#PYb%o4eJMgVh_HwK_>nj0`SILse9b0yj0z4l{g70=GC!bqBe%1%&dJi1aC zr}9_z2-#4UB;CPg;cW>O$hJeiD314)>U+HIzMSKaLJ@>BHtNze!4O@4|3=I0b`C(- z=()Ma_{Yl6oJez$s&<%x9(UNrvyLY~kMyio@^5nh_iwJt5@efr%Qn#?5os{j&BJ$2 zJfR0vZYaDy09#dDvOT>Jo+3m2@g?z`?I&q3$Nf4Opio4mXc=69DfH}>!lxX{n$IXf z`4|(ob21Ad62uh#5dwp0woh%DqbJuPyS?R}W=LrGG2ZssdB^+r!yO1(>@nZ>)a>cm zA?70YzaXd@z- zU`RhVT-_hq7ACOgh5#+lOUaH5ovTt-J<^wLFPOBj;~iRTz}--UAy(OT=STvaGnAW|jBknDq46SEtjW8^XCGK)Ess0a^IXf=(EAUerr zIPqe5^F=-z{v=sD<6WzzQigfl2>O_ZAg$4XC_m@#_^31Thl=UX?^h@5hDLbthyysi zRGVL$Dwl^cNB7Y-;KuRm2M_DEwM;~RgJd3`tS1x3YZ+4AC%eWYMbBlWbd5I`1S+a9 zy!JuUHMKx#jIn@+tC=3N1skW4r-l8SEDmepXd>%>Ag7k%VTKJoWc~Ve3xZLhtnoOUx0;>1x{^J_T7H-^y#IP-f7tFazR}K)&o) zY%_wH7*A{jCuFT+hZantma%jx#sZyE#;u4lrUa%I zX1@Whxqm>pT$F#`yvAhw3LD*TgeMtz$%U7k=|YL{j7CY9vDTk-i_u1SCSsD}*5{y@ij7H$dF(V#=ao!&4ZvWiOR+ z1n1QhbG)=eDK6j^-}RNKZ1I6^;O8d>mXQcYEs{UFWdw81- zt>X>d`UXa5(MK6-V8CiBWLFEv-T%azvikU8oHd02XEO489rfX=u^5c<#@zP4EXcHc%UrJ}~72t>GGc%#dD zU)$WHwl?94==eZuM{bYWegqk*UJNrc?$hSSIvA-* zxho+4{N4#BuBbv@s?9M?EdS+`QoWrF6eC~IxIJ=-VbfKs<~&qrafxbjs4VpOV+1-d zgrO(ep2v%TZ{j}l8E!np4LbSL-9c=AagF^A$Px~G3Rry!Qa4;@w`VyuRoMoSX6UnU zGM*@^(^Mi67NlT`=7S;&@cDXc#$>2ceZH{c zK2nMWxj3L{GL|$z!YmZG9@i2z_6Q(^strtc=;J?8r!pjl|=BrPp#q_E|v?@ftq z)5BUw5Py{_0NnHFJF7Zl5p2lOaLS;;%9nBD&)xEb)mM9__oP8*UAgu;b02yZku`*e zk)87{D?grX1^!X@2I^biI|2!7%54f*q&xgbh-24c&*sB34FDd4K!D`1qP@S*=1gVr z4#$@UC%tTAA&#CqZ6mBxF#fRY1xQ>3@S3oTfLQCI5*mM3SZT18mGcVgej>LOFVLx{ zWj)0#wK$F{#qG{GH1hYoE^ssr7w3J8lw4V&nFdR8+Yk30Yzf)}3{0v5OJ`}1hq=^R zU(#CS_)^x#yU%<*a?#DLSxbJ1-^oJ)U9p)giTj}i`}?d*V5XECjqohObe=YwsAU$B zn%Zm{kKu=6k~YyLZ+Cr$KAp)7YeM(XPUG%yYe6alapYGe3|J_APDTV!T*3<}D##y3 zpprLaU%LzCGEceHas1M6HkCV_a^NK$STW-AG3y(CA&jL;S=!&vuHe2ir9CkHQ z-dt{@A#5aKc%HKH0V(-8-7AxtxV^xT)!W3|nRfu%@rZn}63^w*QO=b*$G*35iUSrO zOpqEaq+nBjk?y$N-w0=nBG%97E;V<%HSl*fZhb(+4INGvZscVr36GuW&-qxx)>sA7H=z=YGtLmpp({q*bGQaQmZwCF~IUh|l zd)E3`m7Zyi1pW!@4!DrmsCZhx=8xT}r;-E@fPT3%_;#f<*er_I=DKF-zImy z!n>o`-2~8fJCJH=)mPzc&BB@j^ZqF>BQ7;=OlQS<`bcBanR9AzXsC3%xYihC=&{`o z9V=}0Ru9ZfPsc3yI{1^ptmLHavpo-tQ$GKLNRUXq=p16nXYrGtxwD(eyRL)UnqRMj z`mVNf<*1bcXOk-+@a(+htTxSW`4z%%cTvhm6Vloui8i)nPvxH?+U?^5JY0;)n8-e8 z3jn{QruH98+-S#y2j8~duN_*st8k(eH{*BSh*y!2le^Wa}s7}s}XR)%`lW2gSIoq-2?TaLmxkS9)q%<{dry*vyy`)g{8h}vxP3+xYk$N z8YMUiy4kM@#W0f8IWdw=jbbP1>`l>jUmx5-MQWXk7oGP76D7y zW1kMV$ndsgoKN=EUOsmrs;AbD5$Uk%u}gzH(sfg+#z}75Zn!e`Kc#S?)I3S?+WJN? zmM=Mdubp-M=5oMRmf}L;TXMrF1E%&uBUzQjBEytTm1MAj=T9TKyKy;s1`O1jysE_m z0$Q(%Lrhp=`$=d3cf8~N@b!Jt=kB`$*Z%%CcQ4hMlHB-#GYYYnd)XO%R+LO%_US)1 z=kuSr3R-yJIj$Z)tQ`6><%=%zHr7_P-v052`yVz-fKcbwWGIgzJn-4&AnrtA)OqH3 zPVNKkq@&bq*xoM_qnQ5%sp!_nFu7^YrZNQakSWS&Mu>+jK^33Zgg+=M~vqOgN*RG@ug|F!cejdRyGsR+MKlPD+W zbK&>Z@l^-asFVNWl4gEe8+3Gt1ZyN@)$LQk%0NRq*6B~7OFhBpD=zuDF8qVum{SrS zo*om}NN%VI|7r{B4|NT{2xSM)iH82AqooCf@`QLMV~;I>2yz#IT26aYqN&GN#0^0l{GiiHMDX>)-9FRn()0Pt>Y?7{sNqYkBlS z`EP9{)qAb2P@TS7f4D!>HUE63BA_k|VAB`jeHBW>>amEnZ8%xE8B~WoOLw^_cLd60Y=%@X)fgNJO48O<^XhLeW@y)jgdK$$g zCu#{p%VHiFgM5m7sD?U$d=*s<5c;h{+ct|JEOXOk?^u||(h&`1%hCO*K0*$- zX!W_IbQM5lHj~u5LZrM&!;0XL?z?XK&q=n?DRRBnrX+2Y?ydodVKM8odnjD0x4k>*8s)$1 zaKa>gf@4BaHsD$quPte&er!tHIRD$%c3KC0=K@zztnIH{ekEq_%<&_=1NL~wxD z9w-5XhrHz{gYkd_JTaa+ey0X+!)z+vc=s0BF7VtX=6P7yC6^ZaMtz2{1%E-KU-a~Qz;po>YO>i5o39heR<4=EX2PYE!jA|BoPMtIzgW3bB+e~qHPg6qa{{{oZ-vh;eoeQY)YK{XT%`G(@ z4erE>`B?HnTL}42b57^R^%V*!pB_bgAoT~g&Y&fis_cN!!XX1cVk??GacX5uadTX}BqP?S;fO1T?=I?UExXV&4 z0r(~~it*8OMR}49&J2D>GN`4Ogv^B~5OHa4*&7WZbtZwkq+qj52|zutINkqx(EH4C ziIo+3EWKa<2BwxhB#fH#3si47Z8XbcioBa!l)PzViZn~!cNiafGBXS>aVptrZ1v4d zn0YT%mNwMBw6Aep})2rg(6D4Jb z0f&VU5+xseuHS*u$nPXiSBwqUphR4k+Hz;wWCefyzeQB^O+V69D~0*o^Jv-#?-AovL|KjFW81SfIRy$JhJ&}vd|mkzV*e7%2*{+ zYBwK4ZOlIq$mcb?_}MQGPg8vgquX+p8<#Vdv-ZJ)iB&;W4-*`QxxsZBMrj`N;-KJN z=3X0PMo_|R&S$Kqu7}Ol7RY%H6@cmi?!ze3RR&&bw&)L%Zoe`bK3eItr-*n9dGTi z{B^s;hkwz3QcMf|`?@PTi%zX)&Ccq-{hRL+{)MQE{2RFV|2A&q#;*z9uLV(u`|wPU z_%wko;+-fzsw9^rPOnQw7FVs^VvB&N15+o zz8hGm*^fVl`9rTHE}IE-#-ape7?r!iT?Hh?09f$K(yzfZP=t&rZU7=NDJdU`?M7wL zXx7&VWodW;JsQ`1I?3t-~olF`WHDDJZ>;^>S-dK82LJZgMT1%&v# zWFY0l;kC1siplJQx$DaWKXMi(lniea7GblVIRj~xIut+an!F;Q9wjQqfWeQCF?zzs z@pKGiO^N6MO(7~@%Q3UDWR>)~q|NY{SmiYtaHxW*T(ulm^!UmJ_RIqvX}2H2RI`&@ z2jwPb#)D;C9%WbaOn(;hl~)vm7y@L}LJ0zPCd6`h%+GTk_;*pW5_`@Ea$<_~lfX8e zyqPhuUsOxB^Z>twtT>RA@-N`shX}Rm#;C;^0#L>v|DO>Y?Xf12P441^6q1H9SFZTn zCT3i23|tlQ7VZ5Sibj6G`%Sk*mz%Gz+gPW;Y3}Q4_BbDgIuN~&$uM&*-^_xk%zvF* zXzvSkSZyjyeLfl7?{gb5_xI$Vj-Zv|cTXV@H$dq|Fb66)5F$vrbO&B_`@Q9L6cTpT z!&t1&sbx6-b$tS6hBaZ0)Bx~N*YW{M$fWtOr@iA~ei&w3teM2RXR$R-ui(i9ka+og@A zsS~S@ombyBt4M~eDgiC}4p`Pj;bN@17nvDgvH+!dp1FZ)fDRT9uxOD-jVB9yxH^hw zP0M0}O5ehb0s6qVetUa7Ej&l@2N&jTxT zCb5|`5Slfr^GoS#lc^8KhKK85h+@iH#kSEhfE>uw9c*8A*txPd9uKuM7Bod0IlTAn z>$wZi(`tc~YYm-_fo6E-1)`1i1X(xpTi+>6NRh41O zTYhu(3?MP+2G$0qih7nT{T9#kvapiHFO`iqI6L2xyVU$B3o5xHn1W%ZpxvfT?jpya zT~0X~_bohp-+5WjqniWoD2Fsk)L2VKqZ@uESNzH)rn$6Jz#dmrz)c!c;uettQ@3is zY}r|HmK9oPdjLKCQ^r1{7J1U-nW2#>vwqB0#$@~CtJfNi|Og-5Z}L6 zm;bbb7f|f^&wB%#$^y@dj@_$x1rRSXxgI_IXz1JUyIiREbt3!mYQ@UX%$~@_@io;H z(j~)0VvuuBue9i#d*r(9jwJL@`ij1kWd6@+a?RJz%r->4yz+&ra83lzHc!-_77EQg zLaKJX?h$p=!`RO+zYEndFRgY`_eP)8vZb9Ax+-Yz*%wiDdj$6F8Qr3qWHhEDyuLf^ zDjiKD68hdrDJZ%3`3{^Y7--+Ps1DQl2YYT*X592$4=LP`b5&~S{|Ko*aNV29@~kqY z_22nmX?zp+`W^9luVuXO>CZKTB^=u(Tg0?Vh56h~Mf1sDqqU1P`huv>4c8jl46x>~ zk;*~P{(SaP?el-zFvP@;)^dRd%t!SohdpYh-B)2^!p;_U0M7=Biq`t~ul-9Ln@H4t z`}h6tvr6hP7Y$pWm#ZWRw=WWwgBeOP?q$}C5;rtMtyBR&|K~`R7z|on8}pxus+^;r zOE-)_O_$;}COdo9G6Lc=d}hKYI`rI=g>6;4EE93+w}XQgdWHhw92UJqUx-#=)6wP} zWkyZl$(~lPe#cr0ol^EDpH0x!fetVqyMyMc@%q}oV?u2C?Xa0%njtXz8|%QT5YsgF z07K@xsTJVI=NyLc{LaDFKbSP5pWS6lmkWbB_;v7}OsP24KLNj?hw#4=T9v2m*wM~M zW*jzg4mdl8s)P5!Cq##J@#;??8ZU)PsBDsvot?s&%YTG7wI9;fVWQN1>UBQYpXa=I z<&BB6;kSk#0VD&WII!`lCjdH?Wo$Dt7jtWRTVd6Pm#H5d_xL!}|L9~A%Zdooeuh{N z8cwR+m(#+aS&yhvq-!B`0s?9gL#~R+U)75Q<;XV$K&3z@zTzRkV|b`@z#$*;)TYap zjLa7a()$g%{Ekt>2p|`3Wn@qz$)<%V=L(t4Kw@VVUQr#v<+S2K1NWw@>w8*&kY&_c zT+_OC?Ug&^0%X}tMkuQ#P~UwMZ+0_rL-~D-dbM$f2PmmsC+-=-JVjMLiC<9x+lj}P zI!_VUHFnu<;(;al(X~0R2C$j{aPc6-M|qIqdr|;OwOAw=n7;b{`R4P!n9^q635$c= z&uP_%0woM$3FieQ_J^~CvCk;=OuThtg|BjXn5ZGLz5x|=b#alnpD>^wMah@(%)IFG zYt1yJ)^vJR>Z(T-eRMKAu%FvSnoVHe716cJb^P!IH9az)8GH+5cl};zmH2tcuA_{& zDs&WsUZ{s~v;iAt$EA@m`*yPcnF;pnX~2GU{P*hThz6vKjK;t)bWLnapUl662_wG4 z2^bBuyTS3uvsE9Td{14mT!#S}3pQbAeoWgIg-xKMAll5~(9ep77JI26$WBH?juY#2WeX$_g!!2ICCS` z0#SNO8jeSoY;gyAuUL7btCKWyBU8)_U}QdbJB=51F+{K<_nlmuD0PI2B^5j-U!Ug>Xv&EFnmZl$Y5-B;G1b*9NpuDwP5(eE=I?V~0dD}*FZ*Nf&%Ito{ry2=3 zI9euk-(6jg3sX7i;BQ>Zk#dTHAFdax5t~l^%%lU&{c+RQ?5EiYm!~x)C~$W$t#HFs z!F*yh=QH31&(Af@OLd@B5TO+ksrKkHHPs@1m2m}K!D{ii-Mgg%YjWIB{ul!uLQLZM zb{3Y#ZM!Ad3J;*2}n$@wjlcdqC;pB-2fNYAW|O~dQJ?3}sFDh-S-=|7aZ|2CQ-X^QoMY-c-%G17mZ8!;-G z{<;uLJ{9O$_5rc=Rrl7b$~5SR)J;Uge*C^itE*NU(OuuAEq@{bn?Y9{rpmsS8$}PF zSbYVwoUBh}4EInmi)zB~@P_p6ecYCk4N|7Af9pHs=rmE92t)CZn( zv&%&DLVg4q+qPRyEe+o5jJ9fXk;y-`%URYyG+8 zcBKtB60R7xIui2d?9*Ir8_tvVtWV=swEz4(c{K7C=Y{S8;}(bgUW@kv<4j>-tz!l7 zB2PYw#@GxJkj?q{dx!0*!a4?sb`nvBW)rVt52sUNxpA- zRfXfIV>TWqFC~|S&VKE_@OO(Aud{u_;K>AYBts>PmZ@7kYLH9NH8ZXUvkrxwowv9j zLT$4|5hLzDnWgxx8B(+aYrLhmVqcD#U*8)X+Raa0-(9bvH5*O2cXD*Zgn_5mo6(2= zO>zA5;m9-x`yYKp>u$3FzqQe+Uj^f;NLN!GOOb!&@3W~nMd@A zjyZ&eYMd7W%aP_>)XCIH=D&r-$PU`B*9HAK+)E4srYWD>7MEQZ<%a<+uHgI7A~Dp; ziH4lgNV^eafMRd&r$tIy7V8u>yrHN*Tihi*Vd}HFnGY9KV$lb)x=L#MiZeTVMx z7xP2-QXq>ohC3Qn*QN7qFfd;#83}}hgLy)KhCQ1-3|}b+g7tL)*JiW)1K~dt*H}nvQ_JWWei5)Nu?oN0KzTa_iv^T*cnZIIp%#)NkZOsL}<|OH|v@>U+agU zS5{NiRR?W7P_jHhexUpS=w%|n!%q<>TU*Yd>F10Hl)<|AiTZ5)5m@7nF=ZPx(2t?K zJRKHk)6+iY$1pkhSpAe2_8RaL3AqN8G>mpvYGksDt@&(s97oW7_H+tasKJdTH%mPZ zm4z7?b`!5Ccq1<|zY(i&_(K+nZ`R!)9vZ9 z(=29WX{%wFlEK|k^Jus@wAZjfQCCC2sHLvU4?tKQU+Y}Vm^R{C8&&eAEuc!i!j-a{M`vDnXL{GfK$5?XA?@dPlpH zRD){)2r7>36pf)94;B8bMlmZS<_IWF)hMKh;1gHu|7tG(I|wf#FAbKK0!z1cfC$pl5K3IvT9ndUUcxg+!i@XOh|rBe6-V{ z-zNLFmbU9;y2Kb(M=vz!a($g;&fw}-R$Q#i;ozM^P-BTBUf%b?1>d4JgTALPXiUDb z!Qcvg$A25L1o}~ufmi~RVe(oN_ym$l_q!64KJs*?6&Hd>N`pKkg9mil4V5n!s_3p8CenMQA#%{ zd`@TIavQ^EF}xKXM*$hZ6L5cpP*7>A$+ld$;>=5(;y3l*O0t^b&SDTFt2^=^2{JFg5$`CJ8{2QoHuodx}Ebz7@`)9Stn$QHu2tBk`B zQi12thL4qUi4&~>Q12zImxPJ74@2WE34iV}83N?IP>}4kDq@O58G?iO9^|4fLQBd*9e8NJM0f8Qu zx6ZWbbiI2Va{*k?xWPqDkQ4X}bz*NCBz^8#{rbb)%3^jz#A~a^?D|9`>*?Sr%a$U> zJqYKNE>)6<%$-Bh@Q5d=%czZ!_g4COrllcDCBV)dlmWWWq%Pk3w&XdrfRNPq?H&rS zw&0%~a<|xJ?e$%qq&W3t+k{rZ1sT;f&trma*H+L1T?c8LX@Qb3PY1>uP=PkX2E|j) zVcb<*@jjDr;^L)tB$0_IiZ#sWE#tvg%$JQ`voXx9SZiZfQS=l*h5Z>}%%MMtYdjJ1 z<=20$A8NE2OB??dxNqEG4cTtyc{n<5^?yj59a{uP_1Qn5o2t;X;lxb7e6msrDCsr#mqj?QxD`}NBH6XNvU7L1ebOMXU4C=|-!cA=RG z^3E{GP@mP7?}oX8($02iHoW+$oZ(W9Y@KVWdxB$=?)eJsSspx2J;PGmH07>1-v1ft z>w2R8dBE=KU$OiDDMO6DA4+Iq5M>{1v_`ytU3uZMIJaNx6O{bxGh^Y*3OIt%wa>u50gwbp~dkFOb;(Ei+tRc{p zoEa$IbUA;r!kpPfg*iee>mHfz7>YE^EyJg7e3tn>S;2NO<4HO*63Ge()yHk15g-MA zhHMiEIsE#gMUzQ`Kiu+Z?a|iZ_H=vCyFET?OHIkM5~Q`nUb zl=6HeZ92erW6YJ26t?#riZoKPq?`G+z#44i%vGw3tEKE4!%1XkJ2Ont?T>LVUezcA zRbH|p9+j@d$`yX7l^CHJ36pMOY&dTb9n2uqj>X8F4)r7KYS3k8RSV+d5jqk?xAJ$) zfJW{|r4x}cWycYqxa>864^U;2@;(``y9of_^iV<|iUQK|qkX?t$cnxyOe&W)o}IA} z=N}wRKU_#VVk3`mi(AxVJi|^9ME?G19mkdwkW39^*J`1Ax~gS-2JAVA67ox2B324R z1y`1a%9g4_7@VBe^QLeU{bSOAY51Kpz3wNeG6~4bL?DbhGn2p=7HjNzFXArDGL5`mp5KrzxpB+VU(#-#(E458nLA&qxyTUl zk>;QH(BBF4+x64FxQlrB4V!&7tu6NMAsw?nED0uPGerj5Elc;3TW>e&h9_FPKV0cA zOeX^p_j2xjE@d?Ct)+x4wlubA$ennAHJJW1*S7f)yuZ3aTN|BGy2=@MY{o_EQ&w&w z80CMm%nCipnKpfUafYGhvZgK4lv~~pcNgex^c$0z&n9%$yzO;AFg&*)yYiY^%OmwZ z>f{BLOK&DpEzxPB47a-0{b89L`o2kZH+@s%pWoHbwZHF=JOuU!?(%wnd|hiAEx!BY z-^s9}$tih^f+G5Dm$w)0OI6-yOFS2D{?@;28LEdG(WFN0#o;3~#`F(UU)%Kc-xT9X z%S^Y+ef2i)|Ekx0`~~{w;`+a(^QL#>50qMJ?8Qhbg9vt3CB>;|Vl2760wW`R%(^!2 z!K>0Ql@?*KNf9LQwRPrOaG8iaY$!pAA_6ct``x`1$M!Wf9DyzmY82}1ViiI}<=%8U z#+#?4d-7IFHwXAW&Ksc0*0c3UD&Z42nefKOOaK}QtO3AukGoO{xB#R8o=+I)q80cr zY2s5#8qFv~G!%+Utqf_GT6FbK;T2@bx@t9R*3`wG?-`*1DDW~f-QY#ySmJiSG-`fO?b)0<1Ta*pJoQ$OPdk!<-!BCtk*lp(mMxX0Ay}6zz_ljDr^E2tf-xk3`L+v zIzRvsck2J(>@BEw-5*#f;$9<-~@uZ6fT8Z;Sk(|6>bUcE+J3^f)`e} z1$U=_3~%>zubwsYX@0`<;W>MqeP8Fgw?gSvD%z`=a~aZhwv9208-oMgn5uMQH?A%| zu_g;vcTz>p0@R<1*P4Ow@$>;k`n~04k;0GWXSi9NRa6;E#0&~Z3{slh>dB@NMqUrm z6M4qWzvuz#6mwfcr0dIo_U>W1dEFuJc-MQ9 zgw(AXqQAMqbGl!*myr05A`6?MgK(h3nQrqfb4gc9OJMqiS9QJjA6Io*Q| zY#ekeP!wc@U@^aoi||O7BcNR#G+`VbS{Pw$t3VMk1~a-!VT2Mn?b*aW^)@r-kN~g| z>1cM*nx54t`sH^;K>3qJHR*?JBRsCuIs8_GRK{l7tEo1^$i-5qaQElF%Af}FE3acT*g`JP zV_7Jc0cFSZR%Gi~|6{5#tD#5cTEP4}wu(&Yu&+PH&5Z$Y=R$z>*#^oE5Q!M(TSYYQ z;U40FI=i25IlQ7qGts$p0HD(OJ1k;FJx(mNVEFT;0ZigGO#?ELo8xZva#|DZ`RL(e z>iDVdkN?Rm;!1<~da*Tj-Dr;SB_CZut4po)d1l!c_u>%{B95f^k}v}>R3j9)I^N%d zDhM(e-Q+1Tvhbm3nW%H0YjvTyiG-^F7ENs1p1w?r(X@W~L;I#aIJgx*xHWG}A9`qL z^ry<#ifS?Onr7bn`iMP*Ol0TDG5F?1NvCEVC$MB-RR!{oTn>~H1Zyh!x~CZ`%y6i^=w0bE4@Xcl-As}_pjZ!*|l|=ynT_* z=Hr__Zki4@r%L~OF;$T7hJ9sRD1m6Nl;CGM)WjUFFQ@;m3lC*!px;sgbhZXtiw8aW zbdCFQCBEnif-h3@;|hjhFc8e`1q@(<-50X?C_;< z%jO$Wn|nNs>EuX9sOy2gZ(d?cN9$eAH7xIxR1)Wz0vY!FTI0v7AoUh=W9y5BPCB1x z>MoBd(#Ms}_Mv4@c)w+$IO)z=YY){_tYN>v13Zn*s?S+iT?BtuprG7z?a*JTRKe+j`ov{6`E; z9or2sBC_@p$MyW)-HxAI?5DD|nE#NWS#G4%%DF6xy(x?l>@A6D2RC_J=;ajXS&<7F zSdIk-0Z))U@*iO37S1C5!PicUIIuyK`KMxPc(oiAD3~AIk(mygmXINi@~x?Cn8Gq1 zZ!XvTPnPjNw1SkBcjr^!U_;l5k3F}?_O=Tgw41yyLix&<$jXRZ?{v#S)A#=lz>fak z0oca>uK?`#`Od$`Ue`vzw}uu>s+jj7Vor`+m7nt+p*)hv8a5_xvsnJd|Jb}U&A!I6 za9>&e5Tp4ba^c|p#``zr5be|AuPmJ^f}eHx3N!5#3zBu|@_2x_u}H{si|ckqSh%hu zl93_)Ax^l)Pq%-Yx2D*wedzB^Gw`O+q?+<(L_J!#2|44=Klk*t^0(fWsQte|- zbeWM0y7v)GUtGan6;Ml=3X`n{jnV+5!7M^={J$Ae(Qm*FVhDm`H@q&?yRRNSrYJhv zlvf!q60rDgQZirU$Pny6OEK|YLu{w^lVR#CrrwnqThmto;QyLfF4lz&X?jxnLkNVt3G;WfO)7o{cDC8efr#|b|mtnDo>Ueat;Y}U* z_RWu^frL^l4AF<5fzT5(we2V5HZ+MCGoAG7$w<`g2R8wMR5A_QOf@0(1j9WwfCCP_ zm9-}pppGBZf~%lWMslVK&0hbuuFKn}i&Ircy@AhU7KXcSpdbL|b@U{I`k=nlWLp(- z){>FV#I70Un6dM1x%{mY=Dr9DNgyD!@@@kVJ5V2;n?fQh$sIwpMg({gqH1&@8L8>2g8>C3>|qCMvLIe)t=^k&Z8l z9Hs}MW5se@&)X6))UWw+#2xB0^08k2aogMEocFr;GL!qCq`wQT&En_T;M45g_71-j z9Z&h!DM?9muZJhY2_jJmGzg?oHKizE^Y?CdGQkgGJ+<@_1(;uvvDsM7Au`BTW_VdF z)5c2WyET;#khKZhJa}G_>c^D>5K&5Jr^|}}#G?Ok^PGu)zQ_D+RdY2hOnmGc8mHBb zxScQLlvMlEIEuUArmPda^3Sc*lKQ4ElGuT5x^Ay|zEVjX?p%J){w4%=SVUR~E0&X% zQ?3d7>lk$R4VpP~CVTzbhs3GK;aXV~)GnnH*I+MJ6O&L($bb42mieTE>>0rzDTFt2 zN%O?RUdMZb=-Q&zTi@df#ZtNOxf;n+JO83ZNE$yRgxD==4&GYC>2g_~%RuKsrySaIj@d6%(@g*uc>H#cy3PcDb!j}Y) z&ji<;idgCt`Wt06yg$WZZ7ZtTnRqx@g9Xc*-!Inlh$ue!nFN0MDn5e!guULoC&!H^ zoSj33a&_V7?2l+&@LFnds^|V@X(pTEzaz{gZ}_{_bD3q@>!7r@mKzYWg8%KgBRU)u z-1r|-vG9>cBCEyH?w6&4t^b*Q@5T3VUb<;A4Xs*#uj7P?P>xV7c;ceqbxyR!KyS&)Eb#y@%y;)n8VYZ_`l09P%KZD`(Q zHlUACvN{x0g*2eks#CJkQvY4e_ur0`pY~F33>-e&2ijO{@sKsXf{FXoe)-yP`Lv_F z8WxN&IqJVsL|mK8C66X_M8 zRQ|bJ5sItUIMK$3!BvY{Sp=+sMR)DD*me9&KnPz7#w~tb=3)<@@|6zRKE?`}idYSH zZMRx{n5@oy__GA0O#r!u!uF6afnD1o`>$)Xc(=gjFIeTQ)b~&QeJv+*O}3H<>J1+X zro0WIO8U-uP<@oKWxXv4*Ud&hj~2PwR+WQlr|UPh_4VUl`U~jzh#S1kA2sNT)C?ol zR8eY7>J_&{#&Z6-UuTEse?fShjsdAc(6_!6zI(r_QFTO6C&astfp!6s1uXvG`8~@- zwjs5Qe#v{nb(-LALdK0@C!x_E^B$D0FSw*q}L6N7_P{Z_8F{vj70}jlXQJA z?^j=QYJOJ7Zg|=^Vq6o+HgI*H+uH8H(ZDGePWGza3#Qcp-u65%%v7~}4J^4CTbFWT zoZamPYcTz`Z^`~+&$^TdshR-ipzR3a}ZsDvAL*7!mPGyi=W zFQMP@@gYFlVEWaRvZeNsHR{>oun??I8wHR5_M?N7y|rX_^BHbMqg1oJzzhlM8yBzg2D~2ARN6L%*2ktPp7sq?iRSnD%2#4}p^~#& z;D@}!ey02#K@=y=EXl!+A-5tp>aXvWyiqT0rpXeu8thN^6bsyfoU0UvZD(wzul%Lb zbJ?j++ufP3%mp4&)%vX%f=^UdFKw6VwYc^_N=#B()?;eeS{1(ZJ^m71GmwS(GMKIk z+;&dicJ&xa-WdW1KEqOjm@CB-kF+U_5>3y)>iz059Cte0CJq(pK~sv$Z9i%lMRsj_ zyciv*cM_c+`a(w`v$VfH@5cGEM6|Su4b1gE@dbFU;VExCd z!oO<$kwHv&dAX3lczcE-X$nxgRloRd*OpB!EF)UPXHNL-2Z?+~{R;_Z#~AW0=kKD9U_8nr#=> zddt}PgdK_fR%Fh5#m#myIiux28!iuRi>3h3@Ue;mnR(S^+Y(QWL`v(g3}8~k|Kn_(yyr^96>9oyxAbj6*+Czh;5rKy$jFy|G|J>@dM9Sw_{Fvo(&8ophqLILVurhXF-Nkys}xO|KzHQclBrL06^LoQ9&$go02+)CUTF~^<&@X#XFWN|md4@6M@-6*#(n+t_PSFG+~Ftj z+x7`nJ=4JJjb_2+?Zuc^fTLR2kNEEJY{itK;EkM!O; zcx2sefA>Oz@1ouEiHq(~q*jrt!_?z~%RY5W>< zQu-*?xMD+m>o1kao;g165wefCG!iPj)^%8n%q1SNcl4c_bM}U3YFyM>0%^ zBmcDwyw`)D)vcz{smqHkg1erLEcp#23a=|$?rdKQcsu6P3DsxlSq;^e*W}$DN>{}iFoq(Pr z)KRXcdBg^LoCl6f1>{g^5+rUIfT&eev@~i=C6-5K>Mi<3hbNsbECqC$b|q^@tu;8d z3vU_WUgb|>-MtAD$h^ETUTaNuzVAo^hg63PKb%cPVidcdFm7coHT=xhR-3$L9$@k? zX(tbBc>STt^n*_72M{TN$15oi;qID9ANyUG3jmPzg)TQ)6>R63J^(DNNw253h!^ko zIz`8pdg1iqPrB#Y%Y^g%y|||WI*}hcY!Tv>-UC>}5^>c@%Bg|JBJ;0fT5Z7~NGc#z z6_)c!yNQm0W``IkIbUTOwi>A|gPZKS%sM_JZ97j29)LFm4?l$i2Fu)DH}o3EOA$;t zQAHy!$b?fpOIh_v8_kR_G^NzIGfpF^6(N)X3$&2CT3%*rqI-TMGs@_2*!fXVP^jks z3ZPeB7}i?irY()^9EXCej#8ky^$mub*oh;Ay2}C1KK1ZO1t$1O@qrD{6a_|!7Uqa< zD$O3r>H~|*$lt)pVd0i5mW-Yv{fh11pMXDl?4`V_$neY(pb#qnzr5jRz<72L;ZfqL z2qHJ?=t+LfopdkXHEqLFnzr@JaR1C zPHd2~Z~&7r2ihM-_34CQ3i?0SsCA){BphJbmRhU6xEAn|&_H1lln?c9zKPnRxz8d6Hi>mK zhjvh9S~c*6T`JRIZ>{^-SF)MV(>E^7_=z=V{7i+b{Y~Is-h8YTA2omypdXX0A8p3y zVDkBKSCVc$j*#^}JEI?~Hz!g}p*6uhgr>OhG2lX}yu@&ki6gNVp_p~RHIu}RxL&b* zUQZX4M!E;j4s88hFnD3^coBp?N%-YbT%#c(K$Uq#+J1%e>d z+1g|&c>p%0U)2|H+HL)ZP|8rG7LR{|NZgVWIYFLE0*Lfe<)Rw2#7B-{3-NxOe$sw& z>-zY4Whm64e2oSlIs_}CP)wpbq`GIxvni^KtMI5A7rTrD9Em{?H^u;1{cFYZWq5O0 z;R;Pbd~*7MBg&|-7+zBTS02N`;Sq6)hSOb-;Uw)&g_<3&$rogeFI2q zZDFBBZDTA~2diE1OIiJ^vk8%rcK{C85>-XR6$w7<8=`ucQB+x`>~#GY3IIF4UG!z51#9qdA%AgKKuQP*|4q*g7&%81rbVj z?8+mYnQI&BE}ehqYHDfF7B4rUeJl7=r(N(!Ig`!^?@7sa%DM$(u-Si0eaxH(ho6m1Pxlu|ALsw z7T$;Z(Oe@CN^5ckKZw-#m`7p)Ck0$eB=*seg3n|Dx?|y%OLi6G{426S%}5EKQNV;~ zJUc`~*TB2JLRSOW=AW$oa~-EEqP|b;c!N&}Rg_sNodxFyrU^la?ov~8GcxgPDZAv; zKF9(eu}$bU315Mz32&w8sOw}SV6(4R_@gc>Q@i(3(_d?HTLK)IN){ZQ(Lq1;=jU49 zt^^=f0AiOwqGX%00Fg=;oOLPHj{7ph=qn%WwD{ zD)m+*NPRnre;=VVMjKG1ZV_$TwJ=lP{Vf-A=qw@4Jf@W3po!I???G2a_vFnn6+<8k zpAQWsC5!djgkY2Me0cVFfEJymYwS_6K!$;<{qHquskL~arnwe=_pteFS~Gl6Cc32< zOzQmp4S9Gs>e}IaP2!dDp^u9la)4zV`=W=lId;&()_8Zb{Ui?$u24;EG|7A3o}82f zP=(Mss`c%1FVl6^As&mXg9=N+WXM(DNmvQ}@sPd}G3L6Szo2^KRtX&dPz|L28qb#+ zYOhV;Xy>TvA-nn+d7Fm*>zf-v6b{%N+DKfqp_Pn)G`Y4qX^r45;O9MdG#`ePB_B)K zZ_xzR1ijaJ3PoJGRxLlz4}EhxFRy?)dty?~;4dWCNN_nAIXLUM(Q?evWEhm;hOHfj z=K-q!%IEJEV*BTg3#=DFABx1{4OUVCIUfGN?h{FXdb5aVvM*F1%8+Kx)#+6*m~qKo zN^HiTAE9pKXMw&vW6bFmYkUOkb_7_YwMFS-!nZs6;IR(PO@P<0z4_q9SOGqw{_(m(c3tjomy|Kh&GQU4jASY$;_*PHymdVk z&o%_V*Z}qeisp_g`q-bP{k!|%bM03}5vDH^_rKML?(|J5Tc&JO2fUY@TG7ZEahc9R zCbg!W4B*$EH6Dgh-H4=}O*h{Qyu-`TF(~o6Zr-BX3|9r8>db!z)ALeav%% zP2K=M6BDC<+e?{J5eZ%sSYN)4OfWi`!YlDbwiW3SEi~K7tqZoCm$UQpWKFQl2OWw1 z4hdqXrpZt`={NmiNSGlao~#;e{#I*1E>$qOV%Kw-OI47I>X@~_|% z-o3_0%rB&l>?**Ue0b1kbGYp}5#f2=Dh`TAKLFzF0sOBHh<1rHl+6 zsd_zim)1E5+e9)F5;8yz{U25n0mxH`|B3LSTI z_Sa$lED2v9K#l^{A!wqMn5)`XTJm<}{=jNxN+xz0+GaXA7dJ_CcD3={0JPP~$5E3y z5irC%!*%4lzAgptZjJuNhg$}CTC~llN%n+yA?5;K*!=|Gtew=z$Ls5Bx$Qi{GT{-} z7U`i#ByxJ_DEuq*1MYQk^+MF44Eo}1y%!q|w7;8D@;pZU*Fpt5B3XW}mM>suQ@Gb& z5B^EgtQ1I?%dubNa<_}mDhU3 z?1;Lw|E7?q*n<$QWskvAM$rljSNw=` z>hAzg*piom2AaI=ZN4+Twz5cRQflKyQ#}AcY-|?7UfGUHQ@>NitrkkRAIK^cQspdB z{)r?MtL-sAZY*1agt_r+t%X{`uu8B2B*)2T>%{n7Ek` z%ro~>@h9MAq$)6uFJ%xJWs+ASyF*lDBXN&|I{bx{c{A2W{ktWUo5qbL-|IEVm2E4D z0!;^Y?=_?i_^Bw}>Okh-P^UeMs`f!!U!Zl<4rMZn{^Dpogh5NnSzw+_FN3r{y%(Z%R1v*XW2f5mXT=D}2lfxTjiRX~5uzsnk61~Ix z$L({Is^wy8*l|hAND7TMFzkJIywb}~L%*`?-Fx{2`zhf(;q#D{{M=a7!Q&(W)TTs| z^>itSe+h&z6p}F75ADgOe--xYBzic$>T@C0IGP^ivP~oacViVj*^q8T1a45mUoR>S z+r;*M@8Sp3o|q6Dbj5CR~Q5oa?j$7NNwbjD}&BJF}&hzcGia zr853OBC6OMtDula&LSWwNa#mB!vbd1JHCKKwh&g553&#P2W?7uYO{O!9WAknZGgHo zxdLqQXtj-|8Yw-I9WmXmfx_)A@}@A{yoj40jTs(O?Vfg|`LWNa`>32-tO1y$l>02A z$r33<_n}6`5<-cwEd?>frfg^dpRdd*$Eo+3F5bMiH27VhfIz#UN|Ri~)b*M7h3Gfn zcsifge!xomJ3*^Qnuznro!3`y1ol1PWF+4rZYh+wFMsu7Q9=Dlk6ky=k)hm|wAp5Q zAsn-y`$T*L`T`Be{5+v8I{t$gF-iKQmus5B&_fL3mxY!BaE0WFord4#CFuo`li4qF zJYPt+#J73k2J9|z;Y3y8J=&>s7VEE(l&0l`Iuf-Y+?dx0!cXe3D)MLX{+9~?ao$k` z`CvD@v_yrs+jW{@mbCk#$fhhY7e(rLQFN*Qh+G;U&g#f#&KLT4T*n3vrqUWKcpD z=vZ(x3ki?u&k6ETeZtgSPgOZJGPB^Sk7aHu?>o1np!Q)yJP(~Kd`aLTf z(0A|(yMxTgRT}(Go@4R3su4mBjt%%b4Tq!m9(7}#ZIf4s-V?&=Sv`2TA32@|0bGcO z2V_kBUN_?-B3;;Q(Yv{gLK1EKzdB!Yd;qrJD!im)6OlA3sjNL{?@oNa+xm81-z*iW zJIOxbJX*b13DkFNY_X;BUwExKZo9*N2O4Ap{q<&gi^hOfw{1*Cl%$=QfjkMP(@cej zG&z>jq5_<@Y_A<*g=;%1G&>d@@`(2qKWb_iz`N8tD0A@X_^CU0ruKZ^ELy zhU#-5`OmbOgI`h5#f1BtxEqv|>(D zalUKw8Nd}Raaw8_3}}+PE_NhEq(Hz`kM`wRL3?(UlE+PCOMJ=`&20Ipk?y}+JBIPm zgltCV0ZZ_x^``6N`FVGL6E*FQh`4kfx-J(_7x5)E)lZS#tYMx`X^DM z!Q1EQu*`p!NHG4EHMO#cC5j0LOJkvw){EQ!BV>ULQwnW__cS%1rtx*{3Mcwe{`sJB zyWVZ_PM{?PQMPkM%YN%V>U-f)>7Hf~+#I;T^>66xGLik|A`>`Tf3)Qj*Z!eO{zhv% zsOYxvv2>3;(f?iVqVlmNzhw|#U|Pt_^Vraa>uYs#>EtveZA!4tCVVX3{&n*{}DlYCM zB#RB5xw;ClkK@xUf!l|WJ$xh2SG#?zlXP17ijr+7zVpK}zxnAX(|bPfwgirMg*-g_ zWiiQs-9USge4GjpqQCvRg15-oEV_K@ht13{M)iKZoDnz1&-|Oi49boHR=H_ z;F=>fCWLocPtUkwqwoBR3>b6`bZikhrhB`?l5Ac!l>JjlK*4GrGohMjPPa6cTY_I| z;4AP-b3XZ`J2?2^$W}5_ZJ|lv*w5^}xb0Fqz|CVnJhi3l-#tukx&>z(DT%MzhN|+D z5=s_)rZDE0j|WiyztA2(qf>sCsj>lK=$JpZ$|1mFclneNf=T}lpL)* zWPum_y;6{@K2a{NuPF`L_44cs7#OjoSMk%X8DQ*6z7&*jGx#ygBLP#g%aXA0cNAdz zXL3X_8-V;s8o*lg9o0&xrw#lpUUQm|D(~}=VZ0v~!>Mmmd4t3d`QqT>dH1J)khq{@TMGQ3aXGv+(aTI|pUC~s zBViQ@8?Z+1R-1q$s(Jsr55q_z&HpC*U(1Yq-Oewo+J6wqzBYbt z_!AUVqV=bf?nO-v%Y=UE%Ve`%MZ*Q@;OJs`=}$y6d6tBkB&lL_s3BOy_m!fG&0ZR` zU5NcsxCXsUYU3&pFWwshPc$REt!y{O#$5t+6z2-cBQ!>xQAgim!sNw3f)UfbsU_uw-2FTMj~_+ioYvsS5Q4iZi*5 zOa6NVkk01t@v$TEE%|;D&VRlthxUNFhjk|gNac6+^(f^udp1+MOnf#XkczT&VeWsk zY{O?v+e;iey=r*N@-x(dSZCBib##!}z|$(rl_KJ)BxIRsf^Q$>8mBaQit`R(`8$;C zKFQh&Y{4$3E@A-;N$xx8dPC%>jY%!>W|@|Sc~_~gMGtv;fAB)rI(inDK^o zIn+zGjBR?5-6&iePeczUb*`craK>OsSClHC;2}f_bFt%U_^h`+Ye#O$gyi%8L@SwOH=)~eWVHq!C*!^=r`EP`UQx-iRqr~WL$3VYVEK#Kiebf@@~)AIsbpn zjEU~kcv*w^4e%bGLWJ6=Ik;RJ(2<=j&$u{Ox3-8m9xiv|!Q{jU=)1ckR#(7Ru*xY| zshaX?qRK)3#nfFQH7~Z$X_#X_qhu(!758LvU=>W7*P1GX>lxncU85wJqSg@6l;sff zH-|~98p}3bt%SB{cNjPP(gNL}`6zQPVat(n7h7t2kNgXo5^Bst&X7KTT`*wM*|=jT zK{N*42xkGULiWv!GvlWHB9RMwCHw7`?CRG`XRAGW!k`i}RI48h{8r-QCE3{`MKh7w zRO+6cySg}lRb;jK?2e(U>qBR=Q$E1=2f11f1MSmN*rQW1^-Ui5 z;~Tm~o9MSC`-4hW4tRa#>7Yb2@8k;)^D^WUhp*W2jdF(3U9jo4 zM6*wYMlH!Qf-w{?$()jfllF}s2jdS{zDrLeTMK6T>6BjHzP9M_VrQ@+A-bMW)<95w z^#Tuv)Eh$lT>BCOSp6P*u0Aymfx=m0*g5w&*|^vY@MGk|Vt+18P5=}g(*-kbbXX~b z?7qHdicxL~IK*<`H!f@uZ1F``b7F&aOOzjHuI>_?j9Ma8W5HI@1@HmN8gE30)eeaJ zgfVE8cXbuGWL_|g?J&3M2XXXq!Aa>EZ8N47L<9p#U|&gJ_V3Pv@fh8%$aR?hO*N%^ zy_0h2{o7-H?FqSsm?nF?22*MV)4Rq9vc5loKL(gD72nscF4!s#Q|lCtP6&e$Z{ z8t3!1|B2{JAe*c(LDL>N((F@eX*JS)manB}T)=QtM1D#?uuD$o^EQn35WDgy`p9qI zF!m&IW5QZ!=f%rn^Xj$eMW%OpC;577&tCt>fTiLc>6xtf#et!Wqam%M*%Tbkn0b# z?uirAGKmfFGkV|8T4e-kV9ytsBA_V>4+l-hk;dFfZ9y7FA?Mx!-Qe0Gg{qipT>U{)gG^KT)$7o zyyK6r)9NwT5+?f~LKnBryu+_~LuTU2peeuh)e@P8Im+t*o1JLq!s^unfNq+50rLx@Zz+TlyTN6q0E9O9je7wh(?oEy1%+TTB5Pn;_}skws_(#tUimEtBRP$Uo|8M z9P$9KZ*C%KX-pF-7EneCPfAeXY%FY zl%<1cmrTsYhK-qYnxFoAFth)|^vPcKbR^OJ9%7wFwwty_6J|thxtn{bm88BXcIp-@ zhIP{6<+$AT?%^uH&1tB{SJ4L2yxA}ci4{ZH#{h?1c)J!Xs85MgHAl1y-v)8iRJ2T7 z*ki0-LIQ8JH~Uecplrk<3%165&xT5gO)uw)gTY-f>p05sFFTm~|GAN>FA4dN6<41( z@=#sIugc&)HRb9!(+38e1+)Y&)){>G_rsW?g8k$g=JIY3(WV9WG0l#>EoXmMdZTF{ z=*!xy`m(25iaJ)Fa;Xf^|M%tAO>D@BLYK+^UB`{I&Vj`19(Uo53bR za#3zv*_3~xtHotd#8hF~0t7s*eTf%J;JUIh^l8HsckH!M>Zd;)^E6i=quB=T1^Om? z*SahVx7{1W%)9dX#NT>7q=X@QT_8gdzWrzMJfXRAEfl9AH;I=YRZ=XtvJcWQvXb!Y+QF^XqP` zpI90cgk=8TH(($mrcgXVMGV7 zb(a@NGE}=VI5<$j?~)Cwl0zj67a~J6oG1L?cwnQP{_-H3ywMXuV2dP2x*zrZ>fG!d zYQ%|!!zoT1q52fPwT=egF1Dc1QpLhcCdCj0QEYQj(mWdkc@>vN2A zC`-?#rEXP4n9BQXw-0tBE|ae)b&B@(=FbnrBmA0DUEj!Kt0fk)=j@Ibe?C`8s#<4e z3%_ho9R5;LV@&)e-kF*SNDQLpG|gcC{Sp7hp{Yu4YBSFs&Cs>4&7hpJu8Y2Tx^oBh}hH-;OP>) zRl1QhE9?+xs?gXodYdffe^fYP&viCJpD0|U7PzM)h&+6~RzXm#3)(Y8wFc!LfXI#r zHQtX5H6=l2G`W2;p&ua)TyX_FpYx=0@jysO{mEfQ{tY!%#RIFXOupyov3>+yJYUto z>b6}09LVc*`X%L-%a<7iVc&2m(gxN)I*zg#8Eqyn2VwoB78+NM7flde< zoC#0(s+}>PS-`YfB>TCKoq^Wz&!xKyran^<`-gi|ZYdBcTdu5HN6TsL-UFld06lr2 z@5xIEE#{d$UEjiqcqjho8}WYIV-tV^#rA!}D3{9G9lRMyV8JEBpH4GzgvFKf%=TBt zzTwV5z4vm-j{kqjIQ)iz?s=)rT>EOv2m33Q^BDO#zUtvZ;^46G_1kaEPCK)6>4W#S zfzlrm5wFSLY5gWeTv9B)Wi3B}wG)1a*PB^MWbU?XQ3!+_U0h8i2Jzix)_9gU5!d*+ zs=7I2-2`R_MvAY!EFiDr=|9_8zutTN&zBuA(%WE-IBQ(5@E7{dqC%@6xinFlX+rsE zyD0ALzvC4o41p(qP#N&6C;c^Gj-$kq3zXccY%diSKG7$2ntw=&O+nnOG%NXo@;tg5 z|F}ycWB~^U*$?e6C5{gd^R*I=QH9{w&vxu^@L`5jeMeAL`r1SF8g}Q@c;e?Nlensz z4b0d}>F%yAno}WNqAxyv;T>V5Ye0mbaFYX2cZ)pWH1Guw$C71mx1JexFf>fNe?Vo0E z%saJ)N?vH-;3~vR_)+ufM{+muio_Ixbyn@7E%U>K%KyjKs+eeF#JiV)e^wCS^Jgo7 zA~Eo9+<`@EDPO{6$&b=x%;rHp9veTNX~vB=#CzGu965|4HIO~w$LVue2M~#6acc}_ ztu53%w`B!y@Ra%PRE%4>PKh>Cz#GTZLRzO7Wk~~-hpzBCLCQ}Rv@hXYxmpNqTL*18 ztPzVAz27JLrPWS^KXwL-;76xF?s!VKkP4j9zzGkmnOhzo-K)fSF2C;YYDV5y%i?(} zQ2PC$2DF8L^2q^C8ME$yr7%K9|(BNiV6x z`HDc3=&JoGL>%azp!n*}8C|H#rAnEpSSZ`39IzJ6`bo$urijPFHF=n42Uz8({A*pa zm&eIq4F#a^m4{mX_8R}PM90B?FvMe2d})SQ9jYGxI$n`-ob-WqaAPR)3osg1?2#(8 zBz0y_3Z2d|d1Ab&$YF9nH|yB%6bjvi&uHgQMg6D|z^#KCGY7niBQjr@8apE#)08&g zgP_)a8=MlDO$(}{alL?*mr`maoygVDV4zRG-@+`%937+ohsL<@gtm^(@~sfGH#^*j z)+g4VDhKAAao62kBi{SkolplP(mJT(qUV!9tdZ$=zcG&3BDC2o2*gansvzn6QlOo? zl_!97$FtrOdq~`uo~O4CmhFAN!&5AZqR~Ldv{ro!m*exDi>){n_V zK92U<$HguAy`7YaLr}A<4*qF^H~#~s|7R{8BUnUD!-6Enap~mgwC}^*)XD0%)4S{4 za2Z{=zQTVa#`K*aTIq7h@679+nZU-!Bc6U_ruI0#4-fJLYEiwrsHLbQpm3Z&_xe(s z2R~}@>OMl7)-(K4Yv$iAJ?H}__vnhXOKKB9&vfe>n39IAt*wGmxm_-47b>Hf>q=z| z3-o4ozXoNHJWU)*-q9x=s~8f2FkSJrwM|TEQ}d0~6?z&L%ll%RF33mlsRu_b=Ng}0 znxcv%mxc_Yx>*~|)H785b|L;;eZRd!%XaBX4vnxkks>i4E3{*;4iB(>K?X}|CQD1A z$Q7wIpcdy9%D#vx{UAL7Pd3-}W)owvm)4#{*0(dB*<4eXE#Ag@633xueZEnyH?GO1stGK<cS60eqGO3gq8*?Uv@av}X}-$d%aq)jm_29F|BoPLiexM&zu;SWaK~ zn9}VtpC008hql0bw~oH)qk5ypqYb641?6cU$V-U5pj_p$X}MP|FI?}swK%ZvcuAxO zR=8gIA^6zARP@y_#WC|sR%j>gq_U#F=7IbvD8m$~^{}>A!bivDqR6@VI+nXf$oN0b zIa4glLVI1qZ)8UzeevYQ(KZXKzhPGV+m`1(@^1e!|6jlri>o6Y#5+(UliP197Wr({ ztmvV>R!ri6>y%|rc<1*Z|1c~olzL=K#N5y{h!nuneaO(D(nkA5fohTq|Kuzx1dl3?)PY$4ySZ_~}>o-mD&nQ2GKt-NcOctou7>$%N7m+ne?2#Ly)PT?1V$ z(^a}LSf8~=*uZ63SzrEB*Nz*yq$3)(@@u6Gd29CuzL^n2GPNo}<6^-XK9 zct=}!b5-VHF~TfEzKq31|Cn z6s5h;UpkMu$@ zH+4$k3UaBVytRQ z2E)%uhG`tKQWE!zFiM7p8u-!|y;k&!mzM}QHUxpqHqu7T_`ntHtJ??nn+RF7aHY1X zHPOmG@kM?w?G9n(zbTiwkvW@hkJKp;dceb_Q(mF+a|Oh2>d@M_wA=Ub-NknN_{iG-wl~_G{aQSD3yCJ|8+61+z+^vF1d6H=M6o( zU#A~eTH*pZ-KuaJbO;#)Ww5pKKJjYf0BRfe*H>kDAiP4ur$;Qv^~Ldl*KYxDm!`J~ z08DD8DIsMPR^Ka}6dS>OTMM#Gmc~jVf8K!%HRA{HA4ra#1Y;ntr@$LY$gkMIxYW(V zJq5Rh7!>0y5`{}21uq!DmdZM}Iz)}Pey}-&?xx3;gNmc&F~C~GHXRZ(u^mv&D=NRj31)p*KObR(*)}z=_}lJEDzF$j zk+5(pD!mR@=`xH#Kd#s^)aRnWoHsb{U9v8W=dYo-S269!TUsQYSAAa(hJKPD@JKIk zP6oeeNP@WkFV^0&Ez0=c`X0KZq#Hr$kcOcZ0i{boQt1Zi7)lW&hL&dNP&%cCQiksC z9vHfYhI{<)z3=O|viKzhF=kaIyuv>)UIYde_9sQ5aih zb3M7rz`h_EzQ2;f9F5A2JyYs7)K{tlgIG19d3tZFb|<~06Dkh&m2&=$05_yi)ME;fK4$S)`;NilDVV#xemZ6@Un$pnSW4#?&Iiz#l13HR@BqMHq*s$7d zDh)V0a{=&uPtre`+@4r%#vc$|&yBe6*4Df=k{jaSk!QE#a@cW4p$V@)%M?Vg2zI?S z#C#I>a^7-D<*aT(ouFzxW2N<(qmE%_I6^bHTYm=C&ey!5@S$KWMJsU3XewX?|-|Whq@E6haV^fihK_K4ZGYdd4#PBDhHU z%8=Qa_mch;er2eUF(#V)w|B7HJ;9*{R;T6rc|S7|TzgMoU_*nsxTrJkewxqF7sY?M za*Oi&NH$m)Zl8{dy;BD&uJyM-3XAzNE2s7J!NnGApjf=~W|w@_AGGa=?4{_s`a+fE zs!BTe`)9vlfr}PFi66*4>ehWLegdPBja~Yh82G`+d5er~+{K!kryq&j@D5@Iimb1$ zkoYm*c5j=A+(=J8P)Z-K(m2ot4#2-VvGsm>_Be3;B=;(Dck_t&vSJZgJ6@A;bNaA@ z=1CyMaf#P+-jlk(y>*rgXkPSsf$Bzm|18c%tY;ivCvvdgyKVs79u5iT8fL#pWvzA3 z3dcZf{%y+RmC|)HZRXn&fdS{krTiGQz{Y`VD7qgbW3QZvOyFkA*~9~Q)6G|UccFOC zt?9ojEHE7mQ!;;lf7V}L_jcp|dXC`~2Ka2}4jZl1&+ZdSyt`MXT^{fmId_G}mOa`A zm=R4{`I$Pr$C$l`Jf21CwjC!43*2q0B1)DAL zfJk!<@jyO^iB2Kqfj(9S3`^x!FSXFNzenZC`pqJFxBtthQ!2IasY9A#Bj|G}lBPKP z{sjR#h#%W4RT9N5ngK3|?{&1aG|!ViRl|BaI+$fQd&bl2>Bgy7^;Fz-?AJx!ruSed zxDKff$KfY{j9m?Ic?heShWs*pfU=iQIjfZw20zG&FwE%{1kuxBOpf<~^NZq{@>#{r zw*lSr!1;~Em;Qg#kgf@JY9^y;usK1Qmq|a-Skz~0IAhSLY0$)ah*$XNnR&~d?2bD+ zg(Z3>w#B7?{k|63%41FoURz!5oJ2oBitvgrp+S2nBNSQl(1PXJgQ(QuZT`r=GE&`S z`*t|EwQdZ%lJG6EIEzoBA~R3d-V5}{`tfnxMY!0ze0^_4yAggDsQq3I&Gb}=ZmD{O z;SL|DOYmvveew5BPBsv`MhztLEG)Gp?XO4Bqs({^xah)YSh?{t8IY(_ZNE?~>`O)1 z&L8`{iXPv*7RoBQQCnKy!`3sIJOU$aoddb~no|C@s~01x{$5Mj$R)8?{lnNj=De-L z%sBB_^#xBErtC0tL`5L9v+n#udc_~lXX}Y@-n?Ppd|5nUiX5ifJi}}q9$KBn6wee; zGvw8Z1<0Y3eH%^ttXsu5PQMPz%&>By7>`jO*dptnucL@&K(v#bgMs6h=mc+KTURxfHVs{ob(d5Ud`%#GjxL zlcn6%yMQ@MIupDP)=||e!g~tACWR9`e!%g6GCO+UTvpQpWzRq}r zrf2c~Gg&x2BRmYHayNp35j!H{S_245k#E_oTZ{mceNL)KA%JCnJ>i+P9E zf1{MF=dHQ08K7H69L1?#&$@n=WqijYzB3?FCvVh4qmQvPXZR%htU4tZo+`Fh!mX?Y z@%-K-`C2+Z+1mFwhcb>_EQpj;8D;*t8=K;1a0W|4+)*q}uf$`DE+>HQNPx%$`hk3+7YO`xcw0dY(vAJJlED{J?8h9$VvDY?0Uu5W`zDqDv;z}0_WY&V7b-zMs>f?FUS?ry3ws8)Y*V6bzP!vTf9F{voRd*6=QlFdAu9RL3x%Lg041y_WyN&y7%&D*10QN1#haeb|u;ve^*E_ z@tDFN?pGeAuOczFWdB>J35<52xOM!+`t3JUCz|oZJqE3&%}`&HdLNCGe^b3~vLrZH z8*Ol=#}g))2y*Et(ED!NbqJZ=xh_5S?|KFMq7~>}{x3Z^U|@59c!Qw5ba_O&1WFfe zrlV%zc0W3AGmAv zWE6}*FP#eXGdr4|jCP3pg<=(218UOIwxa2ORXV*3_ql<#eYyXl96!0-Nmk67AFQGy zE~2de%|gAsmwGruMEY;Ge8wECM>jS+qF<=*naN)$W6UT$=IAdt%$Bud^+_p<&08jk zK2vX}a)4JiEB4Cj5w^i=eS*bBT{ITQ=boFw!BN9{ta;YHROG+LY2K|U-k!uq@Q!9|`+lG<-{7W>!W(c%^^dcqIvzU}0F364D|XDF>M{Fanr zQA)}9^Vn+2o2;;h*jp#`{dD5f(gf)ZgaYqu2C+>CJs3(OS1oXEfHpd5Jn?k{`r@D^ z$OR#}>p^dMpkSs}SrL1T^dEsHVp{0qIaq&?n4U;9vFxLMc|?# zc4VQy_rB`uTlP8r-d^!>da#gJRIj)Wgmyu+VA!iC8nCx zHd^qc(bLZ(`W}*rfvka^2BaSb6+Av_pD3^C!&~7 z1nV2ecCHk+mck^~8#^EoR>_X8d&y|bqfv#r`Ou4m%4X5zyu!hpR2cECPy-U{Nl{m!19>S0V!P~sh8F0UxNmsw4`x8+8}GT?(syp1J@ ztpuo?a{^d{IwkiKAwn+TDA8RXn|mui;P}==php?Og8>Z5IPrcm#JuE=U$)rP4y zOrXb)TW8($jdcU=M0gCXM?gXTm!;-3r4a(u0`zb1^qeMe5bL#Q#R`es*Mm*HrC&Cl zoFu6iW__M)7^Q}6zHW^66O03=1O?(N`})!Y`3|8M^@+bKnz=ky1ISCrbp=ccOQp(f zB>#0`ZF{zIEbHnL=#@h;)KKdR`XnK}D^VNh7glHY@F^&x=QHZNR`P|bIm4*$T<+mL;G9(tL zn_0U|2M?3FE29KI?~&h3%O|N64A1%6I+NH|N^x1NrWk5bwL&c~7oTprytdUkB=_uN zLt`6ng;j;!DZKuV#8E2=iMIxDM!T|nKGXfR#N)Qh16xH{k@Zwy@`%Ji_tW`D*}HC8 zOccYe!lc5kg6eduxwKWW`+r=ks?4c~=MwEjWoboFh10UmRY&M$ zaxgh+xpP_r?nwVklPcKq+ieTBt1w|VdpJ#jNk<+O zy7LUMqIou%RX%c~?cdzojBgXd3*y^Swu_W5P{QzhDG9r|^jLerhd4FrGVK5JVxCGj zL4u4qllk|Iz*bB!i^1fNA~h*2mt<|kTl{a#d>2*H;QxQ!*)g}{&UU{Satx$y;*~AU zlIu#lnDLfCw3e0@*T~%f_5F-*WHA{zA)U{hGn?O%y|ttr_R2a*+)${hZqLXGB~`x& zK;mp;60)Otu!*lMO?Srja(0AuUDvuicGhL%2IJFrDXQQ2{r+%Z#k@?0kvTc|4+N~KkPU!X5S>YT#w>C?N z1mLeTaw;v2=|yOlw1M@+b1{{PioB7B( z#yH2TRk?z@^v>_H>@pn>E=AwU&`Rhh1->qB9OH_naTWRcwHGCW*03XX_LS)&#(!aw z|2`=q-7IBWkK1`ASF>~%M|?ltTbF*IU_f0?LZqTe!SFZ%kn_KcEew%vnYf0p**apH zmqOm!K->gKqgU{bb6a9cIw{Yi+?{A?xRo7d$EFEK5_fM`TEeS4Pq58aT6QZYr{@x; z8`f;ga)Wk=V)=?%kl+Gqgv-9O2AQII0#_YQ@e1)#TX=5=I!W5=Lj=~2GmvxXu0w{8 zdJ1jZ_BHU9(oNHzfIx9$EhoWSU5o#V@7e;y;KZi;On;SKpFeeCx_V zE9sVwCGzY{Ru-^LV)&NVroU!Pg`3w1aFix9^~yh8hXCk?fpU#`4+%Qcw!o{BRcq5H zJi%f_SEwHA8?l>0@UiMKz8MTEQ{1kd6Et+pkR=v*FWgm7yh55u)zKtEK6>#i!&{-_h3y zvT*b8I%wByJrNz4caPuW9Cl~sf$cF;) zr0R)@VWj&p%;&2*0~Ib`PIth^K`OoLez5r-z6Y(EevFP;bE&RB~gT@*aE2zM&0+q^mb9S{q&ntsbif-*%}KgeLdxDzOYN>#ibZ&qYEzqt4t zd&1M=;aJIPHmVRj@=1~*3Rnwz^EjFO@XeFXLV7Sb=>TLn0^MI=g3g_|FdZIIY}Bc` zF4zWLOM66QDn?L&?_X)~9s?hs`zbxk78_2a&oCLvjx4S9nkeGUHL}tVnqF%4CEL(s*bVit zwp_9_;b{5%%Rj3Yo$B-m&hh~fE&v|yntjd3u!=5=uE01Wz%#oEwFlIPJ}yGpWC1~%c2_yfJqyrmLPCT7^ouJu_?ft9nz**u>X0lXU@@u(@sZT-N1 z`OIvX>SDWku^58I9o^-&jH0xT7rD=C!G_(u>3PQMl{H}PL_t}H(`33P6I1uBt&-63 zB#n>`W7>!!_h`(af?Z$VY9<)lfIVn|Ac6qfl6k}ey#yS7tNgAzB{(;L+U;uP@qPu3 z#9+o9A)f}C87l%2C_YZe-s=on-Re>S&ph^bTPKP(*)g`ziA*;Xo6PzgV(SpTcq}$_ zaX${SZzkPCZQ$|11mY+QO~A^~N2BrnjdEv(AXL2!cw_l+dVht9i2kW9>eSH|#wDc<50hdi02 zk-z*WQlC8@JsckO%-?0SUuU?Pt=;T&lPRujt((G3Q`&;gaxrE;%^)8NmF;Hug4}&7 z5wzESCkw#4H&A`4Mm3?1A=PQ&g%M`H!fx`tt>q zOuS%1WnIFEJ8s*xBQFyQ>-sKZk!zrpcklj1T+A5X{ofInb0aRZY1!%j#k+Hc?0}N& z+5aE!B$w+Gigs{eO=t}*HWR;Mso%SJR7ESlcD?rTc+YMHqeX{U_6ObDAc?Pu7MB$m z3i-mTxTyB@&#vpgQ2zZ=fu3K5r6Lz)E-?h7&q?(!JQcyKi`kuS#G2-`gV`cW;(j3l zuE+YTG%MbZhjq>y-(1r*5=`CFdn-_*2pRtVI%GKu4{f)~`4YoWE|Xv`g@83jI(k~> zt_lqJ<170;gr%%F%VN$8>zBif9%@p5rIr5}gFuA*!PxW%=CleiF$sCKSO>f0(|DQV z$GLcU*YgwP9UrmiqCCr;RPuGY?M5(KB2*nzC=~h#W1iHyEW6IvZ;%Y<+m9Qnqel-G ziX8CTov}^S#V92ifh>eDFvQU&wcZM=>oHJ;MA~WFtFJH8n#Z=>2#a(s(+?fbkD`wd zlqM>7mWCd-H;m_*bro zgyi>q_ub(IuY%$%{}1!CQ_)ZM>&46xvv1CIW`ho=g(btj5Ng`ORu6S&psAuLz8?5n z#bgUoK`yD`e9NIi9S57;!liWp5`-GUD@|1_9$yX-(6*?7;CMR3{j%BkF^RH^S%~Hu z(U+CbzGCts9JpK~s*6o5xN|f<1-KUJj|hPavdAZ&QP_G?SiFqIV0hHEs_(!Bi_`1W z26HW25}@m$pW7ABU9)T2=;{PN2R7{ROV&kG)?O_EpIa=2HpB1wbd+B zNeu{QjrUV}*8F;UkAwgUp&V=rIs*QH>7=e$%gswx-zjcenakYVj z9fKOLJSawIwlRt6s@gew+M6p#o6j3P+}V_=TUm`L8U!URxO7<-zJ6DTUiI~IPH4l+ zdVL%U-k$_*np2Mw^b*Jomhi7=ae_{j5)%nJL|BLHUGeccI4yX=H_8y0l=cj|Ed_mJ zcD%>9V8U2Kl!9I}u_-Ty**+EZ%^O==eGJVr$~;L^-R-EGmt9Y!*PmzQ2NtwhYTM&b z1WySxOmg=OQI6)XjD~rlUnPh_ayeFhudRn+k`aph8_-kZmeVGX-xHhk>NM{09Urh043# z!xp=vTWc(Y4A6c~Tr*fc%3db!1pkp?LQ6C5PcpveOG)d$(eNvKy z*v;8Be0dzXJJx3xDp#;x-er4QwNr+?2@$=0N}tdG_E@m>MzBsaj7V(`I1FwchJ$=E1s zM^J-zlO`jG(HQz^T(Dogd6*Qfez5Xjs{Y1}uPHp!T{o^g*`HbG)==ptlpJ{!FnBf$ zU3jZ=*gA#`FvK(}w2+Lt;K`ox5`0AH-pt1%`FmHrLkxYXTwhv2z!I>2mP*7Q@2#rr zRtXnXhr&Y!x)6PNl}_AFoRPf_osow6Z2!7`e?~Icpr@}#*({kVwB8%$vd|EPzW?JJ z(kh<#n$l5+ax3A-8wr$$ zeiIli6#T;up(*-q_8M-pYgB;(1N$(q#RoU9T*a(J_$E%6&ky@vO*cYCF8B*a$V=Rv z1b*^U#a@#P;>a9_1eDyF{x^9KLE9_01i9;j(5vg%C7to#kMkG)6RgoIn3Xt|LZ4=F zxIUkR;0VdgKEyuk#I9#6jq*_)(cMX}byNQb${ycq>Yrk!)Ar!UZ?m~v&BKj`XpQ|~ zr?6CX0WWxc%Lmd$?b~@4VlZ$8{wu2C*fuTQKR-fs)#_*^-X;5^3eJaP(AZ>azW$H@ z!;IC26-?gz7c=%hSsf|<`dDq)vF$-yUSs2>Qk%_ZW4_o(?7I-BKK0~elKP?KpvNBJ zk!9<8y(z$}{8FgtlPBl@!vbg$a5`E^n=YRV-bj}gSH3j(G64;O-HUg_btK1(7?#S{ zzV0Bf$rYsU2=A*GQQ+H~+~@@RBVfBUPmZ zdHRPJrWPU=X!{kn!9Mt>bKoe#AVVX+U?y`dyn$4U#Y0hc=LwatqphuKVsPY8jA8|c z(+gQuH)KMfw%X1gb|kv%>zr?GA0yUj=oz1&R#So-?=fy|QHw{glR->UjoMvnmf;VG zX0#>1;)kC)P8KgZETv1a+n~U4cb%!arR@2*3kfPn0udo$anbwisv~<9I{*227iPlR$7Q`0D7X&dZnt-1 ztsN(t__UUNYB>H7-)2}H`S;f^qwxILw#499Ma9_hb^-^IFXIpAno^|C)KxPYvNNGb zPh@53M>AnG0*{8kiN2i}plmDN%VM@H_vH!SPavrn;)A#DfO=_%?>>f(%CB?47a}{5 z$^1|?ksKz)WWBXs&k?yNiPa^4i}2yu=E^UEjjCf4?P%PV(aLyVvXR<-BgigAAlJ5EGoZwqn@5?OwFS&Z?d_Q9$tRDg|zy zD4X~WuAeCTHgp-+frEM_NCWzCM)68pMQ#ChA{ zQ{MQ(F%&#ct3uwO&?Fq(3x=OTR+>1W5)F+Ss9l~A&fVQ!Zz-Pf`0U_f&%(q?e(0^> zRslHZHt`#vOfKclx=Jkz7r>DSXdd=k_)urIz?D(65FVTe`mi}-ar%)iL_UPg&brAX z&`u*X5us^xx|G74t?}oV%fi6SsQ~cf*$;sJAFRL}O{mvd) z@p{9rJ*{;=VW)1Hq+uo$Cc>7y4UM6HKkd@MvYVu%aG?S zrN5de`8d;{gpOFg+ZGE4@!}xr&Kg^{cm-mkX~~n$(r?zUi%Oly77hMnDc$MyB7R-2js#@^M^hr9R3 zj2rB}5I5aWsUA96RQH>4!`{!hTA%R@HsxAjkScW;TU=k4N3Ydbb21}f-Y0vdKh7m- zdbie|@QI0bE=Bh0cHdBxXy-54nmDC>1kt=Vi5x+k^`|_apKXOSn)uAlpF=?iA8miM z@Y3O+%a9DVElUb@`z#_6fQO{_p?XFGs^>RSf6VIZdTcJw~9@P#{G2T zI)E#c9+p{mK%W@fp6iJ#QAOW%3V4ygRd~;Bc4{36)tSe!r&il!g+1ch#@XhCaO5I& z!5b)W;nzpN<#GB5KyI3Z)IeTbOArc z_xNKCc1NX9)>Xmbq}rd4ThaatPRc87Cq%*H>B6Fd@qEx#N9_b~k#qs9HE4!pSJGyj z*ts1ioE5++w^PdQY~9Z0yzRPt@Vx7E({ss=pENpZXT0rj{zJridJpMD?K1}SC#s1G za-!a-7Nqr|b$c6f`#p;=n*CnO`0(1UM?`qMgWH2-!~D;NAtL(|zMU=aPNI;wsvtS3 z0d$Md44HWfxpcW?b>0cWPdYo2fO5{@Phk8D%s3@0`69r304WwjOzMX}&&+hx3I?R& z_2&y@1WZHyD1!CTRjR!i0Tr#-(m$!^to}gcqVHWJ8+yBKSkWzF#h0B}3FUbgGqkkk zPwn50#xb-+oX79TlUSk|kzA4He2dT7HO>XzQOSjMq-lMH{- ziHe$Kh>syP#LW*?KHTD{47EB;vw_t2k^!Y#aGmv zWHpC95XjVJ>>p2G+kMS9&t!mK2o0-1zBPzl6vl@W0H(C)9eV5|lfo6*rv)B80W*MU zyoRuHpnSYu&bYwz`#l34mN3o@ILrIBtBbMutIOrGWa}6l7!rWBg&W>c zpxK_iFmON=+;ey@b+BeG{BLuhD7uK8{k)NqA3Em4@kJ}=voB^oy&y|kdE4*ri)Fm?)0)JjEZymDwTZvju|iTgW+1 zUl^FzWpak{AcBZzI*nH>fPRf89&XL2{oG%O?Qpv?F_e9_*ejmM4Ok3Z3);V_Qis*R zroPKnsN=IrB`L{?HfkwePNZ#Ie~Ko^IQxC37g(eAjvIfk!qbWMC2M&bpxzq)IF%W4Cy7lN zYv@>c*Pn)laAcisS`8&Y2WZa>6U3G(?ctYgHIJWW^54F9*5Sr?#9yYJVl#IP3Z+0O z`pu_XSkx6e7){56Ht(4ZUO&`fv5xGs?u`nZ)_SpYja;8S$e|9UGxKVc$M1nSXgIC15`(B5{P} z{an-LYXq@A&r!E15YncY`Y;YU&orWmHp;#kzu%R*L}S?qaQ%~@W0sE8j;nq$8TO$+ z=s$igdrk-w&ZIA~g-7Nk)pah`+_^l{z`qF7rOWcIG`%KVdKuNRM;P!wuJb>z%=<1~ zpb_e*(q?({44`^Rh3Fn>?ZwguG?penel>9B4`PNXe~G+`t9!$K=|p_9KG4KzNZ(9A z?0;#^|HVZy;k3~H->_@{Ur6BahofKJA+EgyxBgy78f2^%yL}oU!Peb~sXjbq9hb=HRNxu%H+y{w{#p4pw)?)_O!J)E8}q4Q ze5co=`C|A1HR-GIF{REvj~iKdgRH0vzrWoSA~hEke);D&{hw!oNzHC@YM;>@k1YAS z#;WV;iv?qd=-<8Gu?Vqky!PFEMqBx_lvRy%>^DGs`@!8;exgYb7HG=Mh*q%*RiZMD zQ04An|BEA@jzi6Zl-r=bA3ANrjtfs*cN={fS`MfXl(Uw7AUl6*kWb)@39zmzf9Js! z3=|6&BBv8eS7m zzGZ{yLcfHQw&M+-Vy)xx2+S%|GG^`SD zc`;LZPlZ`I^?kz%;BZ)N5kyqQ2$|+^nGKv zGG~R}|IIW8?G70MfR{4Oi=gT)oEk#vi-+)A>XS20YoRC;fcGR7QMxG5!%}VyK8XNC zQuTXjLOyJLl(K%&AV6rhc=WR2ML9>qsWGp=f?^v$aLIjQ)nSpJET6ooAv!kZPX`1k z^0JIr_jB9i$WL=UMLM*rU%wsYE6E^twPrCPG8o_bGXo;uX*sXxYmZ+nHQN!k8MKtl zaG^K#a|{VxXW2;+W+NGa)LR-Gv>lU*)3wx@!pvO1m>UY2(m2owOHKDPn%|1 z&7vKF1@k^l^vd)j#X$+i*o2sE`%0_Zn|)Af+=ez--u_PRV*kEJ$u9`jvnO4m3ABcE zoEdOw8_)$wooi4<(!=P<{Sa#5(ldVZJT=62&kh3(A7cb*$8f7l2_HK`r*B*d^tW`y zTa?J&g_I{+HXasInLR~&89P@QoilU#=adS16?V0BgV^;AAqKs2Rd3s`ZE2B2r$FQl zLhqa!vpOPR$!fk>-kCy25}4X|`vY>}%mru9CsfRyCJDSe^1dbAdCD_RRaRMs{AE1f z(b3$Q6&rY-uf?|&0mNY8Qn9|>m&bQT9*^$>ahY4SX zz}_B5_BN@>yv6hWFcrxe*N};|?dKW20RzJvJn9I6x02?hvqEv(Zc+EYN22`)cDnoH zseQq_)pa;go>RO-EuNLFcah?a=+XVTt>~Z7jr&VA@NS?7NXa}VV8uaQGThjoGPVUi z3uch*lD&%QxXcu~9aqA9Ww|dQhG6#Dw?Px@q=k7yA(gX@PIW1QyL2^-(iKb+U_rb| zyP%8n%)kO-Ta5N!iASU**zigHI?oyv+65GL7+k9Q9{_#;zaBzm>*tZr*S-GO?pjHR zVQH!jLYm3^GC(eiQ1zt546n{N%autUKDciBrXuLe@8Jb+=vkIe)+`j{f4(&muq_ln zms^QD3;brMet&5C4#~aOy}}L}t1p-JEf;u`0pi0!v{KG3x5s0awn3rSLoVPz3ub*; zak`Q-zwL|JdX|CVYKGTl$Il2SKBIWgSz|Cpzn$DGl5Zgnp5zf83r`-(+&~>hkiIHj8n+DoXK~&_H zG#(EJE&lvN`yY+?FX{$nUw(f3?L1pQw)KL6-Gy$?$P{rqJG;9ZGz_DLTMX;jh#-e7 z76?F3E=DXWg^zrveU}B^3&G)nig+axe%u_tnySirKHlZuJ^DSim@7?TYz|gm4q`u) zFtQ#Ruf{HMhK|%@()4tr0~GvKOiIE}P-U3jxodoFPR2;IG&X8$3e0*!D1SV51$_}X zTJ+K_qgZ3k_Ti%u-j_Et;W**l=}3{P5B(#UotC9n;RR1ph_bzg5d_(Q_oFZ=9{vzq zotqeS)FuONllg*p$Y1;ik|h)pwxry;5;$vjXr_q!l3qF>N%+T9F0_frmCwR+FefVY zwQoG&Su<1q{ewJG|0f2$xv8Rgs7S})FP`*BcNX%GJ7p`AShF?3>QcOB-HFIhPR#0G zD1^RM5lb{tv_cUz;^`p#yGKU@E_r7MMPi6mmgBJ+HeBN*UumHijIz2f`oxN1g zPcQi@lA|YZO0AMeGVsdLVB+tI4N+oGEt@fDXdBl$3jx9PM>2&N&X5o>&N4MOmc@3K zOZyXjJ$*y1-O2{g3Ni1V&L#?uzo~K3uXJ1sD3lciQa`A5MS z#3;T{VxMDeCCH#Zdr+iJQhW1KLop1H24`5Q3xpPXfj=@>om?Wn(K$y%1JQ_KnX8Rc z-XjiF7j8o|zuyyEH5~1^{FVtwBafM`ecnQl?K61&@*?g6OOVV$1#}=LfOx|8EBtJE zVuI|zHV0K}t5}3O=9eK@ck-eugYNfOGt`;YI{u#L2-ZB6OIbb`xIwHNH{oP{?)&-F zRiFfNr*1+&;*OpMW$(#q5PEs!yI`yTW%qkl31QO2#=Oq;y)!5Z)u?O$J4l;Ru2@~- z-t;Q!nJ&<_Qi&TZhu?5i9?g%eLIFvzx-U7SsItp?TQag{7UIaTHLm!U@4`(6tEKKc z=(lM&Kn@27JKwm!JfPLhgg=(q@l%lB;>s7<`w7_?^N0{F4rh{ji?7g`R^aD7pm;>}G z_k{C?nA_tw@u27Ce3~{baPIjxqDeKs8L`NdyEg)<&V{OqWUpK^PHhP;NN^{Y5iT8C zMpvL8{>=nvCBG_;2rryuEe{!o5B0N0I`}`U()ojqFSo*ifp8^e)0J8ukUR7o?tj!K zhW>fDmgl#J+Hq^Cb@?yZv=2iLNpCcV+pw&1J{U)#+fJK}Va>_`%kQhC_lgk46#0XGCMLoWk*~J%3rnZ~2oVW)MNE*}JXROgEaX!|Xq@+AmNx@qPSXf4n1qlz;rdCE`1` zjD-kbwnu@1pE~YMNBwRvBgZCg6Jh|uFQ00rTqm|ed?RI2i(@XsN()xj&+o&Q&%p7G z(2Z@U#Ks4ESd|Im?RN6O4gcl8*K_KlNHe_pAWTNlRQByzwoMkC!9v76kk2A17+C&~ zDUCwD(f62l!(^^nUgq_@BF*_#T^b?`-j~H$eMaJS#jFw8z5M|Yyth1wXS8aodS+l^ z!eqba@M+Y}BM!7~-qD0((u2+dq6j(q`E%dyBkW~|JrHIWdRv2ha&u+GDY>J&0zfMp zrdEA+N=h4-`{N$o1M|(xj%$oA{Y3Z#6A*SXR;~HB2@k25kypv}U@Mwa2hM0Y6&%+V zjgyHQh65BR0hc}D#Q^9BR2K+4r0C;Dutdip%du`ML1NghtH-B^RiJFyD!$eE7_O!W zzd5FlprlkM)S@ax{5?*T3vOJsGFM-JZvsn}HH}zka8$n*fq^#0-f#z0?Au|+dp!T$ zK6Z_2Do80yMwi~q5;bGMrW>{6Y&gJ{aF-RPJR=c7_|u$l3S&{Eu}haVwNbhM^%wJH z?ZLCxtOGlvV>%y8f&?88oH3~Po^-QGdTu3M9>Vk~hMSEdE5<_%L;F7}ln!mF)~rw6c;}Inqhg$(o-T`J6r@l@O-! z1btKYs}hqhkFonfaxhcJ=UQz1rSRx;NH8cF@R}kxw}WksI{IBm0gYVOkWs_8Wme3~ zv99}eE~<};>r`jKCL}a(Wj`>g6ILIQb-2uR@wm(2bH_8=Tc}yu{y|AlLhHfouZq9g?9TgG*WM0-=Ukd!0{+li(E zsFcP1#;g8ZHc)I(r)A84mF=WT!#TUti)8&xB^?T#)C$%x6ue~-!+wcngQYs5inA&2 zJoHqaa{=;0si&x;+)iSuyz3s5hP`G-)2=kQZB()!{3_HGYuotcB-0D|O&aZvbUrb! z@0Ih#KSTX)G>kE5Tz^XSb{d=rJA7~*4s50T;|(sI7-un;Ju9nl4-UwVB1Y5XN4LjR zn9_PA+ezZIVYuY4`)w`QF%mB*X(gvhXr}TSX1fM&~P`=i;(SIVG5jqP5S3-LH29^oS=xopXW}oN#+xDG4&8bpD$NUj% zCHoLq7?}8bx^Y%fe-cW$Ra3FM|3rb7`Dkxo95h#ncKK)c?Dn&S6Wkk=$6=A-{bgsX zOmAfYka2T+!@7E=llD806Yv+g`}?za19N&izagTNeFQVA{K(+#j4H&@MfS@uGO_S* z;Etu1^Zz34t-{*wqi@e71ozV7*3v?8cMBDyXp38MC=SI55}-hfyKA9Pq`14Z1efA& zg#ZZ-K?B44KXcAAb2B${m-{@=Z-4jNYkk&ixRoyin)MAu7eAHQ%>A>G=Z*Qp2q^q3o?~`yQ){fprop*K0xb#&FmSqLY z#Jo`STI-rJ{;Ps>2OA~8_q-xcwYOwl9a-wD*al!w z(jt0b)(8t5DYli#JXctZa8l0$cq`YWx75J*!BbE@kb}`4Q+Tv7mFYHRqHX_{Zqete!!6E zCp`bxzuR)QG%}!+WWn&k`<|C`%)98RZy6kLl9(GMV=1lK?)%Z@xBa(<70)ZHV|M6` zhK|+V?(R3pH-8B#5dU@OUEU#KUrE7d@$C-(o9|46o+n1UGz4IF@M{$cd)YDFq*Y{^ z2lz`$t>L+kl?U-aTAg|&`Ch&he*Z(-^le{ufDpe3jg{Igi-*d8H8%^dB+Ki{3p?B{ zJ_zjj%~d>9D6Y>PW9@X<|M)KBEDe_q^k~Rb|ST`gxW?x)IoI zxTkl0tIC0iI+}hi!^rxJXhhj%75p_{&Sd+nUElfL_I9Q-eqyg~BKl-w+WolA@!fxW zU!VU+toE+%|5iWemfOZVgb#0{5vwd>n#CD29b?v-dMz^}qxqh6Xh^*8D$UKKUy{uS zX|iMSGm!Cr4=qK+xscT0Gz+} zxy=%a_pG}21Du$k`Kn*gMLZz1W+AQJvrCn@__Nen@G=`fdk=|JjCU89!ct79b=mLp zAakAbiiGV=B>^2_z~H3=1#P&D*CdKXgj5qQ>s|)L`6VhQ6jAzw{5NOMS3v*|MP-ER ztxQ*d+zh8Y%!YP62u5q6noHs-EG$gnaQNU2rL5hyL^bF1~Oqk2`Cf-#^ z=RgY6MJH5X6u?x~d&EkL`*ue3ONG;48~^pi^{LB)@rDM0GX`2>)h**HLeV&#T7H!g zQh+=NPoyriIA@nwGG~LeA)#x(gaSOm^R#LlOh~$o6;!mzb`5aE3i^aLjo?xSh^(B~ z+x~?e_<1r(JO=72)r)s)ZfH`NN#9^o&apWf>$15K4q+eJ#4snXZ{Nj7X={$&eTm#c zO}pJH&b7IQNKS{&a8rfb%>@*&gyhq9ioYSN$I(DP?#hK&W6SGh<>Gid!l}}5-P5SC z+7_=%`HZvoGk5NM#f;9xv5?0&OeVs;);OQ69O}3ll7XC4F{Y8sWYK2v5?~nzCijfr{abpQn>=HTh}9Dww=D#^QrlE05?sh`uO9(47Ru-OaxNMFj2~9^nyC7 z-rmXDoU_jZg-xCI-r4777<1iR(7e?SES2G9FAD6MGZCNa>@U}}W))n_B&9*=8ZhrO zOm>y+@?+Bv5zc>fo0-))$W7fFXBG%gGMlj{?Usl<(ZcwjgQ)Xl~m?(q+f`Pt5ys#bJ6BM zSNY;vWHoun)hc$r5!rLT){!a<@B?+y#64OTXt?m=8nDU5S>Nw?ZazQ5;X%d-@>WDerN!wnu4V49@YIF;wds|$C_haG|fW?|}B_FRSi z@{jPYwnJ72Z$l>P!zCOSs`vxYz7~1<%dJpf^J{sy=h$;iae{HS9JVr9=f`Y z)9m>^l2$+PaEb+lv1h=qz~)xvX?q{Uv3J3;VDqHa>lj2UqCT7bnZJOcY;{amksPxX z-_Oe1fxf|Q#KFOVSk8HUvPU-Q7+W^B$)imT*;=Np_d1atj%8Bl;&yCDDW}d3(V6LR zL$mAQBQn?nh9deTgX85tnYv!S`{~|?db$$REJv78Dwe4~BV`VPD~7l0g;+)x4%Wwp zL}_c;g~h|*?}IPAKS4bnkxi=!mN!ln&w3)E(x<||rPJ+Sbt2a;F0&8)Y?f{~&&%i+ z2HCb$zuCIdN5aoVyJh5hhK?2=p2@Wr{wb@hj4J8MfZ1AD*`k?WK*-HR5gtgg6J20p zFPdxQMUriE^9UuZn#XRsFB`;Ofs2@1OFwP#zd_?!5;i?(pCrcWdp}1z%59EoPpu?g zPdel8rKc#1Tbj`jP0daZpkvJF#*nq3=)qF1g_*+z+YC%%{g2b+Jvi_R{xJClKdt_c z(n`Y1t`Y8{U9a$ZGXp+>`Id`c^GhrCLwf@DyZ<$`60iekxLtbBD+!3tQTu*pB2$J} zhc}V)-@#KfCjDMxg{r3wN*65+7@w6P@w=0R|4}13|Np3w%1n3a`G^1T(F#LdA|Vbq zT%=^5B&u#q=c=qVn?5bF0yrPesMD0F=NGKVt`8A3Q`@+u_p){p` z(ar+!I$Dc=$cib%#eMaC(6bx3$Ss9GAs9`kJqpXgeDBVRaBr|&P99pXX*n)V#&6k~c${KOyWd%=F^3}0mkFK8J(^9^2 zwDM1*E_u%E%V}z^EVgt*R3Z?Yc;Ln-6leE&Kg=^AiBo_M_=!>}x7o`C4@yeZtyPBa z+_a^-p0B`&J)RK*$%dY&s;iMVF>l$RI$6ti9lm_ABIpnYDFZ|=BZvg8GQX@hecktz z8qgf5LRNG*aNcZ9hfb`!ULy&qemUanesr^)>p9j3gjPx))w`VR+*MW7vJ9&~3-qzr zF>2%=<^pDD1C0PhPs;4@KM{u)=g>W8_7QM+?!QG0)-Iimj$f?T35&JalUfV&aWKI)RN|v@=J+kIgQf{`6JdAMtn9*Mt8m zRuWJ+lR&(Q#;fP*MY2%ga^JYlxkuKI!0*g0u#&{U7FlZidZWN#FTzBNvmwTJz3@51 zxVqr2vqn8SyNBb2Bli4I42&OEA*c4VnA)8caCl?;PT%s{R(UeYm!A^FkEcJ7V-?K* zW!L48gNaDGL(S1fOHVlVzc(3vk;p`>nj(j-U-E4l3S`_^-{|XxZ_}z>xCAt8dxG?%qaa zK8)9PY}|Y$N*D(Bgc!{|y$Kq$d_GEz6)|Xst4P*uh-{k8UTZEEV273YrIwMneT?9jLS@ z_`V@e>uS)*i|2uV|3F&RQH+w-5`91V!3oC60K!G;ex{9}PzMHU2WF2rTh=rS6Qxn1 zn8Q6b!B^HN+B~(cK315}|(c2I{s_EyW7?PI~QL=Q|MhfOx0?RQo>& zRh^6%#t-hw)vN5)Z??RNIlcWWo*?SFm$7c#m&w=l(U4z&2khEX z>qlSP)Y}&Wn^}a9CBjQOJZ9?Z!}pziHNk$2en;Kj%RHa=CYS|Xi$F$QC&w4wKOLtBd>7>B>%#>Mzz!HkuL?(d<8+JQ_5ig%ZhMFADY+Em zd;Hz}no28PtNyMz8*TZCGA}mIEtqcRXjU~vXyhs7_KNz7T(ASm=&$u_63b=e_$Pfc zO0^&p9+^2GW=RG&7XFSlxJji)sY{Cy2Y*hgJ?{qg}G3%zHl$$zlc zC*U1)m{p4(A8H^2pcjPyX@d_x(y@JgeP5|x{4v|P{3T_&bd-?s13YCFsPN-vCz*B@ zx-I4Sx4i%Zb#6&W@QP|XPk!p0*>uzcKe<-Q zxR63h9a5L2pSsZ$fTwKRAEtVC~NhSmej#fzOKh-as_^rk)4ovB1^3(lQ8_mzT}Fqu6S%Dsy}V-X{&*S=Lcc ziJ%2X6Mt)>#@_3ykK-CrQ>U|jeHvL2jR}(P3&Xb??%UMX`uUvM?QEyIDOblHsz6P{ zFaVLGmI(GbfWK(6DsAyWb91s_{v9V`c7&d=rpV*3O@*^0`mw<}n|&B|!PY$k>-p3u zI$E00ARNLfK3dATz;_VSPv%m?6mt#^j<8T2Iu1$|kAXx4xYn*z;+6I?4xqAZHy5yQ z0Pp>DKU(F=T_T&A`7C5m$p2KMgy;eO_AQ`mz~Ib|Fq5}M%nvaE$CD}*mh-b@q;qGY zbNF4B0{CEPZ~Ri!@hS88^OK{X_KP{H@YQP?2(G^4*ue@D&P2Ys8S5?lqK#o@kp}_- zRK5!?Kl7nuubc4_4MpTgQ=(-tMq++{r^vwzrnpXXO)rE5a zkTT4s=K!{{sTvhy7o`GBmZncW7-$8$=zD%oVXc)p5k)3nK8A4|J%)S>a?%X>fVD{X zI8)msh{n&rZD{mST?XzH$E2<)P(oJg^tmm=)zd~s0lYT6SK{d)k5OXnjRluc+diAu zw>X~Imh_xAz+Zs=_hC`4tkf^&GNk#LWDCL->4ta)xpuZ=e}4AP7oB4|X1k`qD3^y~ zZ?8yi(6iAgkH0pJhKS_Zs5}|)s-)Xvx+&yc%(I#*Ap`#6TI15#%7}tCPK4`ef!pY* z*4uchs*R?4`IAQK8qmg?hEy0${TG$V7KWMz1W7!go<1}>B($6&u&a*SgJ6_AN`~u| z$<9!}_SwF0?>)mTbAzqh6(vH8`EPp^*TliXV#j#5=R!f2hivRR0e})Da2?{f!RT?u zvW>ohTmJKU6EeM*%-m;RZYqaI8&n5+Ht>fn8_VR)?%Dl1rkqx_{p@@T8K~nWl{$i)$##>6%oUxv z-Iuh9(#7l#+2^5(F*l?~(scUwXpdfEoU=}*me$rWfG&uaG6cCR%Ad(n$#hEYNB;aP zGWe=4rctZPm(%o3V7^S|9 zzVPYZ@53O9)|_RU#nu(DRF*74g-#DlxpK2|5f%vgq6ASXZ2=yt&N`6Y%Gz*pN0hZr=3py)xU*Q?i-$Ka^_h>IhiOph=UeU07Ah%;dv~%-TO8>(%v&AFJ9;k+p zZ%$lkP-TCU7`40XQ-jyT5s4v0i8mg+Mb!5M_}Q8Ox9ZsPKKrilTeXVoa*uGYOF)G7 z-DOL(>hs;qa?xy>WA@>0>-EoprGsV0DBh89k;ZmUQLD0!^|VpUi0CT4$4RYyFNP=^ z7bto|ndjC1vavxaprnFPlT}WH#=C|Bd!Rnov{K}#^=_W<(~cKH5hCzoxrWqg{=o#I z(ry>HQfvH>9B3#%G*ufUS&x+bPU=&x^?&x7ca%-z+-vRcFSc{|KA%Kes@eq(jJyZ! z)rdu3l=-}CL435OI|OPf1$zBBLNxP}%OsGs!#`ESBXn8e~}&E$UFA1wH#8ZY2cUnQ_1!a-3YBdhbkqd`ziPSNvxC);WWU3vSA7AZq#s_sL6Wd#<$pH{Sce@-)qINH8 zAQ%uJQXQj<1&FDco%{EA_gQ3Nz#D~-jT%eK6B_VE2FK2JhpPkO6F3bWoeildfby@o zTCbuY_tw;JOFj6Vm2$E&Jza5S4IfxTWAP(VtNK~kk8jm{nnpx|{(@#h_9Ee%{>43g zqiC1Us{`Y5rhhS`F^N64!|qwNiTS@egmEk-X52!+%$hjw^hoD~M7lmc`-20)L06Wo zk}b?uu=&=~K%>IiTRWf7+86bP#dv_3DPOx8Qv_j-`CUQe&Hwfe@lK5g5YS?ndv z^_4hdlz61cAyK&nkg(`Y1pC!6#p6(ikHAu&OjnIkD%#*d{vG;10Vrda*U$uO;v~ji zM1OhBhF6;4d#1a3-8Viiro?w_suJG3pKws+ar)K_*+3br{%d`a^bl|C0HY)ZtaVbY z7OxYoz|U+j0&3_E848 z2ty~kvMdg4fM!b+@B5ZZg5otMXGod`RkeJ$-^jONNj`}qO^TLATH|L_^L`ZXeg&hR zOr=zml)!yerxn-DF2rWaLWh&Nu^6m5Dp*H9%J(dQ6{*(n*m%Qm%8Y(Ci2Z4;@b5H$ zXpuZu2sibOS;dBUpUVL_L;xqJct3QA_8vN#XM~zREP{T~R(L`(!Ni=uN(k_@iej6S z=k^O{TARaVrUUxx00f#$=s#mUlL*@&wAQWK2IqnKQoz*5_&2KEklBR1yzG|ZIHHEM z(ZoA!D&h!&jw?qT)9JOF?{`jtb!A=FMSJclShbPwaZ!6|{Z)^H#6zkN;9s*)`qcB0 zfKzOg0T#sigObJ9#J%RD*h}-4E19-nF5{bL&ZXA>(< z8XWUK@h!yM;dSgLbVb-+e`Vzk+wqLksyb%V&daL7ITF48M`J!l z*6Ahht(?S*PTC(VdNNpc3m-c_cZSK`>?Oq{yD z{w0%#p;svS-od7E;PGN4-px^xCURlgKBR=tYVMEp&}DYZI80(+fA%^=!#I%a<}hmQ zQ;q9xyJgV-QP&7ZKr6ULzPnZqxji8}Y|gBG304f=CHoo=V+iVZ2tRpzh<#djEF+lg zK9<$dISyUnKbi4bYI8i9G1;eX7_wMx`>cQe5O?z%Zk8yQzmRHZABXoN*=$!%%TL=Z z%B@GotfC%i6rby8=(w5bNB2^5T}|B|(}59XW=+CmFrHZUZh7D;2mYXti0~UgAuZ0p zfDHOO3!t7)`I-;bNzaox)D(} zof2}jI2h1T-s7Zuq~P$G362IclDPRhc&ic zRX)L|s(j5vrRuTOyd>Q{iM5;S@K$JZUOf6|)SC2CC8yI4P7)oSG*a?4RaX=$$6W9x zBY&1Fs_;kr)zMP-CU~h7h}wH?6|Me;f*SngCF$GXxYN0C=37gTot-`AmuGuN7^c8% z$V$ohsOI{^$PlQa#594Y!w~$Q!Ay3Siw$VN=zF>PN;>NMJULp`XPOT9)aL}JQkCz9>npiS`cOennbp6D|{`OG@0V19FG`##>s3x{?tsoQ0yqc>-h>kE!_ zue9Go>Qm~{Z~<$6udk=?A6o*cYTF`wC8ZoeB5qtHL&t?1H5< z2%|bhV|lAD?l(rJ|2GSOXgID#UXQTw6s6b5NEYLsTPR#^Z`W%=dlXv3_j!*xV2+w& zVNr2YsVe*Gv_U!Z(cSNyQ&ca!4cGz`ecNjLunBeNa=m5Yeg@bI2%8eeyyk%@OvU&B zQ9%)iKeMM5aDrP=`A6bR7fKdyLNFCi@4g|w1V#(@rNSxI$9@HM>BUB)(;TlgKOmL? zPQ+;$%un-30SRkV%3;;OsSOY?@4MbA1`6IVUrW4Gr4uK;aVKB-uJI)=DK7;g&P1J< zS0TS@!!yJkzh0@AKFco(XcBohBqBVoz{_%2rfBC;0MMPP+s)0AAgb!@PmjpOe zZPL>ivLb#&1u!U7>5%aj3H)dumOJXz1LIV)(s+$Z67&~}9sBg&w z59%9&m3yx;kl6yX2QETh%K zrs&1Sl_wnplE;phSUe)yx4}MO2vO9Kw-WSyNh~jN@k48S80@AXR)%)AzGICBzHR}w zww%1mO#VyH+V#rkR`o;zHFWsx+xDFg)kAEpZnD2$Lkf|G&ab2$elSOI#vayeSZ?Tz z9hQupEnf%w1se?_ydJ*isppAK#>U8JP$kd&6UidxFqq0xS&Xoi@nZiidD4z-^8ODi z6LjXafMda0-rCQGTU{C#BZUovKApfbg}}!L?H3;zwbH*rqTEVc>Y1h!-IRyIYW8zhilTG4on44fY%DwUS((h z(uwy87JM$?lzUxZ<{P{Drk@*k+uZ_k6ee{;f{OjT7~ARGaQLt$0e>kRZLuiC{yxod z8^M3n9BW|UCNKpCCMz3Txs|4puIi0#4%+$$aRmu^sMSb1T{{?Cd9Bn9Fx{;)g;n}( zags09#2~o7{n_^DGM6;@$nrn9X!I%=&j-Hm_4_b~_Cwf_i4xH-u9IR(6>Beu zL?RfyqWgKCaCwe`_bivh$0~qZyktk*^w>gS{Ybd?DsJd*FjwgVRR(~ydoRo#oYj0yt+md#$i zgVI;8?FGBfPpWR_G3$Je#fym7fvetPO$hI~7F*??pPv7jd1I0mrwzG=JEnStg;9dq zs?H36KQ($@(mJ$^Q^ zAw#19@9<2He<)?$gE4|agUN)!x7?sK&9nPC(wtDBJacs3B6Q`h=xF#L_e%ksl%gtw zxU%IWp^7{X$$h_mJ>J|A!?vJg=wr!+TDjVE@m_WMtMieDr{!`%gQURKefzn3&&B7& zxv|8v#;#zxw-tkY?w@&X|Ltby7v*!6FU}F!pIE-sX$a%wY3D&LLb+})OS0Gd*SlRD z)?SuCGVz>*%{SkIG%)KM$_;P)i_#HyPeIj%A;Uc8%CKxePt~rx!n||LDfgw3hoe6= zvy1isf(1^ZV3G!`%j|VtVyk47#G7fTd@A=K-BF&>8BkU~=f;Sv^`WBYDOeIJ2CaIBF{Fa??% zZlw}g-VCzu(u%3jMsN-uNP7Ozo>Fj8kNcY%q&oTfnW@Tq_8kOf_gP-bK1*b{umiz6 z___5{EO~lwGe9Rd$KKg7vOy+5YB7+jf_GcjJMRn$^b7?0!lLdqMWVyT%Ps%a<4<@@e+auEXtx&t!+hMeoy#BHmhY7*H=cJEH+VVhZ?{@}^c(nNcDT}xV)GKLiG9o5bMCZY zA9VPi)A%-!=?ZT)b(rMg+sYqWxM{0?Q@-J=U)ZsEaencZ?kX-;g`MU@%!|Byl?oO) z5=|9?o|loIpG#x76rZi-XIm`~P)`;ujG?d7_Y<=nD7My@uTqJBIJ1hFm|KXG#-wj+ zHYcs3W1dp8u)Kryd(8%)?)o4XyfQSm>VHX;>6%;V&!%1v#wg1qZ;!Whp3F3cKG+tH zLV5k3#;_0`3s(jZyLk!S>5z0MXsJ6|NXnYjdDu7Mu&!VgM$t=hC!XM$Hs4uB?J87A z2B`p_F%hL_X4>%1&ziNe0~Ex3ttv82;pvCDvLmD`d6@-Pq2$qiot5}=WYdxBZ!?tj-&tcw`Qm3OUw<|3pPK@Fmufo$4ebZ`(&ZFaC z!rvmhnv;tWiikEN0aQ5TbD*T$g>L_qyv_^I%pdR4JbInjuR%u(G@5bPCn-i}Gc(IF zEr_~*hr4_Vo}R_itf(mCA6D<$38oPhS27qmCf5ro65hmj??G#Wy-{usegZF;(~g#eI`dYWo@z~)uit&W*R9><24^56GseP)jh?x^WwOJA%@+aUT8&mLzps4!(0u>Gp zTYNd0uR+ARvDYd&qu(VkhWJbLexZHlAwegG&MVZs_c1`%#{2f0aUFNqYXxuLt4p_a zkJ&cXsa~*@@1BNAr?`}aBE%z}`QMwlDkoyDZV}X2&b#5OS{Uq6orL6U=(fR!?>$Cb z%&)h4w03M{&?q|m5X>guKh_@S+il~A>mwsE+Y$>|^QMd$VHFW|85N{Tk#;&|yRYeR z<+vdHHP+_vqr41DC#z@8OnQU>7w!_F;-k=oXL(#06;;)6{yqUkiB3Hl+7iiP3_u(I zEeOzk-J@V7l8#f`Vy60Y6W{Zq8_UXqgstkaOboFVY=rP94H*tiM#25b;2z#H{CD^< z+T&hk74#{qO%rcn)O|09AiIh{EK`Fo3j;L+dWL81s<`s~Ax2dCLXnt#ljjzh1^S7q<_+Qju^V05ZBu$8q z;*jd{#wh(FCmcT|Zaf(FcRZ}eMRYAbuQdn>HM3O=l`hVPBy@Qpl0(nX7X`CTp+2Lf zR2Z7eO2Cn5eJT5M?uKYP&gT-Q+!Yks6Nkme`1&zhZ>|Ov?FXX%G{;rj8q0t6Z}r3; z0Uuh=D+_vJ=Y>big+8v`(U8jpWm3|F3sCtp=LL`LD*Uy#5^pIDZ@38eNkNWgG4tCx zV`HV(;U?_J?wQ(+K<{rw%^@?))xi13)Sl&1q8hu`POVa+*gk!VEgS_Tju6RUZh!xs zq=CcBp-9i_J5^M*6>L$+1!u;%3}*!UlZr+0aP{hBG{#{O!MU4tQjRpB3u(mpta)>G z-~)UW^d{(WtYi_;FR+z>Egl&tc4N$}nC^#PgMT?6?pPlPvU_Cu zOj$l#n$1mPxjx-ds>lJo?p*3GmU9^FPPx@k@nW8Tx;h62Ly5}f8h`MICk8#odv32t z2DcbZh10*zdxqV!+&SbMQ@}WM<0;#elyUT5QA{5th&qwIbl+i9<_pu+j>5CK%9x^e zOU;6dhoh&Ias+aGaADzs&Wk-Ry{DNRL6C;jiRa!dy-Ll})=Gx~9qVCq8{$B6li=tD zgYh>v15NKvD`ghs^|Lf(S07TYY_EE zJP`ljMW7}R#zg#47w0F$QZs8C&*u_S=ivEItCL1<(m9szWr3=4GF!$U=_kL_4>YV) zVzx}~tS*tAcgUBih`KV7mdzMR^Fc#|?v+CU*C6+zD${u9d9nI~Z~VA5;Cr-@F6Gvv zG;N--lFC!3`-4C>7UB7~N7Lt=FdI5dx0_7$!R6j=>#h&>S<=(pBos1j26gh8&mCS|^GW?vJDM`|H88Z+bw*Lwx zonM@Hc9k&k<^9jp{l7M+HL69>Qt!z0v6m!i^O(qKHo2A>qQ^QT zZT&)b#HF)t|cah2jB<6@_m z3DFew8-ctRA?gsb9LQZY1)I-8Mp6Pek}5*k%-#1n(K+##>x^r@Hh`X{I$47qV;sm7 zpaJ)9;V@OpM$r+RvY=LLs$WD^DJ+)&bH;IrY|CGUg|tHB8-=rWm`L{dK*$-9swcEi z2Gz09{2%&yX0X_|nh=maGkk7b$P^pum#qFM?*%sy#V`rcDbQ3vUi0w@FwS_*gnfq4 zUAUJ0w5ZG(h##Nt5SBV3Mh^v@PtK21I{CmCdy8c+{_ydOk@vxW>dLK=v<}G&XcVdX z(cIcHH~DP-u`)xjLj=(7nfZr4)LsI(WgN`|nF=^D(yjM;)U?|Jn>4}Eg}b-y_m`Yz zhj&aM#++wgg{hsIkFQ-!SKXVC2VP`+t5|%(^dwBLW@>ypm`ITTUF=o0YGt&*Lz5xi?uP(xHEW%_kVWgOrh5}664~2{3YY2RywSJv!R8Er)HNn1}!k8hj`!GI{+v zd+z;Ddz;m+qKa|cqn0=C#`{0@cK&dr3CY57=gzRJ{lOW9<<0#e{1;&J?u#Jcue}5? z314GOA%nq92+PIbn|eZk2Z?N)QvI93Igsy@akF?IAcd4Bc>T*BQB(`BpQT zL9p&w7r6@0SNIx)h1{rAgn`xeDV5$3=yg$^km3$D^nD6bbm@@kEe+9|9PC>~ve6&T z*Kh#`UW+mQUz#!HAE_*vn?G9Pxi6Rq+dD-7KHXN!T{K-}`yZ78hHJcs8$fY5?~}XF zIa~XXT_9gt>J;r#S&lCT_)|k`8lC-xn@zUQq$z1W(|ZMqy?MYW2Q^X`HTPYH=zf_e zl-igMLjoJjN9mQ9%XYm)f){0p!xrS5%{7w8gaH97jJ(~fLR-aF@jmaEvpm^BCbgpZ7lpb`V%@K$f6t2Zh6{FDhcs`fSc@Rvd~Mr=`l*>Xo4!shh31-+``7YDW^+ zq4)cZn+rO9pA=A485_dSlBH%Zr&z~YF{!({b1MLE0$PkE=!eGdg3;*lkIvEztU&ZKu=Kf;~p=xh)AA_XEImJ{M4c#=z zrb`6#1i!VF)>nWGt#!KDPUI3_5>9y=dwz7}l^jPV)Of4#sdv4`P*hR*M^yh}`D*p9 z&$6H}#Pq9(hst76vvEc0=gVagw2$X;7KVVnZJpTptEVT|%}Lg*$|`oogXQX(Mt(pM z(rpZK{y`l%*T>&RIV3~z`*L{|vwZZ2Hz3}glbOZdxRpR)K=FF2Sa!ri6f0jPc}K=_ zXn((c!9KKsQtvn`;Q6O#hMdb3Vig_c2JbY@ADY(RWG4@Kos%UUxBBBpacokkOOfBa z53hCn`71$n8X0?k8OtKZIrOd>B^u2zuR1l03)aZejfAAvEObUmcV`PVR`=8dNmqyGD{`05^Zf=Vfe{8fc3uV5JK6zQZDdt%YH8>EeIE-00y8eLE8MubU zgvWHdhHC+}I?W2$U-2k9(F&_uIfn+_Ge~;=u159x6CSo6c6_p!&%OS3jxB{vm;4r@ zeRR5DUm5N8eFYT2zFhM8XGj3zybE)cMd~qIoTSiMv-;2uuo?sTw;3zTxTP*pl6xYS z@(`kW>t7e$RVy+rk1nX3n{6))^58E zE97|{AhViWUv|Eay1$J%6?d>L|9>cX?~xsH|@I;rN7yDR$$pWI`ClFNvl8R$=~ zcOq&jmskUfspzl zi5h9>XhjMh6&ahn&)T6Y=p*?R)Y;kj6dzPbBRX;R>ZxrPW~hso!OKW1O+ z60p10kB>_Dct7c6*JcFA4cYb~r$tLEW?vF}8Xk2q!& z08!{drHX>RgjToA7}Dl|Nj#PtJ6GlWr&PszIgUjZj`Jye=jnAdDkN>4(2s1{ccTiH zSx-Y6e`uG_zeSThPN&d_fzcyWL`$7;&=`#e%lGe&rm&xrSyAtR{MVxGoO{1r!7W5i z1S^DHqm$uX>qIqpOFsS|JiA4J;^$iMx75uw?p8P)**8zr68~y==6il6lHFFpsA$rJ z{3ss@cKfZYHWqBl9pCw=xs6A>0{WN6PnBK3D$0)3qZ%*4PW?jXOyXsp-y!ZnMEBw2 zIOBa%-v2x&yCX`X4Qzj#H-4cI+LT_@dUG`A~Z)-Z6$fhF&` z%eL3zzzYAGbB07<*_j6te+3`J5stxQ#aqL3!h885EDNItclRDFihbbLcUTh5kJj9J zU$-ss44(S6=*_w&ZO#}vM|)D5YUuc@YW((@91V5|)*56Vw81cW<+nymC$QDub?J+dbxx^!`l! z{;~gGpAXJsge}h-3S^j@vLa0LhF{;1{iG0jcbBkN=!Gm4*Y&c}B7rNO>?p+i7~M;) zz#U{R7~Rah{Ksa#;EYge6;s$NAI@ovJ}oOBbq0kcv}f6;8#AhJauj&ZrmXzFYQ2!( zp2IcmxWK?II?;{{`{jp(4keQ(HAYlO=tuE`W<*Z^Ph~WE`TQ3>Xk$jx3GOBR2`k+t z265|yGF-jZu>|=pO=SlkRLEWoYUY4*nme=HzB}QAb>$Hzt$Jf;rNJE_D|F>UdWk6I zf3WwEoMDlh;~z39V68oblF4eK;~A;Pj7&p3@eXagEz++L8Pk!+%^*4wqM}nt8r&Hp zI3WEN|7WB%FGlnK<*nu|z<$V<4t-j(GKP+&y=%EwUR6Hq%%XhxFcJ`L9ceoMYa|5K zNy)Ycx2Iu?<$^$*KWWSU{co2u0M7OQO;6Xc1|9GvE*L0k3X4|!8t%A znn_Bn%b#B;RWy|RgCG-;acB1%O%9}c134O`^gBTpu35(TxWaD%S$##Ib*-Oc3kgBbSY z7-m<|jymLO8hmLyS4*gGs<+t3{GR*f+&wwmLUS&oiT3glNdzj3t>WzwKJ?KdBW*6B z>@~h^?jZ8j{H<1#pS?oU{)lK;caX*Ud^>KBHG0&rwt*ex{ay5SVex>(>d$f^t|Osw zW`^lEqOcj^%wD{kmElJ&zI!Fby~*Gq^!@_Yr3e|%il@(Ipv?7_%d{0$BB+)uU@N9E z)LG^dFHhc4%=a@NO42(aDR#PWnEsD^;(C~UCD_GWwk06#1s_#0Syc|ElZ3%?>?z8` za2B*!liRhp1!%HZUt3QE$FV8dFFy z6tlrVo&A4=vk_g90TRTC_7m+3c(56)9ToM=?^-#kI1g-YF!t{yN!6ordP<`gAbfsL%XIDpk_1j1Yk=OrG+S{S zAdwX+Wuh+}Ff~+{9kDL_)`ta9)@k8YNdvMM@Ktf%wYeCp)$02DW)81~o#oZ~kmkHF ze5|m^lDdx{K*%W?T)Z>Pk6=>6LtyWzAyv39ZYG~;1Kf&w-pq-4p_#hdCJ_vcIOF}u z5gMo~7gjJsbbVwt_8vI&@W#3G3Gh)!`@(4ItmKeg#bJZ;={h1;`{YjN$MxW+J!QD- zFB&ed(aqyp92E)tL4OR=BvyqvNL=n&$YhNnnCwG!0D(E(ctF0nbf6@7*s6iX+vH=C zb|&qPXkP9p9bfAELez|sKx-J$L2GKdsT{{>&>D=LgM!S$SW};1s-zRM^KfSXeGIsG z;r)CQzREwwt8Ty3ROI`ZO!4$b=gV41)NGp2{X{r<|KY+sKLspl^o7qP^h_EP;|i{@ zOk-~psdaxi`~$I6!(WQ+^2@dUSBvFJgi!RE`cu73b@t$&_D2m(h5lDave_#Z^8!%n zZyANT=_OTQqRJzK{aqOt?Xah^Iu>1OK26)l>{FFjiRHktkHEn5?3|paD};BBCJ$n^ znf#J`{8$e(LBF^P_E3EBf3fwJQBlWjyY>v-NQ0y_(jYK22!cpUOOAkaGxQ8Y2r5bl zNS7$x-6;&+-CaX>^UnS3ckk!fYwd6I>Hlfgy4H35j`KKY`!9O~m#nHr2#ph@H8g) zlYlWU!RM1)vu^dU%lIK*GxHd2E}Z0m9zo21ytgLy*+)I;9_sakrSC3i)ZYx@nw)r<cCu!S&3x=D zuwQCKX4t7Z!}IJEQN@2)Q%e7oK=j|6KMW%nAl&iwx~2d7CiY*)v7te235 zincl`P~L*5Q*4>rM^}p@8F=jN$lMYoIz>gQ)gNk}A`WWNckh&S?(19Q`~zYLgeOR> z@^S}zsF@gpF0xwW+a%G6gE9A~KQf^``v*^xe;&e!WlLyA{VHjz3CIz`G?m1(Xc6@G zC(w^ZKUOCe<4VO`vCQAr9z;hiMf%I0N@05LvMf;3C6C1v^&i)>T{I-tasDEQ4Ww`< z#(Vba)v=-NM+^-J(r5u~pPtVsANG!ny#1iEF9b}yWYzS2dYNCKkv_w?mptDo3%f4_ zljSp(wgfoUo$fhwxB>d4hY#?63_5gJmK`X~<{oaPn9+M3TpDuU;Xfp{fqA)v#maIQ zmqwcHpoXnN2Q4+eZ(=Jx9yY*+R0tEfD@COi8_<}%I$ZhBeiN5Z=p@E;@iP_Nr1Wk>7n zaV?go_p*YpuuvoXJIjQyp^S#{tk+DLzAR^ygPiCLYrY7k&-1+k1qVw)g68fKSU4~($}8_lo|_>4FE+wA%TY@`xn+I@nv?fP7xk$@?N z@;dE1)73mWC;AGR$j?OyS*H*EJefO7rXq0bLEj<>T_DZ!2&fIoAS z7pi&EHMOQ{=r3)RZ>QMCJR2BO*XwOom~Z>T3cDVEJID}d6=4Th4dDYks=i4`=zqeF zOz9?-jiKSdF*HW4BP%;}?Xd1R>+ORiI|YQ2GR`-&8DTM)ffx-;=(yl*CD#r+PV(P1 z)*l=fsR?gppo!?mG0>A^Tt>9$G%9(8^R(B*MkJ4Aw4vUIYmh|I!w9jc67yRWutr6i zXS^n{4w*{`axNX6d)i+UME1aAzHTs&F^q@+dL#peZqZNH_SA=w?yooJBs_?6T~GnYk99 z;L(1kFQwu$pUPrC>Lw~Vft8Y`$8NUS2j^Baf0#a&`DHfmL+ZQRebD8>(eF&T3U7&w zy}Odu{A|kVXGcHej^pT zp;TJ=o^T+RHDU6*(US|ot14AT#Kf|@Bv<(5$g~yqhHMY5e%jh^(WBmzzn{opWG*_Nvk0NQC#2cg9L}i}2Hf5YV12pN zf1Yrgf}$)g9B2<##GNbxBmZjRe33Z1JP=%#W`KqmHJ-1jDoCDve7CCHdc_I-)NF}A0p{I1vQKBSh&!%rjgjFsx(^0hr7OuEsg4CG zPH(Y!iYz@#%RtNC`g7}4 zq^uiB)%;uoT{e$Z{Jfn*2?vTNe*g9RKjBa|{H9Z06etaQe$*pu{9nT*U1&mJw_SAq^2gYe!DHeMwCbZ$3@84); zQ63Kwjwy8`UX$&z6EdrltT3`A9zKH8kW;SCaNX~le?FvQg%%Jz0A3FNIIZ%3cx_l~ zM|k v7lI370RME6C|QStWCeYQO|^yUV4bD#{amKYtBR#fLLk-#d%y3i1JA>(52t z1ellPw7|UQ3_(!Lm6ZZsAfB8N{~i-mPu`xRkja zfb)P3fc{Gro%(Q&1?XA;P|h<{oR;~EG-CTi+sI{oRiv~z(qhL0AoAxTHIaxm3Hdsx zVZy=L9v}TWwPj*r?wQg_)X)%Q)%EBF;8}3y%A#TT zFBv^!bkrcAR)6ey2s*raUlOMWb*|El;14GMiV0lFl+D*P70%8UFvbyho=Ucn(vj}W zGyTrOnKIM*d28_tQ$q(b8IAs5VRL163RD9f%~>VIl5vwxSZ%azvM=BE&%JYvi_71! z$#^r>#~Re?4o4c@k1}QQ)SLCEM#e(I>Ee6@m|^*%`a}T;$Fk;7u{1_^%@05= zNB%jEsTnrKKvXTI@!G<|06CP5t~zt~Sy!_@Z6k+@XVOw#a=pq_Qm1&`#&L>vW1 zvT~AUd9yv>)icEn9c9C)dofvcIBEA^7{7)1M?3+~LaeH|QS>$Ck;xTnaW4Qyw)8S} zcypTV`kcz$zxv#?3Ua$rLQHHzxp{92Kb$@zb`BM2_rCRm&@|HpTKpxO1;==)VQAX7 zAIu{Nx*giR;UFBCy@JITE$mFQu5y|!pqaqlsBne8rDXeGxvg_xz> zlw1YS$h^Z$U`X_!E8}4&_c%^Jt3ThW`mx7Rt%-4I^>?0n>W=`661LL|pf+cel z?q?7(lurCBAHR)QDI;f>9<4`q&tTpJ?dtOm#7@8VooORPb%r-3j5vy4AX%r($GCd! z8Ed9<3`}FnSI#XCl}J&`m{)g z8j2Y*xDJ05+e&}U-eL1+nLmSR9NUWY<4rrXw@Lmyerm=&?v*YPNOS*`=i?&38OnJf z4}_k@KFe8=H7XvP$q+T5T`5Hg+wz6S#Z?f-bp4ee<$S&Kx$veA4Cp!w4Sq`B=3p-| z80OEAo%eTS>w=A$H0fScE92%Fe-%-M{EuAebyt}jZeIW4;OT;}c%|=A<=8U%|3i>- zI?&7Q_MeSs&hGzrjfUNBmmB*ZE4=Yn7rJ|W{{M3Rc^z;Z(&Un)VRz}<}KS! zldrou9$0P8LKa*K2oSA*o4Fgnkbe)an5{q2Qvc9L0w7863CaY^4o*q~-*t~K}Y32<8^7-`BjO8B)2HZVs`7})IvklP&+RMWzI|>e9fZ9_% zz&JlRQ;>w&)3|M^rPD09SohrS_M@-Qg~$OIk*>WL`J-k#RGjuRSpSSL6K^BS-|OnU50G1i!lV%mz(!>)Huj{RGoQnCszIXw)i_VRV~ zbZ9RR*r3}cZ>Xv12%EzrNnGa`rvS&gzxYE9Oam!`supK_QSUmFY^xp_PwsVh(ycU+ zbdq$JhsX%|8WH-mtn&QyHUmNwWL=TLxWZ+T-`e`_Tk`607TIb8vJ{T%ivxFNHu0O? z)Ruu3khBU5h)NBZ;E`qxfSA4%wPVfr;r~&aSYqi60l?6+vK?3eYDQ{qzQ-%&WhD{P zPB}_o{dkgqSCi}neJ86u7$S1w^3jv<6H*O*`Q#pn_s)1Y*78q(sR; z0*~YqeH>2wuV{Ym8q#8gEB!ti04{iWRh11B-{GQ}{Q%lB9MD?I6as7t6`b zoP|ynYGap=J{;+opu+}$*qgzAduydmhHFu*nVTLpo& zq(1sBevOd9NxXkFpK8;c;#G{A zm)MwGq91S)3|%%W9x#aW4gPsA1P?>^=vwijb&Yb$>yhI4?}wGd37M&UncB-`A0NFD z@S^Q?pYu(hUy}>ZX84BH<i zowby)SiAXGrUK;*Ii-~o%Pc9mv@U67VV120Ath`am_ zd#OsfCa65mJchRp4aKA#SzOmlaFef%^iw?i;jrdQ98$ajPUV+9^r>#7Yg&_!xzN-35D$s;zA1e6rrlJwb-iV^DeHNEd3I2)QAZ&&& znI#AeSaC|gq8nxaiq|-(L*wmZEBot|5E5f&HX$#k?>l}W{v*vwTOU#RV?DpM;-;dx zsKTMNg+0e}zpHyrZz=-=p+tUg5!bST4m+qm49Yk+?B;M5J|utB zZX5c!adCE9e(x-P*94KdZYK^S4!rKv?w;trTD~n_#>;rvw^;|N@Rff3PjSfgd9Ez| zoeqPJa$lVuV=KyM&ky9c_9{swMtGU-BFv(m=> zKQ+ViP45pkfAw!{H~IZ9=4@N~?42q~VBq2_{@;e2rT^ZE?gxK)f1ez#RUSXv0)*YoQ&?~7l?d|(BMbbj{0`!q-ZjL>+` z@Emoa(-u>1e(cT8a*(z=28gkT16~$TDID#bj8x^nJZBiZq)1BRi&k=HHt|@Ta{c`T z3L@q^Ei3sZA~25gO${BZT0|t2SxxvZHAsFOXGQ>+l2=myA{cEFz#+1uXY|Z0?*~EI z$w`vyy)L809Jz%7FR)U>%F^XkTLfhPKu8FO_G|ObOWZL7fL7k{*cgx3%rheTbb`jK z3-m)^9bj$o#KHUXaKNT2n3BnrWR@MEr8Zm-00<*g+uD3JPs2<8O1%)&9-UiQSSYcL^}L=I01O7;VyVO_VkQb% za~tHfBj`TZ92oA&n}anGTw z28pKSqgO-=VeQ%m3jee|(N{DS97=;TpqKTK@~5j-@1D{u7i0{*6z&&CR>9_)0|LZmR))TOF@^Xn`xZD+ z@G2dgYIvm_?xbL<2l8Cmow-_gZC&@Bqvz^SHW-ElSf5(4I3Q4tqDLeH-zDRSd6Obm zwPf3j(Jh`ic8%Ii&7{fz@OLa>KrOr}Q~vsWQBS9Td|?V?1A||`j*bw`c%RSo_Lvo7 zGNpxYR+l4%W`aSRV9y_9-R_jwKIMiu%^VtI(*%z7?1}yxXobBU9gf&qFR)*%a$+9n z10VaS9WtNn;8?H1q_RO(gdRz_3Z2lN*@2txp5KlxPKu)4tM|{~e;wP@*m&g6>G*$E zW$+Ct%DL1YaEO9Wq<(Ju50{aP6u#?y$)ECBEIca>6otQg`u2 z(cSHl&;43cTGe5T%5_&zmZ5vKSv^hiU&!{yVM7fQQ zqhNed98c>!CO!a!ouQocs6ybxr0);DrULhWGTT9bN9II&=J67&n&eEFXZm|hn%^20 zl|~q4Hg%#D7@ec}Oy<9!FGsBEH0jrHD6XU{Bd58Hj4N@N(MN6u6rSZwgkfz08dHm?fxQSz| z%pGj~hgdf@`$Xl#yuMKt6hYPWOu$tws9_j-=&=nT*rZ~I4BNHx*IhQ?I8u9Q0XlB- z$P~i*-urD!F4F+n?$WR@sPc?o=AL<_2Z!J~lCM;_C_K&Dj5S)~`{4u!9QiLtsJ*0l zi%JNs&f)u9n@ZzQzKjsvE|0SrXpw5Ix?ZgI={H^?4HBKT7m~uv`!xrbAXjuJ#N3#u zzsx5xb!k`G^l)yGa&}XP)|-|56*AiAFHUmDO{M7@ZQc+!r$qXgN!Hs>#|yGrRpG;Q zsz~nih8ZeLEV)yhFs}A>OxYyQQ~9q#@7h1oUf85mMG>MJx~%r{6%M+8Zk$%GKh*tB zgZ_ti3w+!TWVo<+c$F?8Oqa9%VYmg85wjNKFy1KbV78J24Ki&W2sJUbR=JGXaMQR% zGF&8zu0a%1PH%snuN#*74my04t>86PfE@Y;*&mD`*j(H6QvDg$K-|+?1Rl5l^Wu_xNr}iyXnZm(p-~1msaaczJh}L+@hfWlnHY> zWd7$zx;0^3P{UXdQNlle)g#pe<1uLF#W-{;%E5S#`tOwY{rma24}pIzXG+K)e!Wb% z$T$$>>q?dkj~{3zUzAx!a87EBH6&CFtI}JtIlu%hb>nCt1xJX4c$5R~qksg7^UcZ~ zIE&;t5ta&3ZgqW*)qW3-9oq4iA%Pg?)a8m#R>eJ{mBlN{ghV9t`eD>`?4Do`vYSAQ z0UtG+cMLh&sJIO^Q664*9?L(=m}j5I0g$kh6m+;f)=v4uzX9Eyj6F81PdGXup|}`K zz8gJ30@Hwyza$*|%hpRGleK7518Wu`Tsl9{R3D9J;GXEy4hrjrh({kIBno zlJ8^kvOfmu1_7S{ai4s~8W|{+Z3$#qUoN&_{BIY4nCTH96J2At!O_X5lfPLw;5wU; zFdpt13rJ8Cm+-^jMF4{<%2Eb?So85h^82eIbKB4AKaXgKkdciz1ZlcuLJn@DL%Atp&7~|rzhHUt5=HSy;OXb2XA@VS<{bt(OOZf z+a7|hI=MjAcb3MmIJ2@F_)7BS)Me{;*ui_yoj@1?#~!=kuQH<1%@*|VXGQUz)dq-)QK9ZI6(!IT^iWJLpR3&*BedZ%3nWaKZ?<+C(GJ3MqWEC94p*N!I7dSq~=50XuWgiTo2wtRg9J?NO!QX7NROCUhNgy z93@LJB|M$HB?6`$>O~vixe*Qy6fT+#%DoDEOh={hXkSBBm8sD^k=9L84%&)OdVsCN zYL$*(&;7==;&ghrg(*CLnz)vE0sai6gvEppMP8OApCH^8(xnLH!kvalmAsT#vNR%_ zrCxs-_T>bROEhEtw3Y2|`6@nNR?fa9rO+A=he@n@h-|f@?YzF^SxKp<6&C2N!oGX; z?~gb)@8esV-|yk790lThqdrpX!Y<^ZsnO{gPc)Z4gcb=aDNf9)QLv^%oW0&6ZUKb2 zRSNnaQPT{eYlGkY?!&>IoOTye7a{2m5Aa^I1*=AN~l->=Ba2;P+1Rq#8+ zIN*7e-p&5zgMCmi@5}Qj^&vEfYH7+r7F}L(1^Gy%5$1D7ulvgL(H|a)1Ob59?Ie&a zGslc`vUtxRS)o0;VLyp_>p(k8JI76TlOSe!sjCW04$;UMTO_a?ckXXKnxvcn#toM)=q{9?!K%G+rEq;6l_X`v;x-{oP-1v4pj?()6dy<4o?^#!`|3s*wI1TN#5dZQ}Yt1ko6PGDkqw*Sb-K(yAm z^n(NCkq?>XnG&W{&@vvNpIu}*`ePkdKbOkm=0x?7`HP6evHw-aXSOHxuJ{P_x2C*>ZSe@fFS|AD;r3m% ze5=5k&4d3|#M7SPVx}8eQvh+mR zM%0|bpi<8-6F~BvmGmy)k#|r7f^nI4iiBN|_{=)2#RI_Xn~3UY?F9SSgLH>a<76)~ zWF~3ZD=NW*VOy@(D_;!*2b1+cRRC|mm7hO$Z#EV;!IYkjjdI?LKbzz)xFD>&0JWYB zK}GWtedUxa5(mqrGUijg&QE=xrNnn60LknYTYx`pYsr{9y(EWY&mtAVa8lA&zCI0( zj%I|IZJbD1^z^K-s+A;{5wkB|zamokEikzjXK!bV%g;_X#vyYvT((jnIGqj_v3`zQ zl@u`$YAkUN8EshFS}Z91{NookMyTMW@U#mt@!{sKgIp9Eyo(NM&|W2!WHi;}e_d`% zszEY!x{D6t!wvcxtRUUiby++Je%RY9+m0{&GK8{1g3Fz3fl~HF97Gpk;SAzoorja) z=|hnX;zA%(hg;7rIe@{&B0%~+J7hHwdO1}FH5MDbN>J9EvEIe7+;t=m>4EcFshAvT2fAY6b{9pm1RQkv zA~WA#DA?p+2HJewQ8ihg2^kQk3qNoIj7ErQR7hiEg}H_%m3~qO!OmGdUR1GS50LCg z;8fwYyz0oq$N+wC2S=V&dC-e0bM^vXo7U94T1gGR5LJ2GN26eS@(O07TIYvQYHNHD zsIJJegc{@-%@2}Y(}Mxgjc@bWSWlo$pq&AH<^v4NnuSnNnk}A=5=iAe;DQ zK-Hp&>bS0;gvJ6FVQb2ALxv6hU9P{+$ZG>5(gKXs6|2|0w7|S%osoPcMX@b{x{631`g{20^!?oYrTKDPU6|`?~ z_v9%E>ZSHaz_a<=?|NQGsENULc65}IEz&cr>w8~eYM`1=X`WBRJl_h1%n;S!xc7yI zUSl&QVlr70Ge>2KV44?D*M2$E;V5#TIP1kt5oSzFZ&MLerh6SRD=6cix?U+nJ*#ZS z;sJL>k##hp!*rd)?x~sn-+yE;y3w#~2aJB5F2vk2Y`>@LZ&~m$>;DAsZEg|IwJ$NP z-kCz?uj({!;jnHec5*!KCw!E=C{mc3?lM_^xZ&K)$&5=O+N@|1N}d-mD;zfKl;)$3 zN$oRRhbSR?V0ZJ&3_vDi52$>Rqyr0&)JIJ}!YO_}A)|QR=h7QSk~dy|=qDc87IHD^ zV&W}xm%?K4B3qS4>QKa7K-sIJ>-O^KroYxHihx=kKkDxZ=B5p&jwZPumh)!5 z()@;hvloA!Z}<-5($NN=qONKnF%BSg>wMHjHT}gTrWVIe75Pj#W5khAQF_2>ug5xq zO!bkoQ9@lP@d~MGe*6Bugr^0AJT=$jb~fW-7KanW0mPmKm#Cu2E@mGpT-+OFb0{KpxOXZ3gSBzb&YsmvUM-V&52L>R?^O ztEe-pK(wHcZRPHmwsce@{5F_DK%PRLXxLYcJraFXsv znm^svDOInv0Z&F&n)}#&Lez-FN2+V$VuMZ10 zoohiXPBTzBQeaGrPL#TH7D8Fm{7io33N=RdZKvz-4-Gc|EqU4>e&h+*U||%;UNX`& zf}(nHTjyGdGkgci={OM8sM@xP_$>bTenEOwnuS=jfIU+vE=I%AVcmLU9)pu{+3ar~ zwBkq`|7p$WQRx#?cOLe}6C+BbM9Z0JflCx`E=U$qzfh5SyZ47+g4ZB>)9-&xuKyZg zQdc5cSbL}hlJno9ssD_x%PW)m1ml;n8LDZ@`4tD7SN&Kr^yBk*IM-<)>V!~>vS?6if`X~*S?#a&1m z?w=P=QPopn^yNE#YBhUPO6P8`p+}R=;FVGerTed46K4ci2Yyf$4c6#c1kAsaPC9!T z!qb&x;^Sv-zQb|KVcKA)S<#QtpES7bgoOi$}2F2Ii6G>rb zNsyJNote_`;bRJ8!d*mu=nyeD!XtjzA+eHbPt`c151(yWJ)Vg210c;Xg}(>Dc;O(> zk1bp`-`fETTRSAd-Bmgf@#FD}ZoxPU99chmm%7zkBo46QWuNiC7`AmJU}bmdAs6-a zeT=uEe|7))661*L6cN|}{JqWGXu!--9W5cFuNfL}ryNPK(uO=c-*4IP^&$;e|8bmk z)-TM>@q8eSq?f^g<52_1+=-rb9Y_3thi)Zv19I>HU36BV@6UJ7aR{_E+iHG{MA^7@ zZ(_y**E~C_YiibK3cmsdj(aSuo(KsDlx#i_KrulMB=@GCUScbX9%`p^z(|oPFk{hO zc{Y0Ji9PW&niTA!#w9yNt?qWtRN!Dvfuo+H6>{|ePEP$?JxHJB`#`zx#ha#nI_(2K>Y9;O%=m7|vbNAmq4I&%Hrw+`&RDP3otSN`#HuwM{o@YMWk%_u3&+ za1!PG{(!<4>3+F&M&U8p6NQYf^2O?{yq%x8DUt5`<@Utu>YTjbBDA^Z8a)koyZhGB z$$?FGpFESkT^C%B+h$Pyl)Fv+{lOT>B#CdS^UNt|!PkT?8XF;4lfo9bMDG7CQyN`p z(olIwax1$skw=GwXFREZM`#>lo*l;xdGR8AUBcm7&3%)1WJ)VOc=>FfMIjh(;!W8A zbiX=WW-aPPhPCL21u-G@!o=*Z``EAsU40|B#1{|cT(+^>$?FY%gMGmCln`e;W4#=S z{nufI+tvW&zrP-IHR^)H>7sE8u*RP!zax{h>0~A1v(sJO&&)y&t?=+JX_c;z9{Xw6 zmMS!nw+)HN#xtJ(9#trEn;0k@g*2q1b9I!*M&e}pE=Jq2m61&+pH=)Bux9U9Q*Q9O zRCA~Pd2#=7apUb(rTg`%*wD$t;%Q~pdHPbV80^Xr?W$_+#MaB?5({9mKlb^su+DeGiWPDrjkbnCdg{|GP+9%H?iC~9{ zrNfrH!@MKUCBY)bgP%cUZwn5s0~S#aB`8)p1!-ws6C=+y66a}S-hx4QPydU=N^&#W zjTMP%s_-|y=5%z8!oN*2*MK_@r%RJK?tDJkc1b$@`%^|TG7}Z4s+cWBGE-logrr@f zLweCeS0yDSc?LmRLFy12#*)~qmyEFMRh*v%{@ZM}iE{MqG!gC}9J3?o#@Dt{95r+` zgz?^D-ylpM>rw%^xOP(OoBtAL_2EJ`V>z zo}Kvpkr}6+tMj0=71P7NKnwCdYS3XP=8k2knil3?VHlJ^e?W|K6KW(`WcMR-YXGQ<1E{i_y1aRi|}nvzNPO zve3YstM>@b>X!9ib2$^Y-1MDZOA-9Fai{|x@9-9N!pFh1&Uag8eNF#s1f9oEHOE2C z_Ncjy&LU{C(KryTzFzygh`4wh!*4(7AL}K;D&mC_;;Fw6{d7Scp|i7L&PtIQVfVT^ z-)Sv&03*lp%37uhBCEKBwaU@TiPBp*DWN3sh}GyxUroW#?4d&`wO48DIui+5*}_^m zQ8P2wAT_bJl6R>O_;47S@Oq~LNs%z?G9XKMP(=(RqPSF5u4S%6r38*uAJjw{YH;{x zrbtTyclEOB1j4d2Oe_WFE{~)!g-cngymUJQ^4ms*h~$9WKSq2iI_zC8HYT4tGA5chk7MnM*!KiGX)m1Ul-v{Hzu5Z}>ex!3?S^@CE z&-$Ky=gk79NHK3;}*Q1u){}B~J+i11=Pi(du5yvN4D$^zKb8SzlTKmOFd=BC2&Ix z506>ZNo2pS-7WP!R0=mRR1j}N$ixb>3Qf^@zD8Q=c;yOcyw~A<1bu1J=+6zNiV9a> zTwHB?%wC=O3Z6r?ra8Y(c(Gr%R&e~;*o6h-6Nkk+nX1_JAv%{c4*)<1O)WSp6vO&M zCtSRGX9Yks)X&$-Be5YdXAG7mQqs!JwE<|22Yiy?sy5mtbRZ}Lp-EBP^hDd*JO9w! z7bB6VHvGdNY8Tn&2WaDYLB|sDj0Q<-kJIl*`7bDoWn<%T-%GP>I{5WUmEk?b82W_~&| z-k*e|Am5v!(A@U9(}LWFK>QEoUm}e!e>-+C!>3+p4B;FK5pmu!lM$QZJ~Jp6!%V=) z8k}ag9HjFa-?1a;Hb?hmBlJ%C{PzQ)#ZjWp{w|(lQwimRt{~Pr{yy!e8o-$-S(4!f z+ghWg&kw=49E-GR?B!9%1Q~InF=gBg*sLAJBbm^+jZ__mNkC%U??+zh@5YJ}% z`J=|tC3*(Q6qh~^yHxy(-J@tGc{H5&trD}4K748)4S^R2*}4WPo*Kc1xc|zVw~LX! zM)Kb1Wn38*$W#ODz70VLyZ_s*G^QLUou?LKe!-Q;3-c$DDNTsfb^x!$)xmJRZEUcS zkpFwe7JoD7_3TJuSmSx6AK4eT#e2ur!|*!UGB5;XrCo*Ij%P$RB*;%;CbCDU)AyY2 zh4XI0)Vo@A$~A+iI^lR|MszwgACqev#+@-f?9Z>G`3Aq(Gw=;aYE+}|<0C86nJ)F| z;{KSZw>iznW5>Iez_x4+?PZF!-b`+~oh*%nC*EogVesL0_s-}bR03gBpQ^yq(m|>f z_X9RNiG7K346VjvjSnCy`D%;_-zAjkjw?j2pljqeYLL_j6J%#bLwM|(;|lT9Zk&lE zRmWNpsg;hRD9Y}l2XYz+HIQ&3LpU z=(2-amo@vN`amcHAEpDP1OC(fx;ze2u|f02t@ApvKZ4b|%);lgL|+0p60aOuFCEJH zgS1M2%r*Lz{qS%fJeY?(`{N-!8UJ9^_q`!6>@?$lybtv~_xbgo^~Q6XM+QUxTLEgs zJlMV5h4KGCM$GQAIPB5wukL>^2vI~Gxx*oyzR=bCt%m@{&YOharB#Q2_s`xV411H! z2dJ$xH4b>Qi#9qcNJBZ+x2X$JdMkh-6cv=jv)g2tM z3_KgU^rO2D^Ko#pZ?EqhpMirUl)EkX+G%i|$`ZZ_q~+w|3nG5i7gd0EqE=SsAe$6m z(r}oQswK!{&(kVKZ@OcQX@4s^QkQOL-Ley0lH6nh|0w;i5eQVI*};~Azp2``F@GjB ziTRrS=hZhDw?)@3C^VWX47=Mc+G{jD`paZ>D1g=K!wbf#8nMs2-(K4ynOX;WFtW&i z#3yk$6Fp2tRz)$Zy(3x*&2DtZ6q7NtBE12pAajhU0&7}pi?Mc#*z#8(QCbGSbLz~F zkJK^>?0tYfG%wH6BcefL(eTp6%SjxJ0fhq+l%9_L`J=n1XJWKJs4g_`+LVetKDY{= zo`OtKaGJEOdn|x}m%o0bX7{utK?LTp5^M&%sOkHii?Tt_g( zgbXF)X5ajFsO>nMA)T87AEhFUz!EK_#MEJHSu8sUU0geFqLt8y2rw)wg}I7Jr4|>hYj3R6?L; zp4ifPvEc#?q})n^xwn=7D#SGwm-3WA`!-v!=lXmqqs`7i2VICr*p$Rg~*t1nZ)moy~F3}qzugBn;`0lH}7pi z*oFUzOO=(=cYg*~E<*xPtOj!5Fq~Pa=A{$&`c{_60uR&6$}X1v-f^CSm6?uJ$J4Q} zcO?GRk{FBbQe1K{9Z4ZsKWqN}jHo*lnd>%59@;=gu{=znC2^H@V9NjF5wmao?-z9jx3A#)6#S~)j z_PO#h(<{`00shXU5*fVMz3R-2i?EVG=AzmfN&A-;qX z7AupBvA^o|@zG<4xNBEA)O6rtQBbv>3w5_+S$w7_e!{`QQHMyY)qqCr4j3RFVLPEz zZ87=3O{OUFVu0}-vLBY0IZ(K#368D@0sXuk!Sw4w&tewKF?@C?Zkg2S&PP6;yC{!I zM}C1wD65=&eKFGIS6hT!*!nJ9lj-wzynzu$vS$lECGHGJd3ZKz88T6bZ6yC_CSeYw zOS`&cIsPae)R53}{&y722nnbmzB_3=W&M=?U?`Qa0a?J1x;BcI1E`r6-m$vuNdkq@ zAe0ab=;X@}4jg8rS@v|b{EkmO)9u=Z_5Y^oX zgV(_v#q{QX#1C>qgklTNTJAUb5jDFXz{Yp#nQ73R>VzMETL@OUzF3_{usX&Hj z&Eh_tL_tgo|9VBw)#=x`L6^>R#NN~-6e-`S`WvTcZ&Pk3Z|!XJo!glPiK^}yG~*We znfOk=*+ZbV4IwJby{c03WL+bvqX4L;Ka*F>hUQrP10JBCS=cHM!P}Q;#-PJzzNgmx zu|m+=`>@4dgMQItSQ^C#M%|^gyl;gih`&s(So zXtxt6&8^eFpVZJk4yFUYJlQ{y4l9X$78&`hv~QO)c1>^6p4|K0_X=~}cltN&t4vD& z2h_0L@}HgPFqHHt$z<~Vyp+M==1^_V`)zIehxna7K_1!NyP28YS=oe-|9M8z$ej@3 zs(w6!5^S4)OJmLU&FpLYb<`>U!^2TW>ho_rAo>a6 ze^%sb1#B3pS(pzzdiV1XK$eN`QV_Z0SBT^PuMF2Zxjtv zP~hlf<*Dk$eXUi}u_}Y*k;6=7|J*{~3J@B-s0I76p`3z6U|8KCNO183P;#!goqV%P zS6d-h!reVE)$tp>x@SyT!2#X3GRHL;N6q!5FcBAjR3G0noF;fD(FtTzcSrwUDV z0QNB)X|Riug51PjGnB7O13o8h?Resb;*tZ}tH~8iol#Auo+}GC-3BcT9v6eaiNQkU zpDudQE=A9^K3av+@s+h(O`HT`=)T;F=D-F4w6MVfO|Hn-AW^v)MQVr~6hIMn7P1*k z7^KXL2H7a&{>jLn;D8e)yVHA5Na!FfZHKB$9p0}ATM(=OyUmI9 zxX7pO@-r>C<;Q1ZnJWQt12c+}xn`O3R4L$2O-!L41mu2hXp0sn?bakFb=`K=X>B|e zPStchhf^{@T5ww8^7JJ-QF`@jv+|3TYgQP)_}a^nK<>!gd{iQc7Cxch;Yb*+Mr2j; zTk!ny3cy#c-?=drf@#Q8(c+{IwuMJWhmM5`d?s?cKWUW%^YXks8{NI1Y8S=516t>hOK)-PJx zv6_L8O`JyH0MtVw_gLgUrPs1|IN+`EwDlDNrJU^#afoFa#Ja0A?fnTUIV!B1gHyhnKDj8-v zy;?+GG*%*9wpf>{2p=meqM0+sAbW7@2Xt@7=#&LA%n#|49L7OJH8Zv`ZDzCFOxKAy zPjy+8Z^098#^j#f0^cA5Nn-7gKScV)nP)Q_poX@unmu~$s%Jw%w-yee^M4{e1Wj^= zkjzZQ*R>X!K{sL+v}m7&n?CyJ?H7h2|9FW21$b?3P)VvzGxY3z0V!pryYi5n6J!vmt-<%=G3VNJaZhdfYw@^=g~GFTKZ!?3TmRns zKp5rum>@rL3w2qO+%BqlyxB~GOLPv?{2o4`7Y_R%H9zCKd;Dwl^g4aC6nCDGCenSE@|W2#hF# zMUL@za^0ePV<#AeMMrc4n}5|@eEW@=ci2Z(E)2@#m3D8k_+yJ&@T0}C@5%$^)n?6y zWOsF&9W+sWffaEtwl2)3;);aYiGeSSbZUfIt&&R*=sG_x_Z1yh(3EU3T*9W)|a?(ws>@DxAf}&ML;^GQ&PH9U}=>WrBg+E>24NTasi2@L%NX;fwR8fdC%{i zGjrz5{QiFad}im~=f1Dc^$8Q1eZ$zuIq|FGuk)Sv@Nw3(#EX9Q#KHiu!DXb=`rK_W z7pJZCa~}*{l!SFjvamQ-+(__9ywgaJ4Me zfb+@9prNW#q0$dXBuoMqxFV)_hCIW(L9H|g+iV;B4nxZ7C7 z%<23zgcdl=Z8oC?4tngeX^=#ny-IJwd9&?hI>t^duGjo~Cb=X38@Kx$AiIokzc1Y8 z`R{wte^`fZS#N4-?h74$S#6>#66e^5Z41}x5$gLx@g9nV40_^ILgFi~bg9>oSkI1h zUDQQa=GkOi=vBevBh;xsmCcDVb$Scj+7(|IAy>TfXz~)&#N65S} zJSWi`+OTsy`1Qc7f>@W76^AC7PE~vSn1*Sh7g*UlZr#cK(eIVYN=Lk@$X0qTwU^MZ z7*y$=E5s2DxI`or7=$=lq|uWZDREO2b36u^S~TJKIRIxH!e%9N*!3*E+)J$MHtrr0 zrVuF^b!nL}T~$rl&{`-)%`U9%jbFcaU6f?UO*{?0X4j*Akf2@>c^oq!VQFasKrEE%udvqK12m45EGA#(ZFy_axZU!E{%W7k9BStRLL&)Z}AWZ_UM6F z!lDs*VB#4-agwchq}ed${r+47zxOk}NYvlIqmh_O3Btai;II_8Jv47Nv`GxeRlAxj z>ZCNkZOM9Z**8~J;uP!v@=t%#wli@{96jZPT5AeqTR6{gixF>M^;vB&aU~I8v!94a zWF)#JCWhl@y)h#aw_ReQQR!!8Znb-@I#crj{SL(swoS>m_-m^gLxD-w^jm%m&PCPf zF??%~P+8-|9uDXgB-mbKpy7Og@4%Qvu@ggiVL$Vi5Q--;@tleWM7MWZi zl-)u!9`Iv=H)aG$o~hT0-oTlqD@_ZfyQct5zQL;wA@fG9ZwN&LfB3x@<$dfLlCthEhk5m8l^^UU-WE4P(<_ ziy%^5_}PftbyO1x`gq-n7I3&a1Eb*z&;KBJqY)brs}2b--MRcs zdVg|VXyloxE{Y!hN#n61d45N9@P0@Z7W7$T9$|ClZZ!A^%dmDT@_R+ED^VfW%zKI6 zYsy*KxoBBKiT$!q($-h%KXChTyKsUGw8-ceER39^+KH-I#x`$;YHTiI55}Wpd#BdJ z=c1g#IfN`2+F-bFQHHQe}PBCXxQHHdE!g72G85~M^So`jY8=ezq21*(ONe zY=0xuA_E*}Kl$zLUo_@_(d@tbb?v-F4IE0*4@nrKtqUxmOc2gzgqSirj+k2R#rFsc_LPIRx2oa> z9ZnH7P$>?1b<*Ka-rM#F3ec}{w{$rl+q*MYS)c+eLN2SEVGq9{XVkGKr?9nE5*Q?m zkrU%NYksV{`2`v;j4K9_-C`!t5md;3Znp65bVSJXJ0LMmE|I`gpgmbv(E{%~*-Vo5 z`s1e(AV*$hKUk$p8#{p=F0lkGu!<=|Yxi|?#a1?!$>auENb9e7k6+2bCZlT|*`t!n z*GODNJRAJu*~;>Ewg@M;cDBX?23@mTiR%0EHE_7m+=sQ>#lVD(Aa3PL#=RbyFBa`j zZ_k>1=n>8RYAL~-SN0ajWgm61CO!7~t3{uB*^T3Lfli(xXTi&_7pqOFlgLq6rP?#p zD?t@A&Xn^nQ|C=u8p?>*hi9${V(`UM$-Sbr1gmPztpX%3EYFF1`|ToI~eLNQ1shVSgi&y@2OpNZp126cF zQyKA()8%R*dcIpvX6%^`87eUntofDYON|Zkr`mttzgB`poa$lE7aNS0nZ){RUa9NK zPAdn-bByL{<_Vm)o*p>|OKWp3xtGN7C;kua?%y;D$36_cLS2bZ{+4dKr0*Eq;Hbnn zD$wED1Hb((dl?ik^59i@Br?KZaU1$0*xYVXdcrZ!&vXl_VBhDd>Iu3gdDx&pjP<+T z9zRfSy0cJu@W&-*amS{#;cvxi9O6qMr>dMk)`C;F8y?35howhFH|!a%-7^sjR!yz=C(aK$3FIs`BQ-^fu5;$rXt@Y(ULhiQG)9Nt6K zh*tSO{G`Q*VO7!~3-qFr-hgvD~0ICRKklf zTY+FW86BBe>DSn{>+@)w7f;oGV(s3x@@o~NU8GeuQAqo7B zRd9nC&N&$AVq#?wN6~}oys(+6-MTq0rL!Q#zSWGZFww^h*R!NX1KaPg5eo-@6px+? z%ra=?91`IWpGPU>ffXGz80NtQ$rf#jr(X)#=rod)$NH<@GmNz9qt-YXdrQz`Xv~`U z=Qx}9%GfXLdb-oE=NCjP4)l>eV5c+r=`^iy!6);0>dnx2>Wrg)%h2LC@ole4V*8qQV) z%d0Cs zx&m*fM^?8#h*Z%8eOo)u4`HS{FL`TD=6F-kZfFpRqIHxn2R>JBpi9!J2jz ztfn$u(|=UmYn;WbacFikM+xC_e!;=bX0!RO1~a0ELX7S0+0%oGvp&7$rb``z@dEW3 z5oUm=e!-J#`{ivCrSx)JMWzjC`cyo*c1 zAQj7z;|v0*Gvv=Hph_frBG+lgIy@?xobsJlUb@McRfTu#NKoYszqrr+SgztP`sv^Df{JF+@8^@mGDV!JeeVp48R z5?-Zv_uI!}pTEncvY-;4hg$vLNIAp=MlWuq-Vk+^XS^-=xn) zt<^<#p5-U&rat6oNA@=br4F^mXEA4o5*R!=XXc4IG}1Yj2`=Lwj=(jsAg(~msQIO| zpAtq&`GaYeVJl%MvFDtle0&$S%i(l2)1adLA&C<4=OC1_dcMFG0e_AK~>6C@>$x` zO(EN6%*qm25YX{tBQ$p}+t4VXzOKnU;Vna~#K1r3K#{bsD(YfOYGUpN_HGcykEP28 zt31^asL7Xd^LTf@D|BGPl}^QT%rTqhf?fcwWq%ewU;X>rKGl~Ju%j-%NYUYQX|^Tz zcEf{l&^M&oZM4;Q?yFOBUoC9Q)ax?4ToN^Qnvk)Jr~h^YU8X@7hR$1++X0z60+b}>Ui*Hbc-Mlg3eAr0IBd>%{sl=v zxvuh>1QTr;Rkze-4zy8h7c4AWpIjMwx91T*SuNl)y7wNMpXb(k(BS1chrG)l=2|Ga zV0AxO8k4EVN_;DB?lxJHUw?D6Z!b$n8}~M}nLmMRJI&dsYE)vT^XKXAG!E+DMd{Q3 zc~PPg)v}wso9}$9s$F~OyaeZK^nb`5j5=JKXf8ZLFW(%45#06a|3T+e#@$NLm8`Rj zYdYo4UWNk;s^bTz!ErhV|FF5+wn-uVnoVjEMcQKBAT%}CTvgs{>8l&3_+ICP($EI~5Oygo#9* zLD0itB3id2uj)g<&2p8iI-$Y9QwEMzie|ddm%$(G|g&4wV)B48Y+TevY`L$`;OXS!aX0`CQFV z6mTP0X|!G!TFc0DveCy$HVBFXu;^#mUc>?-Br0Ju9<~mqjZfZf3|Vw@^`;yG@FC}D z?MsOP5m*d7Nuq^w%L`eyG|0z%&hK^2m1n7#dmLLYnzE|$!ayc~Uh$haL3#2e1_8AA zZxr7q5eUg7BOuIhvWjOzM-zd;zW2V`$GZ__5bfj(BXJp#fHp}d{}Cka58Ry`(86Fn zd0jcLfUH|R&d^+BfX(^X`VX8-zHmAPB73Rm*F?z#GlAcwK&);duDs>pQNAl$p;tW> zmlz32ovyxY5E`O_^Z@|llcEkqj4!nNPK;Z(v9J#OK8j{+kABzr4%#I9C+|*8E-{X~ zNa5E8Y~_W>A&9rYG0zp4fToNHIZEbA32lH_;NhmGO;Q>q6eZ;0nJs3y=jVjyh%-d@ zYk~<>Czy)9=92?dseaUfhSl@MjfgakS7Aq+@Hv-0>5&tw z_vv9@AVnrAxkhFO6eaAFoEt%3p9v}ZD;mIXRqF~%lB=?|p-CUi(p(6vDMhXB4ymJZ zpZ9hBm{F@TGxFM3&{D2?QRD$4Oy2`}q4;?K9fD%cZ^nPH&*s%=E$)q1tIhK!PK^NV z-U^tDd(#hgQ4CDLK&{-fs^MM|XZ8-NrxAFjcxOg7(;KsUK<3l(`UW%16+6Q=dZ>YD zfro86viopShgFNl%^y8DplEGUH4i*)uIS)Ykh^BPURd}7P@PO$o8WmP@4y5r1DI0E zWjBjZCs_y@>*vW;Lbz7iM%)?5|B57TzTwpM#a$aZtk=zm+H9^%qz5zxoV9f{XAxfR zh&JI@1yL<><*CW!Ac0UJ&Bt4mqkF4uzJo)1recQ@&&fQ4r#Imo4|}a&<@K8$~MUJL0hC0i?fyPuGf3OyZ(jpH#A0@4Z(6P9e* z=Ujc@`tI!9`k?ijCT=U}hPUe9?ImFaU4F)B5Go>Q*)9XQ&lGi9`=blhhx{TpT#a1**sHkw3_$|uRYm|^w@fn=2c23xl@M&fCh@)i{;ry68l zhlOaNo&S4uN)*FC%CgeRo?ew7v-tpW=;;VnQPbCb!ay~6;w=b#G3%)`Q# z4E1FK3XJe>4+f8jq7)fe>l<^{jP_%gvYV)<645^KKl`2FTLOSzbM z{}Y1!mxf&_(m{uiVBY!gs0(x9#aMp()jXa{&#fWje*vV!A|xjT6?oR4ema`tyY|@G171>|p1gYFUD)Kh=T~ zV)Qx7n{AovQ%lppZGD9+70;4x14kz}JhEH3XWY7n^L* zQ%A>2_@jA4AJY{hmyj3(+#PAeoQJ1zL;Kz_f)d~lwfB;k;fSv?01$(gxIa*XBXoV} zX(9b)*!++1*ZG~CCTIzGh{eXbj$awh&w}J|;aExek8yP583?mz=?_Gu4oHec2wtVY zN3ts{iM>*uNQ&URnu?Ci75rGorH0u%Ilac)V!gNd$h=Bc(Ck zjWzQqQYd_pBVzP8b|NZ(UZV((bfIJI5{vmJi&^!-0(*>^4%Ts!IW|18*0>lLMA%r8 zyJ^#n;n+`A%6?|2Ia-ob3DWDXJ_=M)q?b!}dQ<#7EG&B8IlZ);2vzaKd&`+JwUGnkxTRS)wr0rhJFWAsxIHg1BYudo>yj@Np5Hb)8 z{}!3`7~_Lf$g$v!3!#gX`{Ssa;}OZc$Q?AFe({4EQ^U5W<@~_vVJW35i5u;{vD)(h zqr^9QFi9RbrF@RroPV-3e?_i1l>OwANFb+MWbG`68Fj@H?|-eRW;YEwx4V&0X&QK8 z*jX*@j6r|9X?B?soVZ{Yt`FYc!`qv|W_5A&Z9>7}O<4=t6%#A4cGG)TYdSUQYXZ~mN!g_ZM|ercPG=^}>UF z!VvbBjl_x%xo|J2!KnooX_>C?7a=(=nm~?Ks-FvXot%b+G2Qn2ca^4Y>ig|r^6Kq@m zIZx#!G3^sM0D0lc5Agnd#v1Kt^Zl{6hFF1RaseQC3Q#jpOc${uktki_b>NWd+hLE< zG3k;V{IrUfHD%zBtQZ03Q@O$rn{*>?OPH{w4e_QWayEun6yEUo_pkaXyV>0t5jpDB zS6KO2Io7USQe6j=YWtE-e>LSqGN51LL?8=H40p6I2JCojY$hXW{}@emnbu;xH1L6s)b+j-h%`!GQ$f9N zb_m`5k?Qmd@o*(Q{^WK7dy-EM%QrV#zv5>A%sTL)8`FayQjn8)J4EV_hRiHd(=^V4 zj@re6q`=3J3NzUQR@dj=?REbAU(Sqz>IA}`piDTLoAEgSpuaF{^OzQBie(gUZLe=F z32yuY%t2g1PDa&OQq~Cv{p|p2-po9%a0}*{%UWib@CAC-BoRgxk()#1EML%q+Cj@8 z_kXH3uLj3uRn;2W4C`v;y&+Xd=D&aM^XnY8oI z(!ux5dAH5DGLRn%D6v$bdu(3hA@o0!M>(!I7-^N4zC+X+>dUemk zXno$~xdrc;z-9l!Wqa>U(Fbg9`%iGc*rRaGgtctvGU7U0l!~Ml4Bfwm`29+Fl$77asvqJK^4)nZ@@@vX5HklqXk2Ct(>^b$ z7}6@VBvsdfc1Z63 z5{&)B*z!4u-M~lUQeD+Rc2PEH|6#p-K_}y{>3@x;Uqa3XgPH%>?*EsZ;d2)m z6T#4bvPFBbp|sd|;>s^-lYV+wA~|S10t|)f&+Ds(+2Oq_4uoNiA$P{#5g8!42Edhe z#!uyhymOG|{*ZSuV*D$nJmRn`LnfOoUWj6ODMATD+!G8NpvF?&IUXx;$HyL{u)>`; z#_;=rd#5B*8{k#9`krg0w-n&-SjNi6CheS)K@N@nEdX zWxdci^*@}2Nk9qP6Y{}4Z?MoB(TJY?*B5*y)mhGFJcwAk> z$UK}w=B9f4FUms-Q;SpXxBqUigFEvi7v{1p)ExqRkL@u`_ElR@fWR_8j;{*S&ti&{ z(I2?NgNci$rTx64%}B0A1IoUZjpv%N~r_J{sLif~6Z}6VuK?oYY#K7xFPu;ijOU1FFX1a`=0JQkQK4}iV{scdGWZ4l88t}ZOnn`HS-H0Hzwi* z54j#-VDfXWV!I}zjG%MT$Vgj@$35EmpPoEcLbxw|(~Z4-DQ5tE=|0-_f!3R4Wh3Pw zU>|Qo0jC|6fqPL9D*>YwJ)^wcl$4AlEehxl1zc>aO}}4RcxKIy`{s|tXg%D$l=g*_ z{u@k%7YUx&$A5Us5<~|uevQ+08t9SZpZARaj$ z-Yk$b(!MS5N(M9=^^8Jkd2^ngNS%mpIOp&4@>x!&RT(ivcAQKl$(pt9_Oum-YSOa% zH|Hf>QqRbCp4%V%yFMRd2zTimS>a8@!RlqYa+C89dCPIcvkJ|hGp;LF`h?7u%_`AW zLX~FaSd9;36AQx zsQ2>HH-FCFP4Juy?gLrcGrw#(j(2;<+Tay3$imD@!yS9@PqYmvWKLd5L?x%{XH37| zf>I-1Gj{WB=<<)2SzsW0?>#lbbEYXLt2jFY&kQqbt(y;pdu_0|Q)+O}47dLNmil#L zh-e9qtI3tJC$7CcY!v{SP1mx~Y3qkMgvtA?-$k`(Yjo3gQ`$~!f)05vGUhB^G46T$ z_(ZYJ6yLQnPHVahlW?zm%Vi2&U-d#9@C?{9mCPW8>V=*QZ|Jh0!{YtT7t4+iOdOY7 z)^mxFx&#+2do#aoeGD;M)vX1D--3sdY3yX4HHXpXp@wkdpo{$vw{sr*O3Xun%8Ih{ zZjM=f4Y{ZFGkI&yi)~L2aZo6yn7g53^*bZ+1MMv*x^p`XNteM6hP}(shf6p$I!aWW z_TAd0U)p-P^Mt4KQP^9f+TFeoUbFIKr|cWCtsf{1mtUeHy+5E07X`?JTZSWlrMiJ$ z(`V&ndv6R)5Wf^ZD=!v@UYdRySW6hGQ2sn}l&gBenSvfy*|#FIOHp$IMIC__cv_d+ z-4C7xPlgcxTPXBj-%=dK7@}Uz*L`QC6wx$9&6#SE&B5+@$P`>Awn?lgfM{&8hg`{ zgn33fkT%u$-#L+>NP<@ zNi+Yhx;~NP`>u%9YhSYt);hOYMw#dwEn}A368Ur5M`~Pq0@1wW8AbO9w11)->WAq%c_(WI$@05kQKQ)_sc)&am-d zfJ~EXkU_kO$9jD*pA?u0c~?4NmOJ4s(ismdo_uvDAxu~9QhFZ4#Th3b=`f7pFLTi^ zbW-6H-Pp1BbhSGuRE~4($C&s6o$rw|&Z{?Oiay1t7-znK2u1esfY%Nt>aJWTrRv?g zx5!1!m1j~6KhmA74_^3h3^l~`WtO@l8uM^dL?Wl0M`N-s{t^;q2lZ@7Hg-p6aga>o zHm~7UMr*)29F=AWhR84pzURnyRuN*@ozBs%5X1Hb@v{VmGDm^GizO|wXEIK~2+Q{V zGf-p+Hhrc-Ba-RzDTK5)N+{yq=fnABHgWucOF>ITtaKU)PF{;Fvuk<|vl64P-g-<3 zyDpoJt&ibiCdqt*GajXA89bx<4NVl@%z_??yC2IlfWxpA&l=S6VBLMV>%E9YmK7xr zK&B3J?Ex=($};V+LZ#!-fdw%Z=0n(2t%_Ld39fJh&VK7jNIz};S^tZj_8mix1Q#C_!} zg(R3@4Vgq3tu=l_#PDb;m8XI519-f)Wu&XGkRb49=}fHpI+B9Z+q`!255$m@l>PH{ zn1o^$10#*^iAOH5r}5!(IXFF2KWtT1gAugV~J3U2OpFs}X`Q{c8>YeS*{r+0TV?IcvMj)HWW@-QuCB z>`JSTUw)p3q|s7%$&Y{2@WxPhRkfS8kOqvJ96yt!gFoj{7|(~YJMNhaH~ zr?{4eFHm{_kvVB$eBJ@?+63WQI%7> zKtJA>H+_uSL%T&-kL{Mj1sbYlZBNqy(a`7voni%_ z0^)rUSOE&S>Ei%;GuS<GSU z+39tCjb<16EzfHe=vuEg(dMDH-s7_-v28H&(l2Dok43ADkMBzbnhAjg8E>K5HbsRJ zbJirNf3zSy5^{cz|+3E0a-sP`XZ^3B@J^GNQtHSVY@@7!WG3!5w-Ip5n z!a>_R`=EaWIMV9BMM5g|DgW1u(jUaV7t>viRy=0=EAvL$nO72Wgz{KaKLGTK2t4~) z=Hw^>uI3&0>_m9)_$p(LIQXk#iAVzZNR_8L_?azawGi43wZ^Am%PPYjPS0N?Euajz z$$V#f7YUbgKmJhVbgAFNNY(Qeicd>Ba?ZE9{wJ4)%EKYN=!AL~PH2S}GvL(d;w2sj z$z}l0^WYgs#90@SAy!!vWr#U{(d+_Nj7|2exG)?iUw89nD#EI1zIu5(Jkoz<0@`&P zDCE#W8NSAWI|)txdhx~T)RLW#G@553q4wkTqtqipz;Xdxx`0^mk~fS&;EP(^~Z>bWkL)IhR+i8Vl9W>yrX?p zX;8Pwb@KG$C}~66j%pPnX`%u$?5Qs%Wjz_=KirS~Wlui24J|WuVJFeQ5c~~gb6$~p zuP-)A{ul5_q^des#$Ad~vnTw~aDIr!I)>u-7fHwqd#6;bbTg}4%6a!UA&J-Vs}7lj z(nUzYt*ENoD6`dD*@Yo`v6#!hzlQJ>=1318R;8^@`>M5Op$x+ZxR}!91=cQJbusmO z1~Jw}iBWjD?*x)~1ks_=&bxVmn57AV$WCVt=XJFvPt^4BT@0}TgFR1doj7piI6Y0~FZ^0l6VdVskc z2@l@#rB_#?>7G$o)3`B(*A!URo1h&3*JLmq%Q(!c)lxWEt>N*$TSsP+^R|?TyiD_b zvY-&5mY_ThO1q~=SYKxORR_FTYxx(Wqp`SU;(27N={sXatA4*%4pn5^k$uv=iq@_Y zeU#5G5H;ahVn%l1Ry3ZUEp7)MVLvKM=*lFlQJD_yJN{BLX=pAFvGY0U7M6ENSpAIi zvJCh#iHN(b-{6^iH>c<94q|7!P8tzXFAKvtm|Ur?NfANN&=A- z3HW0P)h4xktiHWXb3ky|b$?lx52uN;s~k++XTN?{qDxRtKKA;;hKW0GSgsPwXj5R! zV7=wr8fx!TkRT5!haiuC&jme$s5s@Gx_LVbptH+9eib|}NrP$z)Oz$78Do%3d`QQNZz%Y_g{izHum^EfAszRKvbfp z(Rm4Y^-N9HnvD4^mXtCy0p0TBi$&a|2nj$-RTaR!M;JEQ zaWywdDwTnoo#%AZh63>p6D_TiEkYacLz8}(P zXaJZ>ibIZi?e=}TQEfR%zp$4TUNa?s&Lit28U3t|$!Bv&Xn!;W1i-S!x&q}+mIxPB zmlrKIF9H40N3m}S_UMw9Jsz)5%SW&es6LQdAkw!c{a-B->Bm2Ge^!ATuRJBFRc~@P z4_X7Y(862mS$@h4yJ#y4xl{j4i(ffnY?9-m1{{OyG{^_)kX7m)CE1(tnLcZ(TX#a# zvyrJ_-eSLbmqrCz&;ZC+w_5#;QXub6Pg`Jkb_vrcSDxHril$6dh*hTB0>wd3%r{w0dvT%&bh zaBY6`E3Gd(1gYEJ@}u)I2wemo6dpd;9C&6n|0i%|=pNKt?}i%uYA)^iU$WKj|A%Z< zWej@Bfi~U!Swh{GY@~WW)Gypj^VF-~_(iz1qf9lp&<>zI9{Ca%^uY=JX>{ofD>(IU z_)n5n#Vkc<4^4pof5O#o=peaa5PBNI#?Y=iiuOkl=owX(cmFL3UTuW2SBxvkhDpQB zYKz^Mf)a-}tFM+%?^J#(C@K=jmRMxUdsO+v+X^G*x# z@}3)-^!OxDeKZ-tCcZc7s+FB-z5m$IeDeuw5iW1`>&UZAc8*+`<)~{ZYxwXMDWBYH>w=+xHs)~a0ks7<@;1$E94zX= z+WWi8PS0TlDZ_w(j=WWod^EZEC|Rc`)+H^Ei|mLbKHKe$@mQKQ@H?A`GevWJv~ujg z3}(WSb9w1X|L)9%u|@^@h0q~eP2MXetQBY&T{XJkq6;93BkXsIW!m=Amg#Sla`ER;C~NA- z??Xu@?o`avRq2#i=-l)1q?DDG*Xe3>+JW8vfO{!*^g>6$aWAV9-2K77X|rX-YPni> zHIv6L(i)-ph}}obyH1>3(G$PRntyVtF$$3j{uuoFlp=&9fnRQ6x?xN{R~~MFtR=1; zwzl+_DmR*9+_ZXx1QwqqJGr`;IL%zntXZKhDhk#Hd3wTF08SoKanjWS-mXjZ?CaW} zPzkm##HK-u1&)W0)@S)3P@YXZE{Hu?G5akHB_&7JOlI~y3X6Uzsg1iT%$ZoMFrR{5 zP*;vU`vY)6bS7z7%;JZA77mSF!Z>DzAUh58zhphYN%~OI1lf8H zLecw-wnKYN&AwIcusm1BS%G3P+cVm!&;zu(%?o)?9{V)$Zfh71k^RH!i$3rTWwKFB z#qA^$Ed%1vty`dy;Ph({G+qM0qh&z`*~eSy3Ft0A?^9_8wS2NRuyq*URSCNMRxW(` zlHG*zba3h`(>(Qf?0#dWW0!yS%D9lqvR7YzVH)9n50<=B52UyL1HXGJW`_WvfpVud z^IE^w&mPNkl*-6pykyusCg$aPRryH`r7ZFNLgb1NjBIm!7|=3cIhm2QW=eH7hC^mU ztS{tN`GnRxk$uh7%an-#sx>HZLhHq#qco;VCrn>uxk@kB+Va`O5M|1AztPz)F!&uV zxtk_oj*iNfq;bb|;HcWatbjI*o>g{O1Z1A#&m zIkzuxe1TZMjQN5Soit6BU4k}XJgkP_?^;5_1%Rx%r-ko;5jZ3aZ2KNT&S^7-+P)W2 z5S7jkkQJpqDq5$vrh5Zp^G#OPrc4=@mkVB+QVh4RC<6@mF{o{oS3Y^t7^B}w{>uFF z{e{GA>NDv}?EsJtVR8nPs{2Xee5F_YsJ*d382fXY%WOzPuGrJ!&t3e9684F={B+wL zMy)!y`@^GiM=-uY`S7W*cOIX|!Qz8YO_X1OIGY$cy+3B_03+cx8wgL5G#Up|&g zbY`6%-rpW2I&DH6lm_2{^nWKXNWRH^w#6sMS*x=6UG$VUOxPVr)eF z7=$ny>D=0cc2!%)ut%IO{xxbecpQvt){q@cI2Cx2HF?Nvx~bm%_yaPR;tzTz#LFN) zunrzv3F02y=82N6)4cTx2G!brzFkQtlN}ZILKh)cZqSxP9MNAohulEV?A4@A`WK zEb1WpHt+91-pjrmr|jv)KepzB!{@cW`DQ~@bqSF6)o3~vg6V)#k@J)L%TC$w%-x>A zj@Go`*-pzJdxZx~-N?IlAzYX~TTb8qw*QZ0Yz=luHg+2c`bq5N-A>2}VrTeti6m7g z^r=hg(osNYQ?^d2Y2mcRfE51}&7l7OkE0UPEy?}Hy!^w-G|KYy0qqx( zzX?%4Wu#;tmjaT#-;fX!VZNMPHRbrbHiIh?#x>O({m%7UGKSuW?oZtb@`BDvj%VZ_ zf6;5MSp!(0O0>9IL?htDU2cqa!Xca_oF?D$n7=k>%OFf!b~Ob%Euxh!iv5z0Zzv^B z0P619)I651qIIh@r4a|O$=Q>}$9!4IS*z^1J!le1RjMgtW+>$7p%iglJHS;jjHMI4 z*OPQnv(?8q%xg1pWT*SlqMP^i62t6tudqsnmlj zC;zh?`sfCW!f03>+Yq3uM#>#62cn>-&mc@ZlEu5$fMRK3PbWdGMDecqj}Ae{rM)F} zWE{5QG2j84;vVkvJ(E&Js>xT@iO7})m)X8u8qnD zATeDm0jB-J{^D!O;BijS5xO+pFOo^>7_>j2@gn&mrp(WbLE|hpVU-i1$nnAqCiLvt zbd}=W_$qj?TF5Y$TyR&hsH(nur>X_B?q5@U?sy9 zk#ya3P!|i2SwH5l@Q>Y-bl=q(!reN#bno&FP97nSjwBF{*q3&AZnKr7`}Qy1xi72AfbhxsOh$%TyYw^Wxt zag_ijvnauPg!{hSx96YBbV^yOk+mm5hX?76dy&1*;Qt$mZ z0Goy(?ze)>_Ex#=!M7*oyT#=k^cB9$LzQw2vmRdH$kY9Y@?qr{dxNR51%6+C-u=w2 z{E1=Gh2hfiDyOlSm5TPY!aAv7ih>Qz0@ia;019|I@_Ooc1u6$cu|Z!WGdjm(h(OA- zkB6~_tO;`}U(bA3Q$xx3?Mm%&N>1R-TRcs9#8v_S!1HRx##LdrrZ7M-tlo|>@2)dc z6ms-M_xitd4Ij`mNNZ5txaEnK;=#aPQXZBzXz&rurU#lkHA2@oEV$l5;9wPi7abanPd0 z-*Bx^;O*cM8Z&ohOU(?V5cI0ppSUNq-IiKLvu4que-WW^YcqLH`9w|Fz{fypys8?D z*x)9O#l=N3!Is_9GGuk0&OHQ!Y}RWtj~wiI2owvtJdEG7Wuo#yL+YUH@7K-5(`4_f zIn$Qw$v2X$u6~HO?_}SVaA3T`pdB?4A1EtFH&6Ju0wbawq<~$Y*4;Z24zg_~B`zsW zM9z!o=L#+31C?EJA{svJ7M@p+{=1`*4PVTlx04fo7D$tTl>G+fwX19CqX11pixQa$ z{|=7)Tg5I_l#z)x`$oO2yj=@B*Sj*`-x9VIa$XOuNM&OAulRyNj$y5T}r9Txf?Ua$4#Gq?sYFe+%3nDyj#KaSmyV0K4ob65qjGg+Pc8LwM*+d zGgcMeoL2MqVZR;k-MZ21%it81(ociA-k+8vcXD@TsqLU-H1$~TUgji{gcD>jlU(hV zopc9;iz_8i11YcJj3tDh?JwpmwNA{YsOXfGuHS{YoikWZh@_~D zK7*?*X6%;UJREr*HgDZOJY-wkA+I&!gF?NesLhrvmd{Uph$cm~P+hFrm@;dVVJ$dJ z(D8;}wZDxIhV47`kQcmJ$cm6kpE%<^N&N~J$BND+A?K~rX=Bw2Pow1%%LEUZ=>>^$ z`@{O-+hm#O(@F)4w~J1*TlERmxuUXZLc4M~b0+deqfxff*lQ#Al_9sG(S!*w0{(g0 zIWg}jVL67d7585K(@8!IVl}wkE^F^BaG3eDzMkx)QqR0=Ai|3Q@jl<2RuJ$GSAWV7 zB*iW90?(&0Qu0XVqkI%;CRFS$q7L&fnv=?ks29T+d(9GOLBM!oeqZbg{ZJpe&PnX! zWj~&)6@IEJ(l!{`xKGr$^o~@{fmOq}i_*sJr;yI4un504+TpSDY}u)IF4}nz|R%%66raV z=vq>f``LPsX7DQF#y0{07=W{e;S0i48&XW9-qiDMB;Jth*l`3SBuNrS?mM2lT_$PS z=94xo-$m+zOZUQnAI#LH~LI{Xa9{Z)KhYmAS;1V%U$KkmWE!5S2)5XW2f=w=jvJD_OtCWH^5 z1=CezXTGs0Fvsq4LI1FW1oLrmpIFvKP|oBHu|&SB>?)N9Y8=Y~k|oylQ+F9Knlx6fi0r3t~)PqNZ>6mg~Z3%{6#13QGavhQ$1dLNP^ zAQ0iKj7rbe`w>%|R6y5nn&Ha+tIdX?V<6*ufO+a&rqZ(Q**uiE9huK|+*ca>Qjrru z!yg_j6vNzNWC%*PB!rYhJl;BSn$wmaG9A3gpx0C^Rg*&5e=v<2oZy#xpDp~y`$q$? zt8_?TPIBugq-4yG+A5@WzmZ0T!rm{{2`c8mAaCwiw95*F^)K}JI3_sRV<$C|AIpx; z4L&1JM+zz0yBYY8oaUaGp(FoHCm1hr8oE?~@V04OW0@_9Q9P!nY72zUqB*DN$_N0Y z6ANJjeL5Y#lIY}N@l-m=^x=x*<%()woPvp0jv2x2`Qs9Kb9V*O7uedsmaoI6Zoi}_ zo#M}_0ZCuxf8WQVR6Fn~a82>T@n~lFr((ZcBaS*Ak*+uG{zioCBUm_D1zDl2#a7Gq zRP($228lHnAmVp;&+tB%i0@@rR0KC;YX<&GVJUt(mLJ#QT&97AGa2ja%!D*Z{d|`Q z00(S+xc$^Jonn@ny@|9~Swn9VTZ$6yIFB^{_G(5pwja3sX>(ecK`wR-vu@j?respo za=rKnYdPgL1d$R!OZ09)>Rs)-oqkPT@r~o`0|wP#&NM)xL=U=9S6LIOtEHW!A;G%~ z55aN=CCmQ#p!qV`Aq%OzS#X3dhstXa9{tMuB5?qsYreJXw>QK-N%ciROKC+#P|4^3 ze*R}MEimo1Et;ul1rZkt1vidPsrAjQ$lQ;cPlnwNy;&~dj1joB# zY^XS`=?n;I`^rE-Meu{uL^RF*OZS#BF$swhT|L^e@sS7io>!?`=vI46ndBn)x-d-v zYM8M5;qA5N5Uxb}!G@N1EuE*$|5WPl1L?;-dM-WjH ziC%+9q8p=kf`lm1I}t6~=)H?>^clS~dS`Td@_yg9_gZ`Z*nelOnLo4Eb3fO8o#%1b z{yphmF=(LKZkLeA@Xr^!NT_Xk(x2$E3hK{IPs-64;SBIPw{~ha@(TCQt@(JLp)0e8 z4mZ8|z{JH&MR6PIcMvKJ% zw9e88%!Z>v)P2N@a|gV(y&;PN3n$a$|I{3G$iJeHs6thFMuq;2vR^(eJH`h@m>>3| z^W%jfobEBbG_mbTi3tOf!$8`X-G#`^6a5zL)rCc-VZ}r=((TsU82jHjb@*z+AH4;} zAUOf(&MoWu>M8k>VYPF88^%mK?Mn@rfhY81UKlM91_3)U(|whI4 z8iw1mZeiHt2LHgX2|gw}bUXSd5c(XliNa>lxHBU?goWV3?&5j=a8JGCBiq@QCm~)U z!)dnPxQ|`cfg{Uffl!OE64LCpvL99jn+^7OyF!`oVjO?+fvT)ve3a+vp_h-~l`&f! zYvovTo%$`kKXxWI9}ni&2!?A{zo!^-O!DV}oIrx1kEz$YTLdd#ePXw7P&^(hX`|jb z==*w3I<&l$?KI^m=-5Eu0g?y`V&QTpHYfeOh~=n&C-!2Q-XMAox(YGBac3tvwTnd-=R{|Ufh=ez$Q)}nV-RSkHxZVtJkn^B+ABT#Nso;?tJhOu*0cI z1g-+I#E5?`?Ja9jCd3!*6*9hfucf~DU80Bqi)QdmEw(jccJZ9d`yBL@u!#Frex-hX zgg|=Z%S)*}z#lM~Q~F=0af9u{KA=%@EIAbW%IbxzTt_agXo$eVxABK&&fMT;#|IS& zE+jg?wUd3BdBC6k{%~v%bqjHr_Y@oiM)NOQqKp00mzll#8eJ!?I@!q~2Q$jXL~S!l z7kx1>G=eg1^#nG}K*()CWLR@w2iOJb8cKdQkl5KH zTSM!}MoSc)D@Z6;>$EEOR4uCAzm6!&?7L^WKOvVns(rJ=#7pe7y&^3DSAra78&)sI z(F>y*%=d5qm=hp`u`hY14y2uH3Y==i5^*mtT%kC7`+pkZV<%hp$j@HRorcOSEm zQ=Ux~Q`eB@s-&PHu)k4XUK8PadgaN~7XNUGL!3;@=)NqT@+ii_cX;lCiJ4h?9A57n z!{ITJqnBwh#we#NBP?pPG26Sg@TEk-}%FGk6X9J(Ff=qg?tj878oH zaHf9!CaS-X%$rv5=iaLIdJVZ%WyvCy`)Z5Ys@L3=U9je4GS78?nqeT$=gc(j{2o%Q zq$Ho3`(@0o(CCx)0yfTW6+N<7f(Xx0^R`YWP#+Ov zwSIAaAklMnGBTot6K!iz&YG-4bGBZGh@Z4@R~()$E1QTqiP?IpRmj(y^^=ct^NR{Q z{bXZSs#&I3Ny{H(`k#4;$XhaUU3osM3WtEKN!#a9*A?W@w4?|pnAc^G?_~KZ;rHB2 z&$*S1!zX5Eh}srW1jHAi?GX5?v}iRsbQG#1c5N8Ee1j>+O3nm%H9a$JdieKJ4=M2& zpzd01Q#SO+!A_I;@-1FZqZz8y@nlF`nK{3_;j@T}yNi{EmmVA9q%?e|?5;Y%i>IIW z)l)gtSyy?yu2{@Lhy!$irj_gV>B&h3y6I5d??jw(>BML(>bm`CGODdmEEX;y+pe%T zCD#9EFi;RESL0;d)I!)XP%&}NSJ9g`Ou)9LKhQ~603mN$CUpptt#RK{HD$>6n};G5 zqb2t=(KSecvmEtBL#O*jU*MVz-}#=&q|82X0mSqZ$2Z)1#NBXi#1rS3jHtS-1_pb4>(eUkGiTa(b=iQo%}`*o z6!Qn`zz~{6h7WimeNyt5##^H-x5WoB)7`56_9&w<;q4AxH9|MUV0Oa5uNmVXOb{)^ z5Rqi3EYhMd0*#$yFTMt!-%)Rh(tktCtTK_{ZcoIGQFj40^os+jl{9U_8C`_48 zL&^HmIy!zJLEj4rM>9XV^!DQI(Bvbxj4(M#%9Attt6)zW=h z(v}CbEo#&HGT;{cmpiQrHU;hr)x~+$PeFEgcoYk|O})g<@P^jy%~miwZqK}MYav$V z%o^;l#j#5OU{v(ITY=i9ZEZ#lAtPzrOS`lYdPL@n%rJ)6!2?D#bkQC-odnc>A~@*9 zjp|&`Ps}ecy4CB2YhM6C`@r@uVovwbcL!j%$Jno_j}@&0C|4zz^@>qF=d;ys)&Ef$;t!3xY0e7^89|3kMgw2M#-&^z`GXDY^OX$Bx>&lb5|Y zi}|v*h09Cxri7Z_$57B+MQ}jc-vGrHiL}S`Z5a=CBwfEe!+`!6V_?4x#T~xGSNLYl zXTLtO9sDycN^HgfjK|;9f6TkaR9uUj^i~2Ps!Y(^ya=ZG*hAaV8&iKcJ-qnx;w4k< zKycdQ-Ou!Gzbh+)hB0nI>}8zD>+-D^IC!;o4=}-3`d!JipKV{(DCTIy>=v-RP6(F4 z=Hpm;aQIND#OZ>%?AI-oq;G3)Ez5_FbRV;tSet4-g`N8Z&32S?;75B2os!uSVH?(l z&N|!;j|@$vV;lBWf@mZ67V-T@sIEf!2~|g)_h>|nva)?4k9hA=Q$?@@NY%p2FgHjv zXa18<;#EwqRSC?o)9+z3Q%PQZ-}A^Uj@%y*R$4Tu1u3>FQEjeEY7!5;6C10|euo<~ z08kFGiQpv+c;YX+7r&pg+P$Mh#`PIDwU{DMxaS2eF6x3`%dV9;IE&iFSym9#M(;DC zn?O3l_LQqY*)OD)dgMzRO}vEgd#sa+iO(_e-}v}v#JxBxaHawEVoBet%0d!&E6K4W zKQRVKmvUQmzUv5~BA_a8(o9-}N2j(}PI?$W=%q^1RzmA4%r&lkuxvKOxZ&rL{r&e# z9-O}iJWeRLhS%#O25a^O99z902EKbJCrC*Yh?mdgn=O`ca1o>9|7`Jd>L+6s6SxfKe$9%JNhfjKH zR7jNWxoqcqOlkDAL|P^ratr8v$zidx7~QbkAvh;EbT^Xgtgu0r5-eOA`=r}7yMRq0 zL!y*7VQq{jj{G$byPVb1^Jl(hG7pP7N)NIZ0AqOr$$=(ZyZ!!RhJ+gO4 zPJBjg`mcaCgpSU(@~Y4$X20x+wVpPj(n7(v9keYJSlo8);C{(Rol#)$Cp(_HWvBLz z$zoMhHe}j0a;I^X+k!!1)|sV$L+ETx%7`kxKkyd|Z5Z^2rTMhOv+b_Sew}wZvjr%( z*6aDg*Jc2LHac^|VF^s_DX3T*xiVmScdU=RVZpjs zVyY6K{lm40;jOPbFM`M+J(toyR%M_}P)la48B3e~HEBc6g&vvnqq?Y+x*9LO>gFrN z#$e&SHiuGl=>O{PL3D@Lkq8c&7DQVcyH`ZGr<2xkc9gx`3aD<;0(p$^gd- z%If=fO?NkA0=I7`a(XO7ZznWw-&tDqyH>k18>oW%bemQl%4>~0$}0L%@^Pa1?yM}z zX1l?w8P;^W=MXix+yy*MLKb3bb(tp?I1RXMrsxLbS8|Lx@+iq`@2`NbQ`{^o<3$k8 zv;_^iBkHC%s%!YpqSYj*N%<4)OsECXBZG|ds{F5}7hg@oTz@g!2+SPwm|pg~-?iM; zmpL_a4Lpj!-8n<7R9`$1@aXe_dJIdTe`H6I#ujVD4>Uj1y8T7l{Pd2FjJhF+&JGZJ~ADNuVw_ofkuN+=wav0 z9c`U7VnD*Cjj?vUSR=q|YhH}?Zc%_}QR-zRnOu#k+iu9W309>j7F1L}25{v6y&l&& z@W)q~jt}SOt}9b*LhPS#>)!aQOybNwi{%((ioCI+d$T9)!Q?f*+?%Z(obWi9CGs#t zC(SWujc9iCVIBad)7!@7gXY_^W@58EDdkTujw27lcRtcN@PWK(%#=va?Fh!hgGD># z7l2!)M7l z=;nwRiCyW)vO8>rPF>DA`h&J`8q5gVzY(4sul-t8v^Q$0{wiC*Gs^wkG~;6=4A489 z;9yU#-ILgv?IYOw9qT5_rm>e%`A(kBYGY=6xz=gmqsteTa+)-W6A&%d0$^`2Gr|1! zD{~{Dh6se#_`%FsWl0}m<*>PPz(Ku{edy+J@w6WOr`5;+s6KAqEnE>Y#bnkuI{KOE zNATyb^Uq;15?H)DYrC79q;5wx_dKN@@9LQGRaq(%YK)rWvbh(B05#zxAB z$Xav57GIA+qSH%JD*KwQloFWCKF=(O-<{6PBg2ipy25fR)tB_^_RYM!i5pGgl-Fr; zD5cd!pOW71NZoEYUm$8DHcmRxTGIx9TVBVS<0q*HHX1EDJ9h-&g=XOmW56^$OX)l{k>LChBzAtExo>MhG+1(E?V5a#rqvejwVgh{#dV}g~2 z5V$H=qg>1h#h@dpAZ!U$7V&7xMtv!pD421`;(rqH3KTTa96NoytZ3V0>2gL-C`zc;OsK2W1A3+$y?rxARE>W}$; zR;_5KDuJW!jb_=a!@K~^bRW$toFCKyzhR!{M+|1B{aL#$vzfw;r6C_4vK^=WbvxTv zopmzWdl_N@^bHLSwV1!XM)#E4<;;7P#0nLVf&|tnsGa;~GS4O&ZL$`|lFBQ`@7>EP z?f#S%7p9f?g3)HJJU!hDj2#=K)nDz6n6Hj8)jbOm6WX~_NTV_vi);z+^H{!G-bprrRQhO6Yd zbIV|+E$H6wR@Bq?^dgKNvo5qq)oexOf`;v*>N{PRk~U`rDfU}#_XWl6dgb&U-N=hq zgRo(o+Aq5Yh2hDBZQs8U*jL%+k(rZQ2|Wi+ymw4-i!CbrrWIpx6F`@~7yQ6BU`P}! z{_u5hdTQwV+H9(gaY80P@Pavi@{Za@n%ZLpyA4No7eGRsj^lBsGdC?`=VsqGK>~%> zVq+8TSg?}trVqiz7N*ECh&hD0pwLYo$}9F{F$ae96TDqPB9u_lg-G} zqOG1EXU;S`a{@YdT%*hw9r+oc6`DSzy4;{D9_qu@-8s<|$=UV9(t6a$9ps-9r{IW1 zph%O@`N)L#ycG>#AKe(7?g|EogWf^u+N0;Hn-g_eZ79rYjHr^;OfSX~%?+R(zb$=| zdwAt0;mmgaA(w}m2bV5W(%vd{%b~18th{;3ZMCll< znXV4@aI5CPba|X3TqFZITx4%djoXhc=1h(=3d@My?6HcweZ|Q`QqlX$w9Qj3yg1_T zC;JAU1xsv5HgAmz6@UEJ%-LHD0Q{-^ozqN}$`;HPZVMM>KBO}l)I|bcb>UfNV-W!g zjjZi@4>9`HWVLuJ_NVy|`9B<3=>_NmwjM@sWCq>7-mg<^lfs(E1FS{h4TFI1Lb@mH zw}imLqEDBt6|BTQByLnZN2Z0D|!0UX%kIhfRJD3tv&bGF?Jh=RU^3?@GL%vjRdQY%_CKC%Me>@Y< z)+dN2PJXhl3i(UeQ5OmR1l`_>h{IYfyMP+(*dkdTgt3{KA1MP{BsCi%!J1 zgsR^QfGtTO1-E(81KY-JN*gJ>6403K>DIl;%pSjUYd^6HhV&pC_R8LJ?NLsgSCav9 z8e{2uxSG&+#MI!(vnr1E$97##mb+VP)wj}Fj~d>%o>?4K-hyQp$7k|ZXR@+lQ1SBf zlF9+kWOrVP*=B(6qV6xE+{=!<89JSIwY@4?nRm}Q^m1~hJrRi#+-y%qax-}0eLt^` zDaAgAbdBiG2i>xS=Oc}Fd9BoKa;Q62+O!SPLeYK znvGw9xXvuS_S!MTtS{UAeH5B$cgh~PBRKOolQ{iS8!Qh5sY%|8fA%S{@$28Z`iyhFgn0i`iXUt*u3ZRwDH}l=6F|;alBJ}!o798q4KaahwrmsCa zuKmq{+&W7mdJt3k8}Q<}>yF93$v7y95{Vih5$*a6 z{DpJ9yJIVtp6y}0TKQ1la;ED`7Mv+G(0O6DiN?e48i{d$9n$(8(cYI3%RiMbuEc^? zM9iP`7ZhU>J+gFmNU5xIjvZaRrR&A}J5g-t=flb$ss0U^%#!-@zlc$j5BbSamO2mXy7j@=YU*3$6-)g}!WSblX9xn;Mmr3QP(sC2?`R#g!{;wOoAu$G(aymx+7p0&;TVTPUnxgY5S@@BcU+d9?U03A9mOfPE^9D911Vaty1(4rw^OgtWKaT3QteAKC(#Gai%x1^sY5EaftLJj)mEl)}|0v2n*~yBgFK;a18%J2CqTLr$B3j#R z0&&(*72Tij-{aEbx_OIHh{XK0OnO-?ReH9iVG%Z#YX2mE>~(@jP0`(-rYEY4=0Zj- zUN&@_pK<4mh;&VTB#M7~U-Tne7&Ib=mR$^A)`pvVuVAu>T4aqO0wkvQ+fM%Z-WRNz zzHfWomTZUALXJkMmPc=n7N#}e!c)=OpyCAcuyx0!L9B^>``vjtGI2y}^4Y@)tTTDk znq=@-1W}PqhLNLc;Ctcu5nVFD+=qBZiy<0JpMvu()oIK>#y?YEPOW8XFRY{m*hxeT z>G-vm?Fa@n(~-RoP1O)#WkINSK-YF?P*3C1yn2)-!e>{+BH3FN*q#%VHmwD^Is zO_Kohg`OK{p3Oll;S0nrq-lPtB#=HsNgYAOf zD6=RAh{>1mUVA4;{|d>B`^u%)+U1pS7}?RPeu^D|HCxFy!~3$D?pFonk~qFub=Mtb z@qighbyp$W13M=+*$H?>C_o|G6P^cWi+FNLTsLLx&(HQ+cK$A=OKj@}77#OU zg7cuk`M;zI4>x;hy&nuxhEck}2wrdXP7r#XP3kI#1VMEdQ=9Gy?g|{x9~+QcOEe=f z=_n9OZRy_w-}Ctoe!$y(8|1+1Os#9C43D96LH>D7b*8F7{kzI=_}_n%;cd;`c%6z^ z&*8cgb8{f3;RiN|=jhu25%#`fTOQB6J3Ty#@{`(s-&4yf|5!dCF0t2@Mf2~$b`R4R zOpu>~_oNP~5P&QHJOIneWnufJU~f}k$os+Lps=5=!yebd&n-TTbLYUFk^MWrEM{vJ zd#Y?zl6ir;8M+wXumBc4YJ-6%)<@EBxG>hHtXT{kWJOIlSC?0+{vmH`DgHKho*?>C zVrv-vZg*IyxqDh>@{NxC(`$6vs-)iz7xNWA>;q+3C95e0!(nT!B4$x1jeK#aEj_bv zS%{5laXVP3`v?>y6s-2y9(P+Gq4CzW-e*qMEd-ffBfhaH#EvEI!F8AxA)jS1DzMnd zv@*r4-krp(pKb9=X;&j;mi(XnfB=lb1ws=5LcXo}>5~hI%<;vcnp-W+b|&!blR2)8 zyvhm1YQG$|sayUiP=E3BQ$8ewMyZFgAT{l~Go!CW$r}N5^?BsEp!1=e6xS!Ni}j?> z_HWuSlir}sC}z7lXZY>wA5yO$lwIeQXKA4gNHHV)JLkob$a}hYmu~H`A}N(XVH@qgKmGQRUTf&ym#=)o_FD zqS*EfR?^ffdp(=l@`W!->Fkf@Q-M0xJV51{G_h@RdYqTH?7jbtW8K??1ysAvw+I7E zMPh*Gefh=ZzmHo;3m}?}$b*tJQlqhqIa$oR#ywrx-~SkwAyu9Z`o?g)q;wB8*zoy` z6%hxwJF0s0xID^-H*nj=d?L4en5lD>ut2-4B5^*7^>$Oa)5hc^I_-ne}T;)<}9P8`C$7Xa%*H-q4bx1+C33Q?e zF)mu9xSF1eE>bLwwjwYA@Z&qo*mBxQFyu4!r)b=2g4q&mLsnql;f&R48MH`25 zD_6w$zE_Q>IzelZ1HKua=utJ51&{dkt!Os&S1f3yw#~_V_ z@Iz+?Ne*VGF2kr8-wGBwK*U?jir;`!S|VS zBOg{8)=0#hG-D*Ig$95~U0wfb9e3o(U=5^4t8T-qjQsv)n3Vtm`}+()Wd)gZ(ss7P zCA35*R}QtR;x7FvA`AVY!H7kR)P{9Jd$I8>w`MKu{GX%|PRC!uP~V4^898zQF9gZW z^_K$`TIVis6gHKW;{HDP|O98+DLm6_uKYGz>{@J z3D-xvQ({c*OeZsEF75r}aDZx0egdW!dwhA=r#X+)i+@4TsWqae1wV|7oD6_y`D^wZ zwFia5{z|FwGDAS7`FU6l_%BqwXb+mFF5T&5oj|rYbVgX}(zyQfNafy%QtzqIpz^mL z%c3=%zO~TOVl*z*;#Ii$%f^CQjY+!L5)@cpaaE^vn|)xHuzUR%l{K}s9alskuvHA% zOR*(8w|!#1Q=d^daVK-_JVV9QvU46I%$8q@!P>{Zv&IonlZkO3^gYdbyku1hhEN;m zNLF%~^>`%1KC~bxw8p3t!eP5c?g-rRm##Gd2ZJK`BNM<*{-E^!ZXxkBiLL(4)^8Se zn}Y|WFpGiH0}}|TRenW9Bn4|z3Lvi9TB&{e&pjVdknY9!TvX|2j%(QoHyOhEou}IUVWqx_3YrwV?@zd#|-l?5GE28rAR`~nxBT4O$P-0FyIBZRI-gjnfUGEe}a zz7Pgl+~N|#;HrhHBJ-Nv{)Eit4%es&VEcv|49{(e#RP@1#f1E%tQRxTNjsJoa;P-9 zxaZ_O8h;@%F~nh3eu0k&y~|rrE)6>r8Wud(X{_lac8iqjdV7WS*G-p3{CJ`F}ueB&w<(-t5Il)jZGxvXCvT(=yA`}BTL9c<3d&ZYyy4(s^)iursT6;Uv2aNxZeJLiDayT{tx^X&WcuoAmgbA0(j1zOy61lra zCYOIJk+;Xp@$hU#C|vjxV`=7f&p~7%OSLw=$&BWh;WkHe8RBaXh9+6Jc)L3QrKDq~ zr~l?$k23N?J;7G*&Qqh+7mdt3UAxYZ_F8c}E3==-7faYCn5a*TH)SULL!bx7zXn5{ zd1r#0LAvsl)SSpGgtjit^{X05>OJ#kY9~1iJ!2Vh(<^9^@RRrG&rv)G`65{n{B1n0+FiU=0AolCqCE8o`}do%8WBfjVdZ^pNFG)$`Xg&yG2&ellN(a zFFf`KEs6rT_a;XALS~=iX`z8Lgz3uvjkD6rA@C}!i((ZG-At# zMoD^rV(yq&8-@fzxEmeU5-){6fg*0$*vK~yO66;u-CV-sMJo|L!HO$Km({hz_?LQ8 z0Ri23kb(G)4PXD38ayVS6ObptsIq&%j$G6h{gjqJi{rB6lw0tnK9ip|l{vbaHrQv? zEnurEnErT~{%vJ;Jd;&$>u&J+_*j@iOF2iJW2tUdI4>`)*&4M)MqxjbTDrHS*$S_@ zh}C=?!1@on81BplR_?LCgop^PKX;N!QzYw?rtxycnZe~GdHXx60xGiUZ!#>ED0~89 z^cy|zN&wl-iYX1He~NA=gL?A26fmR z*zx(rQ&@G7!1e3Np% zTkd~4qSIqR`5V2mNLK#V-49c)L7%K5&SdDW@XJeH;6}$n9~YZhS__redrUp|SFqZB zIfBcBo%E>5oR~~6%}O2Q?98W5$@UGv<=_A4a=R+|TcLKbwnN?39~;2%)uXzc)$66~ z(ZeIZW(n^Tgax3D)VvfRLPAl{T=@{6Sb{oV&w6{^{F?9=O?dcdcG=19#nBtUCMjqN z%X&1Mw?18Aws!y-xi2Dk<-8m?Kik=o6Kn4B0N{xQplGYe_fh~k&Wh_Bo|5joMw#du zLZ(_&x~H5$60b|2$t~1Ga;AldY-WkvrAU#pft^s_e<0U6z zsk!}%)n3N;UF%zp9PJh~u?NLZglw_T3?*PSqpdZ0}@WN}ObKV0 zoK72&KIsEz^L$1F3i5p9%$NX=l~F+bmRmBo!llVxe?`J2ukuZn;*z479IB6$rdvRj4`I{2X;^lG+W#Fd}{mBaIt{}0xz5@`)?=}^@O<%fpWN=RM`zs%U6f1 zCh?Y2q|YgqMAyhk5ohrM#}FhkKdt5{S9^-We#7{6Lxm~y3B_*?sjbI-e@t)*f5ErL z_tuhVdSIqI&r;d4*pWD&coE|syx2Q?4t`!ZCYD--*0UGR8J(S-LXSTHcYl(!$nJgC z49^NTCrwY?`E;QXK%#FN$)3aodMwB@!XD075_7Eolk8{9gw0P5tSVtQ5-yZc?1Fc# zK#yo~2Ah9dxZNH{{BPoGbjni7c7(0~OC@Xi9q>1BB=dR>)sdTM!hjAsIrRR?=i^Ee z#obuUetp~{#!~qy>O5Cr!O<__`QpX;sqD7?C7idgbk$=a(M!{H;Gb#+RV;(MH}Orb z$iJbjpjZM`$U75dkp$_#B-ARb?82$^+nFjmH+PctFfo(BYFtpYvo?+7symA>^L~PO zPuudd)QJ2VmeDq4>^868YzpJVED_&)w3{s-=4FAj7O2h+WI^^>Xr-R-{%%n5M1)w` zc&LrMN}i0WFz9jm85ytYHKBvsm0mlH|Ct|A&AKySUoEiLcNZ_8HL?@g6MHjL?KN@) z7t0J4(aN`L!swyHuc+5XWlaCoA^`o>kf_h$2%))Lvx%9kHi}G3D;ns_fnB zr!pIi)cSpR{f?3D$&h~B^dmu(l#yltH&*jI%m(5mXN9cqEB|=A1LA^80cf^*|4VA4 zQ+y`Om-cPux(d7m{lO4le-#k)QCX20{wOlGu43fgDu`0g~u#lWxZzYe@@h6`6x z_eD(Nlw1aovoQ`?sV(c6j{0q_HGCyi_kZVC;i!`81cUX8mi2a~RquZ)o8dW|WHiS= z?{s*}SOc7SNsfgOy^rpK&l+Hb{9fK(*bLU29LJZk-g={;K; zo;lF^V<-2qxnkHzGLuur!+YpF@ICo!`RZJQW5HQf%*ncJ%fk>? zhmfO*ZoPP|NB6omHp(FHV!BAC?(ACNHO~ipe?We^u!3YrhegKe?eguxwH6KJrsPGOZeOrr*9# zABoIS+vEGO9LS9A|9c(wbuIuYz46C!w~Ml^Ax2Q5GT81NbM)5^x+_CMTEJj>;1P6} z+GbpmqO|UlZr$nk{lm<)lG*1lTs(a-7wkCb5;eU2oh_bLays^=0y3n2Vhc7n$7mKd zRN12FQcYquhCndL&j6RJK9&zX$`(R7#eH-tt^!OMLC)T16Zgys0dSFeVzYPHZa`lC zV6^vAQ8w%+>bhk_onY9;@qAuQulXZMz2XL4L^E#NYN^hy$(19w+BVj_@yJ2x}gAZ;o@Ub3IU^~@;Z$i`AVs53OVK>CW%b5iF?rQ9W6~%b0h(i=RyNGqB+4(IU$0~;#viD zYs>PaM;Mvm{D~@10;pSaLKmbcH+MzTlTd$@>v!)w5d-&`)yE09bC?okMhAw?WJY?S z{*aAJv0O_d6)DCq|4>Dx%8q(SmacMlYD%x>=Xm?pG#}4qn#IH4&U(&?wGfvQS^oBT zmYBI}bWto7$hF-~kth6D3dJ;$yN63-qPnw@PFbqRzdQ5JoozjYm)dSXC_;qA%qt2ho zolOt>ie+eeR@hC5?n!T`!gQ1(ZCTIKuDnLWO{nQ*18smd6%A>LJKJD=hw8a=yEhA% zd6EF}$;}rj!>npJA%+XvTU~fPR_k*$op_~Ivr#wWFLq!;MR49|W&l*geO8T|Y+r#} zT{w}MmA

    pFoJYDSTpPDE7xcMb71?$aJzzL57j$I!yCy4}`e_%txq*MQ`gPZ`u6| z?&A6qeR3r-3#p0)fcF*C#V7{%;kUFiV|TaLs~6`M`XxO20W%rdN|Tx?3JePL6PeeO ziO0`sAwtw2QyPcgS2S6E&y%Q6FsZ~Doy_?w>KZj2>a6!O-JRbTC1cJE{lIMX`mcoz z_j&S_SJrl;7>eQQt$vfkO*`vNyL5xL&a|BgHmL|N!FJPR%-=Ir%$kn;Kwy8~Abcqe z$sf*Ef9)!&g}y?z%ItTdWYG1Ci0Z+WD#X@rF+M$qQCG`*?pj$($Hm+gXs69`GN!O| zZJ1uGAvmz}z2L4t3F8grVDjYwe0TN$En4b)H@|pmtS6v_YIzXheH3oW z1TigTS+vP5eu>Vs*=ae=*dll5MduEP1T=`8m3yXLq5k()@V*r5fDxKidR5zweM@q> zC~EBET4WUw+Fv`^9jZZGLY~7*e zf1;<*ERDUA>|)ePHA~RZ$9t6*rWqhtrqJ^jE(vbvO@DT4MtI;Ozuznv5+jogn1SY^ ztf=*e>|jFY?u!7~w>cI_b*0|VC4>wBq``4TgLsKBXKg27JfF`TUyam|(ni^dyJ$WkrwPQ$|eXrX} zPtWKq0Y%norj%#B4pTjINRJKiCCT8kc0x;BRG7pb!{r>g>h{!VY%ppZYq$eTi`vQ2 z6%&@ca7cfN@Bc)wn&dtA659nkV~?z3nb&c~;r(r9)N%o1_$|ZsTMSz!y_i*=GX2Hv zeDmnmIG}(n`lE_mIxWe)yR3xgGw|YsE}m-w?_Z`tr8^}uGmGrPxd;0l*3nqIyx4+M z_LTWQ4{l2MHD1)oUqd5d#g0||cto2Pai(31^?rfbPBcPI5`g&k=LWc0)%nu2t_O1r zo{}#%u|e_N;+|i4=gJS*Y(aGKmEo|?!S!04)N<+?2W*@nXy~xdh8)SLM_+DZr&Xc@ zP8I`+YVq*JCV}6GHOJx8B@P}n*L1~3-NYZk57ODY{;0ut0a0Wzq=HOC0UUa9xR&9x zN-}Qk3AU3&nnstWADP^9TM-Np2;h zCDO6IG<_Lze_pL;O;wx~6BA@k;An>v{Q|$lv*(k7skrU;7T*^&A3OL!&z_h`Br5K{ z%@3_-H!i~UANY96W>#l0n+IbI-QumMBob+4yAiZ_ZwS{+o z2Wjc*7~^#tV4tl39eG)lId>RLv=4{oz6<5Em>FT8rK5#yp6TtMspe&h?Lhk=L!j=I zPm5i@1h5|yTPi?1@yrwj8|s%CV60z&3>}ZUN)2~|RQTA7V#CcI->w6`#soG{=QUS# zB~_sds0v}Fd;q@{A0Y9MP3y0uF&qN9{;*w1w%3-xy4A+|>qmma@2bbA@F63oi}16L%U{lxNYMw{d54OGQW$&aaOqg0dHWt{S7NY%J+4)`W+Z_%e$(gA7^M?3wOC@U}1^eyD2sCrgf+E9@{G6tqGUAdzN1- z>~6G?|}J+){Iv2DN-k@H%ZsW1{?ahpo1S3=#n9shBe1YV`lXD^4E? z{BrKV+!JX=F-!=Kk5}MoyhaMv&@gxY3pVEDNR`C<5P9n1+{elLYcHv0@dfB3G%Fro z#`hgbC&KfG7i_e9yQVJx_}S*Cr<`zCqg|R1S@?_03i`XsUX$e|#(Gj1043UMxw_29 zZX(Dmp_sq3xzt4Dx<(+}S>LvZ&+Ar~49Zux-uTytqi)r+xVnJWs?tH0E32pZ*KS}= zX)20p08?$)lUT3)UF|a5OF=#Iiv1n#Wt?g{K~;Sy&cs+!{{d4qF;cc9=-6E&FKe$v zU{#yKAXz#QG3jRaE^F-Ex7ODn>UYkhr_(**vj$`prt>h;LlYou$K97?>72m=5g@AQ zcRWe5s+Phej5LtUXUi#sZyUrXDt#KPag1=J;-_7=wWOzOkty$_YCTD24W;r-Na#}# z!!18=^^}v5Z+CfyPyv6+(#UbN64#tcO;qPawx2&N%h^_6+7IBLDHcF4xM?35EZxP= z-!iryF`@LBa*>L#xN}j;;h=Q;w#a$jC)(Yb%b|TxfaIvnm zXVR6S84;%YZl-D@9Ry(}R_Zcz(^#%w4KP0#S#;W^EJ|ep{AO{M&M(g27bsK1i}+sg zQ=sJn0mq$rkt9L-BGfU7?oPTr?C-Ux`{*-V4_+jmjz5+a5eu+F?vE zyfXu6L>~+BHAr>+2Dl&4v2YUDd5#ld;*d>87e??&b$aPrY{&jnU!@YI>V~WX5Q-7+ zZ$9@lU$}BJj)wKAg-)ZWHjO*LJ|t?e@@fc-eF)r4G^i&?OmD@{Lco^><$s zS%F3uSPD`N(%wZ7&Xd>H@H zRKIV=sDV_l&r?OGEzg8u=2wKiuNN0dKft`GKqC~Ou zB}}(|m$yInOnZf8XZGRa@_D}6TtO3wBzaDCIpSbi8nZs$(!>DEB5B@ZD&b&G(Wv5k zhz2@niY!r&D2>0uXR_p@2@GoNx#&(xP?s&`i$t{}d7zu2=MUIF?oN5$f{AbFgTWA^ zc!B{tv$=@-jIx;&@HMJA+bt%*F|TbR&tEL!NZ_HC4NVbYJH~@bujxgkv}~}r071qb zV;n+L~o)?zjNV zjP*Y7xfp*hIvseA&{@-wpi-T7wjH!vv3>8bSyVeS<(^&Z$NbK~Wy|$CeuV;j(*M)r zc#Yuuz>tW63b^jzy3K{9m&WuE)UKlEnvZ3<4h?NDflZ_5HVgR+X!qF`dkQ>4J*6Y% zAX8oy6zl4HaPlLmR|EWYo$s5FOuK`P=Td+kP^5p~??aLy&L9?PDM$KK0Z{$H4}#?L!i!U6RO)?!GG1S2A+y_eCh%%HoT0cm*^M0 z4{K(YSwtriK^LR^HlABhFEP~dt7Pc8NMq-~aOFpU?=u{`nHQl1nidvTJR9k8bRH&@ z1-{H=j%*v|G&!zS)g*>!kfuHbrInwRe0rFS61X`t^ruoAM@-YRYpVQP<@RCT;NwwA z2%YN`T56h#Y9&ts>4HNve2~Fsj&Sw&=l$^SrxzUTOnjY#xA8vp<+)Tab&@qT1Siam zcz2Z4whHp+l4Dfqi@Gem>? zC5O;^cNhh0?U=!K7zE=f)02y2nN}2l99&sG19kChH)%MTeN8)+rjrE^`SS!)sWrF6 zqQZ4YTF97(E8$_Y<%S+L`ofI4IQbMqN1JrhcC9A=}JWX0}#3b_-1=|DXfZmkO4b<78ZLU5Wl zi+FCjI7PDnFBXZhbQS2PP+sW6540vXs3Gri6xj@4LPT|s6M@Z3qiBfE7kjiGvr>4Z z|BF^b_|^&Aw7mh&1Q&?cxM@9qJmm5zH5n~ss9DB7z_wu>lXp z9zqNv*1=05;!D#LCV#_aq)C*)2UxMCmJMQ=yO4Fx!@coR?)LeVqk-pF2|)r@B;;cT zPA*)XJZTC8?1dH*uOn?QXNuSFH_aZbye>-2=+a!Om>${l0EyKGDG@EjfvTds212{P z!*BCt)7}5xPxBR{n{OcnVqz@kdi`0LVT~N=mvf7iQJ6)JM<=2(kw3pPMlpW%_g~IB zin-3nXtu;Z$GO2#@9_`i`QW=u$d-nxW2=@yxgi`1Ac=qK>e@+D*^nlSw}Y!{Z03|H2?M|@2&cM}&+Oytq>c;oiqJ`r^Z_xS-P zpXEQZ0>-41rsHM#rhVMsR*OR!zaw|51i$$|(}nXn?)cfKJC4?o2Jy$Fv4qRkWg%ZG zUpBYjHow;sSg~^NC(u?j+tmUnFaF}+hc&YG#)3~X9PIlPJDKNwhU)Z`Y?6gMr+a*g z+K!55+J)C2k-VikCm69$k3=S-jIzqdo$9b>3FB>Rb!*83hiT#*_Kp`isQnX}$|2 zKke=(f>){QOm30af5Z<-5vlL~RxM|0p-L2ZzMVr`>tQHwviC)56m06lzR~QI;nW8+ znmyS?!&f&Q6M{lp|6&(PM#xC+Bh+L5xhT!oI_>*^6v<1}uH)8?uCPQ}L}qkE)@H8X zFe_cR-W%mhEKBYmsY7k;ZuaQ9Jy3Ea9`nD`;<;0=P~LrJ|7gR57iGTOfi;ujie(P} zuOeleo`pD{A6Lb~c18&Wm2LcJl-eDC^d@~|7oqHax-x`!y?VG5$Q4cYfp1)#0qVp+ zkN{o}a-g$t%-FXDyrQ)*-88SR-JtE>|LeF-yS<{f0A4M5tl~9x>-=45HO;Co8aCdt zr`&K=4HDh8?plq*4QOn6d48TCfdjC!M;%_^#~yqyp+sxS*qCEzVe9_!e%1yVkKIO| z;qurqXnaXs#ziFEi*@J%LKQ;c^r_khWe2M>=a@w7@sku5tF>fLL3RR;^v|gl-#HX= z2?3@E)=CX~zP@YY1>WEX$yVDm;jE{jRZ6(HQC1$?&iHgH>g$7YMI*s&L4rit7L-BO z9$77xo*7?!3}3E0uD7$!xiC6z@8HRtTWSz`(o2&|-}jIF0qSGvzbPj@311OVAj-qX-4K0{~4n+T6@yr*$Jq|Jb(PuH$0Ki{sa=c2Z z=oXMArjh+Bu=3-+FZx}(b&R8Ahg4_mJDRs|M27Su!Ht^iaWcnVsV{fQH$?Xs()9Yw z@AEgWQHHu+=T%LOZ2;!t*Svts@a~zOHa=HvM4tJxAe{U9+78K#G@Q^NcRf>na`3hP zmR4k+%M3l3*5tAQIXb&QZ;ks}+{G258B52vS1fK9+?r}proy*mXdcatQTxe-b(er* zA-a)-t#2ocjvP0Xy-;|xp2@M>;`iA}y2ufsUguwcfz?tFGv}-`o)Q?tzwd9e@8j5U z{>UNWEd1d(zhXHmKxIbjGv=~W^MS3Xmm^nsyV#gM-wogxjd5=`_yqfljs6Gl1`Xu> zs5h48O_P!dwK}j3Kge2;$mWcM0&V&C^A)%K9%?8w_(3F+H*noS^m9KqmR7l_4B1VS zFkqVwJ|5C{wFAlK)bc7nIlHaw5r-@^rDGlz17#$- za%9a^ByN6JC;-cbH@Y0(@SsU{9^@SQj3( zC77_;iU2~ZNf(o16= z0dahOyWHZga)sh?`D)NvQ5J%Ec6%h{A_PPAK3b#x;5+aRt(UK9n!*I4tztdwzIE5&{MO{0ZJ+X9J@8HE-Go__Q)#kU zt1THbw$hq^xAXz?lB^)Q_k!8M{7>np)OLZ;xRZ@nup{`a)F&_1X^}%TWavdkx4kbi_0KD< z?As%0l8c5LA4<;S7?jM#6PD+fyQ6eY>_0kZSfTe{1PTi4d_DOeVCLlt24DH^KQ*gp z8_6y5W6R!*C)jD7@}4kUcCiOp`hOc)b>Jrc^KZr~$-WqBrCgN$3v+&`+vY@x+HK1e z|5VKuLO>C<0r7QU-)r8Lqx4JpPdtGCZMb3c-W8cD=KH zcDi~TrzJY2hjS!CDSWVvt9Jb^mGfylvGv0FxhO=ULt0<%o67jAX!OrTssr>1cCEnY z8^bD7*7`DCZ`CQBbXS3bR5pV?nU4J@+afa zHlP9ciVNA^C|k1744^KE6nN{93^t27JhD$TTS+W zR+2D#l8H)s3;Z&hLJpO*^mayF!Sy}}SuAOZ13LA%U2RFhn?i-tB&(9uVuIEJ43%d6 z-=A;oWp(er$PyLS&Bchd4Jy20ITP)OYc`h+!fqqRH?K#khBYD-qMN64(k$B7J#q^VqDrl^!;oCX|#* zLFwH!S@*yC23j_0MIzPr`zm9kD*1)aJtKe~0%Fo=-EqgigVGdG&sLV_lwMvKoss6j z^&`ZrL$IDm-%Whc$HkA85d1F^5I8UuUeTXMFCn!vIQNwmpKDVM=f1?b9X*ftl8cR-zPx` zbwG@6$M1s~4=TXoce9qSUm%rQxDxg}jnBc8FTb+^ZOmDXUB-~3Qwk4drWxPFWZ~BO zAH@R<*v|5G^byubb=;hn<#`a3^R_U$lzyg{K`B=Lo#F;_na9O7CfAr@MllJbeSWcpE-Reg9=o3O<QD7S+$w9VqwT~?S&IrQ$Rfc! zTL{NK^XocfGL%n5T7e-bI0&s;Dr#e0XnCpHf@jvI46srrn%#Qn<6oV*DvQNV{TzMH zly+#|h8p!pE?!J!PL8m^M%WttE=R2=1yvZ9_9y#c4_69fOndYfzOF09-4~K1D8gW5 zh+(fXF{TSQ+AX0cv5`da(>ZE}&j(|LKQhWsKubUS>9!_-MG3l?$)@i0pM9H^3 zE0heV1i@ZS8Vm-xRd z06!FPY4-(Hw95fdYo&+p`xcXybmoCL63c+AWd29OsPuRPHW3gf#l*!MbG_6dFzeF9 zfNKju##n7OQiMHXG?5OQw6Le0jv_2sOoM?iGie7Z%krd<`RbTmn97)(aIQnFS+`wf z^FJqZb`toETUP@=rLm@f^7oApbZgwc5A`EHQ#D<*%U8WPO#z4C>~BbGGwAy#6$(%n zuI?AbW)&C^3!K+z&x1t~2r;Wj!_GnqkoQ~MRH!z#JTF8_qJd&8XA(sAdSayKQy``f<)SsV~GW;K}A!0cf*f_dDuZVOAF35qK9A$O18V6nHNF2zWV)ZqxORJB&zg4A(o&_4D4Qj zrn7!MTB=ZoVy-D=vL>5)f|cYxXOPp4UN7voyp4zjbH9O}Y3~j?I3Ejkotu!b3Na#% z7_3-$)+Dl$(;YeW1#H^;cV7r19+bG*i-jW^))6|KfR+FF!$0piRz;RXPD(5Zkk#J~ejGs>g+xUqpDC4zwAdo>AeGggjbK+glb zMqfD=VC}QP7MhxUyHC1r(XVJOe7m2VcD5e1nqf6?Bz)VAszd}zN=GmF&f2^x`(SV{%zCI&W}EL=gu&%M|f zjnR%1NZHLLUbp6QaFRV7gZKG#%g#5L-Z#yZmlMb*~?^SBM_qEoB^0CW8|B3a2aUj;b>c+JRc z>3af78~$`~SM??;DoK>TdgQqjG{}GZZ4v))^kJQqSHY8i+udo8t9W zQ8)p(sZ#el8pI)z;+t6eZXvLMaV$RMZ}k#&Ke~JI1^3iJO&7=jGk}SGle2C*n0MP^ z`CrkEz@99X?Ax;o6WQ05-8WDj;j?8HfGl(p)s#9!y`x5i|S z1JEflH_`>8Ooshhjy&!o;1Z3y6$89An?Wr)>xl|bBRQcXJ{zka6L>Ix1UEZYnu;w| z?yjN{{&0o*xv!nBvNw2lG$K-$ZEmt&zDfaHb0w4JEK%L9zLE?vDZkff_4v zGz(`%3<$fia$O8}dM%~5y7LXm1M&NR#Npj-6S>fI*Ma;1P`0#0n*)ovLx8yZ-m~VZ ze~k+tedSZdlTl-z_-uy1ZR9Q^1q_)lRU&vGy`u_E5hk6!u5GJ*zxU!gVZS_-F&mUL z?HL%oAtg1ue7|ETuHnwY$0ZxE{#`_Ip6XL#zP;JM(zphV2fZt`gW(pBUB&Cg!H^&2 zaeF>j$E30YC1b;#?DJgLD-+*b@xF+ORJc%9pp};}X1gcq_+Pt%CKC2mo2yF%VJeL7 ze@%Q4l%y3EOUrp`&Si^rdtD7m5fKq0}`}NR+mthc!8t; zEk0>AS3IJ6QXu6&(k1fnprNGn=Q-C8F*y}o=bTT@$`rT-qTj)_dBjLOSt9_3ejiuF zA$KNU+HXrp$y1Bn4%X+*I6pN~C0`Lb3x-wv1a>Cl%8~CzQ+=7Kwqs_x5vVlV0=O%7 z{b@#dEoOk$&Q~MR!)WLLJiZ|U$6rtgv@dn{d6-pWi|kT0Q3h`kpH3>%8#bbI@2+Gt z!_=Cn?Vwyid}q%nN!!-U+;GiEfvVo94Oa9Hj>H07-_$?X0ukeiiX^Mom}P*;CPN8; z>D)*CVZU-I_@Z-YgFCJzj4Qdn0CxSS-&^jZ$C(NU!}w!Y5dE#9wQ~^O!fFfKuaC^p zbbe;rQ2`eGlGiU~p8ZBkT)Hg}guticiS&WOyT%^rN5hr*y&9c`-K(GKBTC6dYq&U> z8QdR4pL_>&QOb$5JBduEsY?(AXOl#b1X+bU=cYJbUPtNV@4=Ximy+#j1Z~Wz79ffQJ62BN$eaBMOMgnTGA1e_a^i zH1(6Nz`5jL_raCMd=Y{Z_L?;q@K(7`61iZqs5AL$-^72DF@2yrONf$o_hk)ccE(Pha<&z+&vTaY>1Ahl8IfyD2JoQ?GIr{coY&m;3%hKlNk7Mx3m*M%isk#}y#wA#|16><0> zwQjq6zU&gq{XE!y-eX6xQpUTr>wr0g`-d{PB=sqoEw-s&|D;u6eehibIIQNy!ZRYr zOc2L4A0E?e^$>O!g#epN+1O6jPGZG6HY!(Gi*5 z{q^tQ4-(SY$o7R#RhH#Pw77m-t-_GcrBawe7iz?0G*+%48ZP<9PevbClSyw=*9<=xAkcV%YtqXp*XyLfw)e!6F&%AM%{s&Gm zBMm3s`i(a}>rGCcp^qWTT*H3I`Www^C@ISI^nxF$lO!q?T)a6f(VyG!a){4Hr>R_k zjey3Xua7$ZLu>>cFz~g>lUO!tvNdlf92-5I9hU$ubc67TL3E)T!*?d;g?H46o0lSp z%pg^YIY~_(IQH%b&`v2ghOtgASE~H*dd92zba2+}vs^P=uyeR~ebAakTvdPMa$?Hr z225k;j_Z~2OA%d;D@K>F4KAi^hS5y$FY@rr94A~+c%PE~!K>;hWQjQW40n<1FU1O# zt)6irVfdYI1nd=C{;tK~w1JeM@4#F2Tf#+zIGS)cfMQW!5=N(}$H&z! z)vtgR?(&!Zc7HM7sCLEtEHeQYC38`^@?N#u6AJr-Iyt18B?(N{2==_m%2wLZt<%2wu?rPA{9LvS> z<%D&2*^NOeQ$wvZljm-Vvzn2E<(}Kg)fN2uC5~p@CaN^Eskym3mpO7>`jD;kT%YPv zN6l)!bUdIzon-wA&xkN>+jDQ?aPE!oObYoNUtM=w`#;dXHwK;Hv{8Y@TRJw2@^yy> zSuj7Ye3)4>Xc5Z94KWMhE3W}wy0qDmQGwPzraPu1q3W05%w6eA9skWWpZezE>Vtac zcV0+T#of!6e~3kpv$WV}ZOSH8qf0s1)OK1vl1NIr-MBztsM!AGpwz|>sY<-;^A4%NJRj6fhgn{n9fKNb7sI-|aI|O~^qkEBYaWD(! zU$J9^t_EY%|3Zh|8OyGRx)2biyi|<=M|>vMBF=Cs9DTzL+Wbxs2R0!PR&Wi>U>Q>^_oSa0scmqQ z`gY)=Ug2pl@&K*E*`0D2TMJOYC+F6zl^sJ@z|SzizmhP)biWSdy~{ZYR%htHSP&_b z+S+mDt%s@w@YFJdAGVK)OCA;hS;G$>9V_xiz2kdZV*_g_43%;% zuRbAs-|Fe1*6M>ZQ>~03 z-e+? z_ULn7JUF|XZ{-WRK~XX$GXpu^w$q5|Cm&YBiSL(*VGDYdUvPx%+yZQ!;i)!G$G^m^ z`z%-_JH#Lo>`rEXUM4gAZAmD^jEr8%E9X(7lOyfkzSihXHw?sxS0e= z=2qSY8CQW+4T0@aOseO{;t-Ak9(P52>YJVwH(;~EoD9acCQSn-A4jeRSr~QQ^GSV9 z+4g6Sbs>xIg6vXEYSaDPOL7}?rH#EOuZ8SiNnZ8kg&C&zUfUN+oZ|iTD;bU(|LpeT zK`lZm#UqR;=is3Jr>K|!9eCwE|a!h)%38BklD?5^nc>ji@peZl)N6 zFsV}=nA1WfnD@RrY@=I|u+T(zTZD&`@#s^bWyVJ$78Gon4_nBD0x0mdCd_)0yTN~t z=kAcD5X-0gt$7;X`C&70q*1%~^Yh#ni`A_>wKjuYaqC*LcG{+5qulPL#m3AFyGUfO z^QKiYf6V%$`L^_Jh;ywCJ5baM$hNBOHS5lcbGdY3OWl**l3zp7tTwLLftFzIMSZ1c zJEE{MhqtPmuIWuL;qyGCNgyLrBFN_~TAsl|nBRvze^}Lp92~Z{4t&*aNU=MK7ilF*fmRChbQ3=MlpEt|7`;%7| zFVBQ904nzIKMG0CL-Mk@u^;L4bJ$9!$!-mIjTL6~bQP3Ug3j?sT)rYx2gkt8Pd67O zt&YQ+RCe&in(P}NR`iid6R}wwT!kS4Rt*8>N^`7X^Jf?za>)$rmqP#CEn=QoZ zlI~s1D#{0qMJNmPCM_|*0pZ|ZK+%46$B{^f@$~XDG4WNjXCm#J1&`n5p|N}50M*mL z@r%XJwA_{;@5eDji`1#bYM82csr!ttV3}G)!zBkjZiQGzP;`7INgS< zLoJ@~%rUVex@w2qv=Vlq8s*bPpT&y5xy6?3R`CpacjB9pw4Hqa+;aqH$$WGYEX|gE zmzr#Dt&Pa6OehR9gq=q>OJkySTbnY_v@mPGq5Vi>|2Lsh+9dg*0WoR{iVZViUusuJ_WFcDrt4U8nTflL!|6UnT}RbP8dAS(Q?S#o_1nTb><7#Kg4V0 zbPGRwc8-I`H*Z5T$2Uwka&!il;@w}?Xj5fO1*qn)GRH{WTm{HglP`^V;Ih`%Sj~FA z4uRoLX~X4y-MJ;oJi;VpKrhdq&I8UdN60KFmN{eJ>R$5;w(_79LS} zR>+FVF(*0L0=lwY`ue_cHGxGQ zNYli+LF0D&1d`(Kl7ZDxu2r?!1{b^p!|`h9^lmFX_@jRfaK?ZMP(S76Rqc$&t=OMX zRj5=K{gM>+F4_l30?gq^yX~T>;t1t@tMUan96DrIv?Aw@QHeiv>N$#TH}Oc!h>%wd z!p?p=K}DEnehp`E3Htix<9V=#XaFK}c~x>-aA%@uAORCZdlyh&KVF^h9_qG+= zLwV7KxN@5M%?AB%x`f?6P?Wk`B zD#_gc=5aGswhY-UfNmh((Qiwz$~>OQFtn*1ij90e*gSzQJ1lIVOwaac{YWZ|#~Yv9 zwYtHxG1vC#ct`UzM0Q}nQ2x&6>NA)}!NHDK`(q{LZB@~Z&*8P%drh)KiL2xgB=4c| z|7hC(7PoMtj^!P>*NY-Y*WUES!!j#dQoY1y(s{@9GGK_lFRy;>iJ;9wma57(OB9p& za!5+}`)%OwvzEd_BZS|O1nCB|cfq0$(fHTZHJQ8V8vV$GeT=~K@zrC?NWcftx4187 zWrV0LCeQaJneLKf1a0Lf(l6GN5mSt=)Dio%lWFzM1axNO_$tQrfzcWJ}i zY8$ht1f*;;nzp0ZX&N`Yu&1jNlj~*4=&R89Xi4|bd*)mU1b>wq6dR6OY6OoZ3YW! z7k1rv&%u%J!vJX=hlR4C(cf`xai~zx9J=?u0Q-d-H7|NOWl$nV?5_RZLZ-3j#tQSB zpJHph*8L^eprq(FSU23Jr((6*y<2H=iGFHDWK-m0mcb z$N!WYE*PLIAgD+<*D9#SYs71lU@dU-tqKgd+g#CEYwG56fB{yFgFQo(}a!U%TUr&@>=K>h5r(?2F6>Sl^hROo57D5is^6r7a9 zCF|bZ_h&^EgvVAnm0mPh%ZZi=r^MNdfyk(j+v}tek(10xnAuS_SkZzL%TIRLe#GR+ zQTbj6>ke~Gn^fSmr$3+z2NG@~Vd!n|3vRfTfOU7cteBzNl#kay9ZhAqzL$-w(0LgR zY55G;w@HgiPch@m-KFCd&!8{4Ux8m{3xxzLQr`(t#BfLypp}l3Mf&!K9Ckl?xOL$>2 zswu-*CVs2r=QdVF#Px24`AHp>9t@>LRX!e%je-dZ#4EkRy^(i_LsqIa$A(bJh}no< zJ_(O_{_;OnW@I`BA$*z5q>2iw)ZSONdQu%0=p>SFu7-6ce8EGD!yCQny#Yyt!xnL8 z_E}Rz}6!0InnxnPom4;S#Zd}EqWM7`$j2x(rQ$L~b6h%bXE1s&krrMK$4!d?p_Vi{E zP^>M;H>T${+x3mf+7UhO=VSSa;>Nm_RZN@+(GhL6M6^mvebwHkXz=#|J1TX5Pa8?W zEBr%&x_m3nP#d+!H4Md23hzD>1E6jdAfuXW;m9$E8mO)Q{jD992ZJUG$5GaX=?s z7aq1m+Qr1T2)`lL+MKjlEN25WHt~1ewr@Z9=MC6@HUAZvLhyUi~cN5}90WUgp*~ei2P7OamET{uonN_Brr&-jYY^_V9rNhM7$NxmgnK zy@RNWo$SAySMaJ}n!`^luu+N%=vEel)57pp-+dQ!Xuu&s(9{Z2?lZ^HV>69=Z)uv{U_e03+u{`n-6H ze^qk&D14e_*?LKX^pd(Ha^PNn;8_wZ^Yj*Otzu)>)u!c}9<& zS~;J#hXfRamO=fO7@>;g98?*&_FeO9H#$O`=Z`b$wQT0Ya_8Q@^G7#6uEdzgukTMG zNx9~>N@XGIt?1#vLro@F26>;@1FX0ZE4(d6k^0DAOAj3oNrYI2@9KtCkG+k=uSI`Xq@s zv@TDSWV;?XW}JT)zl*whO7c?!w#)+#-Jv7Xr7rJZzmvqTt<|8>R^4JalkW4d*ELJq zygoi{o$pp^n;?6(PYZg9;k>J?cP}E&N51u2lYRBPDR9{`nizm)>j|H2?xtIAdS%>( zaQtv<)rAogtAR5ayIb(&wBkGM1F3>Gk5N>phmxq<9km$tpd7w`%l=yC5L(wyVeLpx z-gau6X*VyoW$9fZjlV#VNcO#6CAlY+5=H`ezdDOv)low|g(E_VHNvWx%(01T)pI6P zOdo!Z3OZ9+sP?mo{PBC1Mx!}TpZ#{8J$Z6P2mvyGa!|Uu zVr!?Nml7rQ$Y`Zw^yX5H;f;VM+fR6s0KhLL$o2jk>H-+{o7AE3+eET~%?x zqx0bB`x^@lS1pIf7e~klX;kv=q52hX360h>PodSj;^k^`XZZ#mUy%9udZgT zE}(KkbvKdR!nMPE{#wj!tO8A_EV9+L4^J2DeNMnXrhsq*&LU#!w!%xt2?Pk65cL z?O@xpbosM#xbnxOaUh2#s5pXRlpAf7GAJsGsw5iBQb|B1K24(7vZZax4aWtU z!xbjIyCeqLj_F3p>v~>jlBMI+sE7vZs)$W*r>|5;-|M1zqHARKL<~`Q**kQDAkp7l z14!(t3LJXRzU;;23UO+4oSH>|*YO`OsD8@p+JId*?DbOQoO1qNEUx1_QQKMZXwkmJQHnQIY^MG@x>-HQ^Nr+f4pSisj+?u?0!2CuPtn-T9#(}| zv&wusTZfw7aE9Cy9XR*A{?RVl&hvTy+$>IC@XRqLt-FLUOxqQFve`S{6qg6?o@=~g zyuAL`ph6u1_p`q~dqMmawH;(0dgmeBk_#9{HmE0M!;x8Ju)LozBtA*)cXyiI6Nip| zOsuC1`Xz-mCU$SLwVHK2J}*X{mLc@R$cskiZgxv5Ajhh)t3EMmM_Uf$0>$MYtT=_< zv$&5)T}nEMpydGiy)6Rw=MA^(QIKM4sFw4lFoo{i;?3VXW%oH=M1*ivg->c;_pV74WTW>toej8o@n3mu6$s*AJmSx-GHN}K6<-b>GCmTA?Zzx$!&Xfm&jQg4z52q1afo#wzg@MZ znywa4Jgb}r`3M}vc`*gxr0w$zpv{HJwk2O%s+8ZotkSm?<` z!rpf>Uo_bA!roCMfFeT0IqFzHrvIq^7J#&aQuDG@c-mepcu!}pHtLyB(4!sV-n0Zv zpByU^)djpF4y|>4@Hw2*Wk9bAY_Z7m4ybAR@?tcy%%6S0;f+DqY1b-~_F)8u@SUe* z&vk#G%UxyBkz+LYL(5Ia@d1YB9$)B_S%ztkGE{r&!3go;ZbpCp&Ry(*^A9!2eJuI>etdQxFIoQqM z0~T@^gDkw03d${b0k#rK1mm2)JZ~=zKNy%&(P58hP`E2-Ubb@S8k_xJBbvr1v?GP6 zoWlwKg(BZow(9Yny}#|G>Sm7&{=Da@b(bLzMjxeAa^1_rK7J$E&~D{ zW0K|OHy?O3tmte$4jptW-k2)4XCJuFJj(4Sp>~pIEu-SX0$UotAc3Jyjwe{9MI#22 z;fu}<%4;PrNRf$7zTf;lOt=Q9zzbdP&W$^c6eJ64>Ul3HEfu8&RFZ@se>jps;_nh< zquj!9wq}2HTl^iHd8%u3ikI@W@nl=Oh(*%oWrt#t2@TWbZ%q@Oyr`1r(Mv*&opVM; znzNIUOc`?E8ZG|EdGvQ(me}fHka9@jX@AlbI`OG2tkN@NXxEX5jl+Ue$=fia()U$R z`FnB$7M3K@eRtc6Fa{;}_p=iu52u0c3=Nv}d%b~wgy+=K-A@xqT{Ug=2o(B>eXvH~ z#H8kQ+=r3$zb+qF##+TB8mH9$R@|*E>K)u6ezNuy>%DB^Hwi>neULp5P=V{ozk&NNRVbuq>kjL8(#!>^&%F(6#@*((C3Q z{!X`w{Jf}0BTFgArZ~@|6PcA4;o0r2FF>cRUJ=IYeu@Ax1mD zy{`AU727L;&=Xj-=V_8F0Jug|d z2x|(fF?_MvgWt3NH5U6W3nl^xZmGso9?qcdd^q$x#F7X~_$E4zyMwpCSm&>l`r>l^ z#RUO@;7H@!$*+=VZx-QV#)B<=x>I3386B4ZGEDILI=i?_mxr;R1^e;>kb`zFSYvj( zaDvp~F~y})k?qy8&M0n%c1L3?rB#Uv%{7Y5yG7L<UDa%wZ-Sm=348dfRe01gl^AL*wC-g+L#0Fmgu~h?h>2| zqo`tafijMtA$wt#+>cpC!W;RTh2rA=!)a_QeC-=R^698#Rvt z5QJh^EPP1anOhbu$>O%)@LVY|M0gMbFRkbGiSM1)@4xRTa3>SrB~A{z?1+_s?PAj`yD5*3-OzzL@y=vU~z`O zVgZs2A16Hwq3sw;8nf2(R|zuL39HE?OI_~%!cLyqLIGW#FuAMSz4nK_)jWoK+uA%t z%%*qC^#9`Pt>2;m`)%)`q#LA$5(Pv$XXp@6B!+GQ0YPA3=uQVvkWjiA5b5ql5C&uifT4!QWN**cs; zF3?no9CpjuYPMR^o!tUWm)pJctgy2<$M|Y<-!Lb`O6BNl+W!@Gu(y262Og9Y>-RFN z?Q?!9rwce)uMH4LpSYA{){S;E2PHp&f8LslOgIZh;c2bYXMdE$=s3s1n3+b3dD;1$ zs{8PnXEFZlXkUbcrv2zdlw8D{()!Ok)RmCMU7A zI{-@PyM8TL4T6&1egn}X+pM|=ekxDO2i7P0*EEt7$p1-Ehth8`lR)Pon=x7u>646! zFW@scoFgb)#vf13Rw_>uJgWD;h*ppfdo!{Nv*N)R; zMb9*q-#0Kh{pFRt;l-7NbI)g6`~HuxUzaJ7N=QH|v+*$&Bje}0-%}2HFC%!%M~5Sc zN9QQr)(2O1-5bNr(fa^#jl+pM1pO5(cEK*X&e6@Dr*2i+OaTm*lMct(Gitg@KiM+% zyf~IyVt#1Hq{J-fbgrzw5=Pt_!ooex=#2%tR=mFm< zVM?OGJ#>ZdpQi*R99vWNzNgIGFVf&-7$v)EBWNlu$z`3P{;kB1VjVkp{iVS6F_D(_)o#gl*^LRVm;zxv-|qG6m0(shofbDRa#FG z#??5f+$Lkai}df-N#em%tP?WuOw|4kn#9Q)#6m_G2X2N2B5?5kP+eXqrn#31s}oZ9 z7p9g!CEkOk!Njdy*A88?cMq^)wIYU@p+cf_*4O9Ot))HY-T`z3g8?dg;*w(Y{Oy}z zuwC4e$L!1@m7ea;+==id&iGBAYpBSGz&{TyOY@iG%Q`!dzbc|gp(89F5Gn;Uts94B zODk+TRv-K%?*fQ-Lx+Q%PAJ(oH)L9sdsKT99xby22deh|H$U=2@b;-aK^&QooH8)9ZD9-RK!1+dI1w3oXBW5xLB z&D(=dxR04UiOT>gat6C$fWX%Ze6HXD??#WL1-P;#B| zG&3~&P~3fa7R8o&GCr0fgk*iJW9bwuLJPoiT00lGnG#qZ)g4h_uIb1gI?a0U99?m+ z9dw`b2T{0>9HEXf6}7A-rMPCrPSeEO zB%{SVoQs*p-yj^}j5Kw1IJGJfgruJmUUS= zoO3MlY&Ak|1scx_$PpXya?}srmRrCs{}uO++>Z|)(Ib0KvAJnoruahKj%s1tNjpK^ z^|()qB2Bp;i@KTVmlewje_f4~{fn59h3?9ZL{}mV zPBPmu#a)jGJnlW*uUTgmGfZ->?M)|NVLzcmCj$(OR=uuKcT-zJ&bmMCq@+il%#J&T zSsJnZ{Z}fF0j)1z=$X#-*C5Bv=E^42GJF5Q(f?4KbDp@%1Phv^ODr(wc- zSsThataD`Z8CUD)xJ5t?s3bT$M_@#5$MsW5vzMO*%GZ|ZB(R}On!qhqs-fErsnEr5 zq^rFJY7NF%VG)|zy?=Vs=8ngDw_foK3N>nkN$TfdL-yh~lGb0>pjT7r#*VX)-8RU}`Vg#Coe6_?MV>##7pEkGHi#+iginNP16xNtO+w##dWTdAAmfMmzQ~!6c|7;4sIf~%^t8{%kG83yTUs#7=8zA_?Q5c$i= zFZE|VsHqAuxA}mQv7(-E}lYaJ%dH|kva(y z3BTl^rS~ii5)NPmzk$$gJr}i2y4=>IN&aQQY+(z^9FpUtXl*h@Pl{*iQ(Nf<`p*1r z7xRF!7mjX%V%vk<56QY%nD1z&>tNQW*FqgS>MloDh!~wXM7v^B;kvjG{#>tcnKMokXqK#K3X<@nz z`GT;_R9u`Uc<%gMNK6iE6A#4rh;~b_tny$D;GWv7^kL$Xs*f=h-$Bv$giZ6M+r_%@ z3L-Kt_t6s@PC=ytbhFfaPwc+g%wl_jv_#{|3ub~*|2sVRXeJ?7Na`&I^{414!lZam zv;L{rddS$?m6Q+frRd1idasLq?TM1pqW~smJW-glMt)mHjz!Y}}nT9mM zMiE4Tzl2~5!(jToD_fanEQM?>qy1c;FAazcDH?lkOY?yio+K)_ENo>^NU&)9aj%ph zMN-C^zeo*Wt-lFAwBOZzf<6+q?hr*c6SDPGn-Yn#FmVm>g;b{B(lupI*pvcbT_Tx( zBJ4ebh$^%y{I5$$2NC%I^%%*F&_YCOgby)c6Sy+d2g3WOBq$;qlo?%4} zk!e1(q&TdBpZRUPt=5Q;)d$?EZSADoBVGD-V)p9!{{3W&cmJ5keht+Y_NtgL$vvp1 z(4^I`4zu@gVa1R8`};_D`{tYy)+Cz}&k78)u-Vn%j2u2QX{hRg1@ZqRdp+%8)_SWN zw5G~pczj`g$l*cxqbUyA^wrBjHw*pp6zx6e?rMRQ1JC>mJS%gft1BAiHrTGa@MS5o zPFPUY$?Wjogf7=vQrMM$P+X55&(_*$;j)Fjs0@8=s>flRQ^JF;j6Rs+v#Hh`jGn&N z-K(wOVq`i$1zkf^HR<-ycZxuTEb#S$0H1Sh(B6(vH}0O3DRi82`F*tQ)qHAqFwtjT z-5D$9*d#Wc+^@%bXY(#`wtXFMh<9Fk5{lI4yMK2zJhJ7N-1|?_aI$U2ZYM+{Tt}1! zfl!eVKV1@@<}VCx1YSE{>k_;=KWgD_qXZT72F(c2C7G5W$_7(xn--6OIi&>mO)g6v zhf|FmVr^*5f+lbbREYaSqU~6JW$_?Lg6AC@EAnfHX-AcMh)u>LBOGqy2G1Eg_t;pR zd1(QsT6eYOVk+6BggKNq`t!-sE!@T(-sIH|>A%HAo~}`RW7p1l=|01fK?~h$)0cT0 zq@XZmY_}H`GIiu}lSz&Je6Vr!ACgfwyuWCt%Kdh+Tg06ty>xgik$-N$Ywfy$29caQ z((IJQ5JZk!%>y{V+a#tUJ-U4!Z3|w?6o|k&U7_RI;M~T)QJGfsq}z8{2^$**rD)X7cAs^O zUKU9zzcM6n@Xx}*_Md-q>$npWo_U4x8+}(v9VR&_j9=SuSc^1yZDQ7#-79Nyh7n`C zm4Q*Y&g~ER_6`5{9@&*vkMZF!cghJIdR0%Ea}7t;`~SiqnYL6Bw|_9F$Mg3carHxW zGvq0SHL)T>8)t|yp{E}AcK*y~o$>#F7LsxTtcW>0zS;aQ_ibsZjh`fr6h5*CU9&AE zxn`Y-dqV_}5CYD%?DTwtdUBV4>pA>E?+jZei0!CRJDyniF{(cqj(;E%L1Zs0+Bl8% zH-s~BHd?a0Se96{Sh@Q72xlfuEub>!c-m9E(T|hjx7(L^ze`AR!8&(2C&Xl#Edv*O za#9>?m_s9v0KqDVPLT(Aa61_VBkrl_H65+cVH`K%4LEp_&vB&{TSGMj$r&D!#m zH@C{I7SK&Zs$cZX(H4*GgP)y;PofLAcfV9271FDif=Y!yZ&f4!F#_xfxH6W1cOh#f z&k*&PZYBFZ1>0gwEgae$4vD!sst5$t08D(>wUtR;Ns5cAb0gK{@rV=wKd~F6W>jOl zEs9o)=Z zg;xA#&$AmO75T|XNFq>N{XGvZ1lJJqZj`2a`cnx^6%YD7;D>qC@K;&HbeVxxO}DX1 zYsENgiTRe_wS5;)r++UAO+etOKi-NIak$Gvls-83Zb^V;-@A|9*y+wh2e`q#fp0ow zz5dGgBPb@enyI;r!Pi58%o4yWQwh(Aj-K03q-4U0Dbd6;iOr@;O%uxUqus0OsT>ol z(kHp!gz2sbMZmK4L%xEv9Vd&(?%h0uWhli=^~cN)0pi^OYK!5f0vbMYwG56#;xfZ;v%EP_snk-V|1qB{pMf zS7F6c3%W>E2MNx*+OvEd>1fc1S%D*_KwL}!w~d#XxC2SQrl~f5V2_Tq~KA4=y)B ze6>Lj>o~$ z2&Kq3S(4u|1J%JElEfYhOG_-w_j50b&Pxp2c>*>>ay}wkN0vz9XlDp0rTbD&jZ>mK zDHRo%m-y#=4*sz}qT-G#RESH?$9<*T>#JS)xu2F3!v9)#| zvvd(d@CL52pK^98Q?Jof9mv$oL(cMv%y<54x0Y=#LKB+6rU0^*m4L1sb+0fr%1SclR20AM}LBl-zoZVSTI?Ubh;Vj)i8YLr*3HY zn)dPT+4`Hspbm^y>zRgpC-fVVYiN)itg=Yv@DY5B2tjcLt#UnLqbX~dq1&kvcp6Xw zKGSP%o(UfGdnDDg2%VdD3((40TuMRhzl#4d;AV!$`>ukBS6^?=B1M!APa`6j<_(eS z5~iM|@6z#pZ~S!Hf^|d+y+GeLz7u1pId2Ufu~tYxN1PIOm-U=An}a0OX4HC6M8x%l zhc0kP@lm5p!{d9d)1@;4t9DI#zX@Rb*~@|qs0Y8OSUrU7Tuol6v3YIj?2kZHos^ZNbS~7gv^HXipwp z`P<(q9iobm@1+Qf#SJ0;;+u>03D)@)Fx#QGQ>KNI5{ELRaq30y=>Ns?V^ESnzU4p_ z$_bfMKws!#Hs7Lk&{C)s{(-{ym%F{>j^N63#htp43e^8}0dRW+@9_PPuV(lmkQkbB zEjQ_z`BA8moN3FSy&G0mFSsvUs9ATt)Bog2ykHFVi#C{1MXJSPndVKw4}FG zxF|;9gvdbsSV;Kx5$daRUeQXP%vBi>b2gKR-cw!6b z-4*k4TxTzl{k@ep>9cf{x?B*CT(q+dFNo)M<3p$sj?>jo!vj)cYE;PcuGh4d zbIm&0O8OEMESyg3Z$tDm4vE7TftmvjdUohccZ1C*>Sei3v@fLlZp411ql25prx}RN zfa^bRouITM`g#S+d4z6?UUe?r@4%6Bp9G^n^ z6eXbGcuyX)F6$Hg`PIQ-y8^0e3^nsyBmXKBHWM3bfC*I+_uPVNF$V4d!-#v>H`JI- zTT5djoaNXkR>PG)_bZ=rc=a`yj*?M=ZX?v}S*BK#xpgaalxOVMSZYKUFC9d1nl#^- zzwX-*QID&eKr$BnPKSZ5uYRejPDUYGhEH zI?SYuU42op>{H1#hlD_5Q;N*({A9*DzHzGdYjm;I4k) z8#Q+h%|o7U(j3^%1H7}4MnNVAcF&fEhwaa~b zEGQ%UjJirskVG4qy&U>$?%^AAbd1Y{`T{F{c^h>I%L7ji~TGT5KrN&EV6)pexIk&t=GW z%&N2@s(wWLZZq!Az6lj8^=K2i1iwn7D5C^s^KiW$Kb};fhhC^yeF>y}^bQ~0>2(UE zO`Vg2t{s?JbCA!#;@Cq@r0*v!ZYK}#&f9a&$olYsZ)~ug(3xf*I;UstYehRVd=CeF z(MLQ?`U)v9IoQ=|V9c2-87Kw!!<>D3q`h9+{77nTtmDok;B9F8t%qyI>^bthqvJ2d*X){J$eiX~E!&4;Y&G-K(8vy=5E`;7=v$c2AD|6+OJrrzSZ9)t`$ z>}viBU6>ZkiOuqQd7=}ZZ>gn^dHryg+sS4|L|w-38Z55oRnXxlqke6Md_3EAnyyd( z=Ro~XIVVoKe$CD}N#No6mJdig~)YAQZxPhwc zv!xPOBAL*Y3?_yxWBCOX*cH2EYaakldN`P01nos2Oo_2+6mJkJ{20Gjo2>AONh4BPk z<;X@p`Y8CZD_go~@Y#0egHrgM-X6+_oSgbgoLK-dck4#=O7|nJqm%0|-Zwr8@!qeu zfd;lVL0z=D4Ei;Im5bQqxX~{8#w7kcBhg?3Wj*1NA4-ZpgxK(aAJT;NTmii!XMQyA zIA*@lPR@dXJ*oK)zpM9swh4ZmK1h^TZdSWcM&l^gFIx^`Ezgw@8oy-eQfHtz{ZiX= zeAjV^#@{C-7CQw^Z-=@t0AFW?#HPd6W(YG|dxk!DEm&q>;HX`?|Mh)W0FQ^m*>T-$ z2EKI@SF{TP!N1M_jWms&0-c(`1XS9nPy~KUef1i=}>0%i*;2 zo4yYa*lx`(9RMTfQkDg=6>T^Fxx*Tvdovv7?-tVeRL_HFg^c1sZA=ixO(O+wOcF&f zW&s$f9@QpReRc2J+enUpefI@)paNHBjuM7!kC!GX&uU#B@6P7Omq6gVES=t*|njo5k|R7aeU^j}roq zO95i;Pe)*6neO}ifI|rG>4+)%%@g$IZe59KHy-xVv+6~9OUKW?7C1LLq@{Kq0T(v* zE($LRFBl(@*fx}8pV&UB6P*l~?AEFnn^NCNu1bXx(t|8`HeJqaQ(07~U4S z8;563XE63nI*vaYkj1)t#P0Aa)l||c3+dj~@I;R#f<*tQqy@(E;`Q)(x)WassDd3{ zGCpe(?x#Iz&RVkUa7;{eTviHqS5C?rv2+R0TPm(KwjoPz9ciWlp#w~xhc~NPl%~>o zFaFKmj6ZE^!vT{cR*kPk+b zQSrD37-!oSTrKRcN@67~Z~d!JLD_D?=~~(`%ahj<&?EXC*ER#NoKtPp_P+nmmp_lc zq_jN_*w)R7n!k0(xm@#rPzMQx>Fm|O^L4E)}8mF_+U@)`upn^L?eG_t~?(W@EY~S zDIa@>05H0<{%`6t>4n_2$o-Q5meb!91429QLnPFjsiu_xZT-(H+~pkY3)3m5rX8M_ z`)6Dx3)60J&g8vkdpm7)udSj(G)+0{3s5$*4aW24Za?FG96;qy_nKxp?mM${`2!XjwE4Q-jsoD%CwEdhZl@tL}ByR>fRWnS7yfj$k^kZku>3C)J<` z9<8qozTL?*^!1mD_!m!D4VYO-J8-FqYxwo{=1Nth{Wz)e69u?ZIwQuqgqc|hxd8jN zq4z3EdhfI4=aZiuz9Y9=_veL2k~`khQk}fkHcp~*gQpD&QjRWzV-Ld?C%#=+4YMj_ z$&c(rB8{^F^UY}kH3C6ivV_x_(!{rj* z{8}^HbAI$y;8or&p6C5-=l%JN*C^Jc`_V!nTbws=uhX`bAadCM+&lQ(n{wGWLI9c@ zGyWz+rq8=lj{kLKW?aeH+h#+JhI60uSJC1|qj^xB)*#5W6kRkzVA^_kRrdc9e3`!g z72ej8330U{ZXfk)Ss2WceMY>einw<9VKB9FjJa3FglAv5b8dsEt)0Dzm=hGwgBzx; z?upZ)-z^YdN|<8cO34Tt&Q@B+s7N&z&x&8gvfqP(<7B6V`FBw)pt=Qhf zm?RKw1{T(OLfF-aNIf-*rZ=$2k`Q91bbZ$$WJM?T5AFDa)snH^ z71?eoSr0bA4sP46d|<+&xqs48O_#p3j*?NXbAXoDev8pPG$Z+#re0Gk8+%^Ko8i_5 z_0U(KvqDb7L9jIKBqJu!Iv=JW9U5)u3-; zATUt&Jj_tOYQ^eHgg{ruRd*x!@mGubOY zIeWOd@*T6A4Ub|>Q(pXyD>xF)+Un&!v+(Cbz7t!WHsr9N$V`m=5n;QeMELK#uMy2%H&{1i%j(QOtfsXH zCY(5~t>q>YWmK;KMR0)(Gxjwe-`P}uz8K~iFDlhtK}}`({W9NG0=kdKxvk}tTyLTF zj~3R)W}JKu$GEHTQ{njyBx7ac4TJ=5JL*gT9;|AuR$VTEB9}C20x7TCxP|})2SJ-K z4^AQu&j&jK3$?>^qVL{2_r7-J#i&E}Z!RfPqc9w8-4}69mZg&55T&7o{5e8usL1 z*j!==epfRh5h>VgQu$|@Bgmw_sD^l4#@)kFP>87-v?LZ_SE zgD(<7lIID(U!gnKePdotOEorY+BK8;O?R&IxqOV`%-VX5!}p9C<*AKqoQLb~cTTNj zZF{xz@PCixp+B!?Nz#lsxIqTrAdMQX3wFwFk>NYf4Grm5teCn3&zI<~*?lN8XH-(w z;ElXWf+i837d1Jp-UqQnx#NSfxBk4JwmP5~T6IE2zSCl2XzrGWx)oTBY~_m8h|E3li4K&VWbO zplfQfAJ@4ZLC_Fz@qF*g;d6iE*gZ-e0vkM0{xj&_YE#qK(;zLVNo&r$em&tfuH;C$ z$0wAff4ORI{w-cXG732MdQN|=)^Xa{m5ktczwIOzl;c#(QzCcqUXEbt?yM1IR9Qan z25*bFqM0+wiE0$h?kJV5Wnurkr&n(8qds`{y|B)OXS$)aGIvBUACrBXy9FwJuR0Y! z^cVf`d-!NV+}ZHRpif+`v|nUxH_7nWl5pGSdL`9UC=yST$DD6as8(}t#dWUxOfqG7 z>#V}NJ=#%pB_vH`OZs?)Zm^0uc?-PPdh)BmC^DD-?6ZIGINhYnz6}=~YsdnZ2tGGYj z9Vc1;$QpvqcS>*?|H)<^*ON}9Z_{S#{KLIBa+n)vVCMS@cUM_@ z$!Yw;s9gT^uNQ^?g_is`V>0y)>wpUr2`G+~CW|~z-eU2T=|SB(m=L)x)9I)ppfwm^ zQg`$2A8C?3&@mrZ*z*51;=)G~MEAop(cx3toAk1?|3YxFW0J`+^nU+QZWjKi`nAPv z!dCu;FcbTy(ti)F5>?kqOwzCwlOp`|*vm80UFDbI_^U&JAKhl+8`hE&?zp|P4)##H zoNs1DoIlJ-Nb%vRkKwl99~EI$5f?mfG%J*8tTnjDIYaD{o{$!eaVnX+KNQmjuZR`8 zzWuC4DiIi{L^@)4T!1CI5&H5~k@?&-mDm%Eaox7T*4>`yprNZD~U zJP$!TWh=t@{5x0Wi1W$(MEo zfm~c4XSl1&zj#_^>mtuQ`TT{+09sNn@`Mbqf{TQN6~||=+Y~jg3j;_(wM+w*j8qsV zNp0*)%82&h(L+MXuf_rG4vI;6Iu7_@!?yj@GruSXAjS2XsNB4qbxgU?kUrYVTTzQ| z6h0L2vgt(Ef*@E%-aN^DrL9&9lKI)2q<-R(?!d;02k=4_Acg|G0$z&xVbf-vi;EER zSVOe5gZM?L`CD?|3qOP%dPUAV2Pd}KQv)8-1dzt8_!@enK0yf#Wmx48lScDIabEC$ zk%($8eD8Aq>otu~DO`Gytb;* zSd@sS3~xwdwF~-&M(ri4fuiGd4?o1jvjwsBig~1gh;7w!Q%Z=U{q|5G4joR7X z12<16XT{H8<&m~aL21L0g)~ADo(lSTD*0a^cjxI@yZotnx~nVvo?d_c=TE0qSxdTK zy8RhOP@PEAKK3>5?*y?Dye}pyYeo=OnLIE%h#T38*f5)E&yUVDQH4RWySzx(-n0-E zNk?#;dTnr>#COF-oRp4=NBAH33x+K+T$z)GKpkC_86>ne)w@lw*&>lw7<98G3@pOj z;eUP$Y@~%5Gcl)&4Iv0Kztd($qVlOTpM^aq;6xt|4cSN|F#_~Tl4(nY4r0N*l zx&pPmqeBAMl{Lq z5%eH3(Au5YTdv64^%IlYxQJcUQ93H~DaYT!C~_tHZJ1c0Hke}mMBhh7*2?Hlz<$3Q zrViW6W+yEJ1!oog%PB3p;6Lu4^Ep@Zw0z(pBEFMvM2dMb+Y}p+;!*B)n=Rv?XHr;N z`V5-{D@sCOP9w6>ORx8_-qAO+$c}?#t683DIJjeBDRAj9LIRGtwRL_vHO)bX3d9|m zA6hquNp=+M&YZ@8a_hBQE)aH;>DF$p4XrGKWR{Aq(>1_{>Fik9ON0{dHi;ktb5T1;%tUSJ-z@N!wez+;Yee$(u@N%TRnhNHJ9 zD^^;U`r(@Q`AGq@Q=^&ydo9s(1w^zJs6OR(EH)z0!#Mz>ca@m^q(@9Ay^>G@3l8wMkit6o}SV%`hLvzDB*s+_awmfKzFSEqARK73ZOEk+euIN;#3H_ujbZT&OF zgE2KK^eY)qwe@d8RkBJx*KV!o<>~%sKE1St0BzPN=u4FKg^|+Fpj~U$=o1U3q9~f@ zgl%}`bKUND!MBxi1-8Cp4$U2zhGD#PgC1G8O^4mlc{24MiPWbt4N>02=lmOYG(QOW z%T+yd&S2H*$osr#{=D5|*iztmuVh`^&iNar9Z}H&vKOX=*{bSEsM_V+dUU;ZSR)# zsHN!tNr*el(1pN$v)-pQ-)7e7e$3pC=(Uk0$D;BT(?mX9^$1Wj}p+(5qwo zmIZ0TH$oFaa_60sn3J7}e>f4|C!TF|AO-voOUKAm1E+dy_;5nGcZ@eGp+GH{?5g<) z@f66&aIAXdA!LaNukxk_-Kiiqltdibg}azqq;u5>#!*F_unrVC*DlaX$j&z`1L8p( z660X&vLq3rWDTFu?NEmlvT2F5BU$Cc>a;Krhfjs1WT<{B`{KLq*l$ z6`P0jHn6hmwfau#!9+PMdv1Kjp?K3umLh$%iE0P8+|yNpk{B(Q{71MKwxy=sFB3iD zc6Z{MCrJXqkx?#`c*8uJbV}Cg^BYeDI%Ii|>#m_|1b&C1ssLv9qQY<8q9s|%6B-vs zSo(J_)-mtGCUMsT_o%SF-Q%Qc^Ub-iHg>{2RoQdq*e9;cRy%4k z*@j@v+VpgyxyG=bNi*LWrrb9yN$oirD84Y#g_EugUD0~Xy3KseJlVy@uaT}gG4kFIDJ#m?xn1#Mqqi47SLgTj_kH` zR+#-_Ok^sNgQqtTE^)W26*2F8ixw32l!liiRTZ@JtvS@Xk`0aU=K2h*h?*<7iYerj z^e2fwOy23QMP@Gj=uiU87AJ7yLmc^6*__{KiZ8d7a%QdulFP_{n0DHn`7`Vqf;@hb zJ;vJGEJKrImjEv)dYU_(MRkhdG0R{TI(|VC}(f8smTc0$0h2{P3yC^QXuoi}*Z8yS) z8ox0@My1P_fxJSEtPmLWh#A)KV|HPEdIRizBqW?@%dMWvF#*)oXli z$AfkvoX%$)i4zVv{v-u^RPj5`XL!RAk4^6rx4l@vf!zJU{n;m6&yDY*=c$K3JLcus zqYos{v);dJj}4mC*mwN!lKHnH6}m{E5?Xlw?Q#)iep8k&wI1e{MHXl^7bEe9J}z!r zZmQ6a&u}J>BY>~y#Ax)hUdOz}Sxt&EerHuTRFURHy%?YqXe;&G7t`7_jnaEl8d7Z@ zaa()eErE!>o_UClpy+{OvtzQ2rfsh%klk@$-9)Q3|0Ux6~7akoIqNqGHGfe;Imgq6+45Y24yiuNu~{TG6R6 z0=hve2qF1ir>7qEs)6zh?lczNe6HG%Fw^9jTbj=+i`() zF=tBwp+RRp$gT!^R`gddx(!0{MQ3`=J=zD>4v8(i?_m0cI&llMqw?~u6uq~FO zE9erPI6iud>S4|lo>~bwG=E`t@n(=xlc+|T4j=zyMb%tDP*1E#^59?Q4A(KX^mLXS z`lRZildop`!RA1gKDyhHTn9m;N z+muyQRH$^92v)z77#^!py^I-iPTulbI>$!VRU$7ItNA$+>#X-OJu+UU3(TQYf-h5g zmTrcZen8({cS5O~O{<3mZhs4eFI~4UMNd=Cf9dNJ)=6Wjgpxd)TU=y5F(+bJoZg9B zFRJm#y7qHQm%vbzr*6C|q-B;3d3!}nQ4FZ#`4dq&YXNAXokDp^cwnj`~z@2g; z%ei^={9jVwzvWyu%YOw1?k2fv{%9MI%8YH<()tbkYcctGmOmC`YVn^Bjr>Yh{Gs3W zXj;)fA8v6LgQEQN;mEEnKD7UCqC0kJ_#Y=u4daYz-eT%!q6W!-W8cAAAFKBI4VM93CbrC%_{Hux(&NJCqL2&IBiL zb|A9?yHKGj5N$)-^)Ws{jC)7TbziG;C~rH1P)f3KIiRu!OB@TBrc$7*Dq9YOl?X?0 zWh#}wcjS|V3;+VSVsqpb*dT1dv}8Q)L1I{%JfTd+dLp*mrzCND<2p<#DUi#f_6E3M zTG3BjwFtP=W8P)acx+pDdPmonrQV&m)I;wSuDB?ledzssi zK)5+JKVNg#nHm=B2=6q*n_q42B|G2H8`?zc%qAspl7!h3W=;ZV<8vc9OHE?bv?mH@|j{B>;_dELDfo11CO zF3m&K{rgLARhD%F6lys%*prRU)EFmpSMwQ22zey%e50(k{MAG&f$L;;)1#iD8LH+J zw-vCzczEC0H&~M$XyN9w6k%2~&728isHSPpCEA&Ez1dh%orRnj(7d>4&Mlo0D#bDL zLFj>`CJx;|DCR)@^<&b{c<2Cts(RMLbH@8XTQPJBag)yW)sA2C4HNyra7H?aD;CQI z*3GX6FyN|sf(AsX&C5h>mwxmmuK(yM(^AQ0=5<*BYDX%ezdfAm_)wcF_=Q$KQx)ts zClmIFIEmZ6s-XGvn?dd1&-auwNeWqBqe^jk5xk^y+5QG3FD1g}YV)KIYz$+Th2xIP z6MY~1h>fo9cB>Dab5H0S8;ADz5Qd~%WrKq>hCv;ws#X5brbA$N4B|n$ZQ0INA-f4_ zuiq5dj#~1B?XZePUZUsnH~B;s-h?e|!%$hwT*A6i$t~8k`QnRv$kODGw&TfFr{H7;%-Or#Oa_*P;=?3NbuM!2YFWy zxH8rY76DAyyL>y3I?Mpuu~|%(C3UG+x{p|^v((fTgzn7F;0A8|%|Ib=vwm7!WO&~) zMLMxhqe07scVADID*wBV(r&O4_kxHVmnrBRIH}ENGp2B`D(RvJcfzLE2XFio#!uU3 zs;u8f9d+!!udH7h_d`U+I(7PEct%6q@SK}9uKO&GKY<=o#I{axC%-eES+MN1&g1Dc ze1~{Ol&Z7eJKc}oE{yhOdKPQ^WMRpP9fSqhzkiPzNw;?n+^@_-_Il0SI|I+N9bbac zemi2kxnnx8Wam4bdzn8inidQE&#B6MKCKs8mmypD#*gu|=H`4km#It$Vi%CsB;nls zR9+XYnR;<&l{lLcgO@9Jkz}k<*QP1ZMqWA7PJlrDcVRr8eQRUI1pdCCLG%xf$3ov{ zGM82}-*LW6aI9$N3|N0=;k#fkwfDxj7){bWf#qo{AnuVcG#GbtVxyXMehv-dh*$ zuMAucPknQ4lv6ajwi{{JYdq<>16PJSxdfn?P|bm;NM{?jYx3l_TRx5mYp0H{Eixi^Gd)(4@;g^~<#V3f{vZuh2c(2HsqEc7h|Y zyq5F~|2P*1US4M3d%eA%i`CGWj*Lwcp10|E;O55dWLywS+`<8p~S z-elr?gp%DWJ8G>wiPc=@2lVmfWMY%pCDd8ZjM*5%L_+9RI9(kQm!GF+bG2D%DCr6C z4QU;vN$d6$WeaP-Cz+6;3Y&#Ix#@yfNd0G4R|AkueY9{$#JdnItG#{(Lma0;EU=n( zaXGL1N$78Ub7FuE4aFC7!f*-ZB&Mp5htUn*v4TM{@~tG7&FPHkJsqk)aUOh~ZL@X< z$p#5~Q2nU^ZgMG!Iw3UunC&)-9HFzHYAS%r<^mK?4(!t&+ok!|sroc zj5?CMFn|EI1#2|@$u#9<`U`CpPmM|OFJ7ziHxp*>T0HRL{j3C4E?`mnk=)l(^@*by zx7DWl*S9YNW1mFo(}noH2PFZ6eN_$Vi_OR?Z%&rT6S`!~>aEsVuY34{j~Z9NrY(wu zRtncRvHjs+#w^5{xBUvcJ4tfMaL0rmSCg)D$9O@Zk7#U(x68Hy0m%^ozDovH%<}cjL$!2Vj|*F^pNr*85V`*6|+R@z}*g zY@o>mFiI6WMyObsO)RMU(wdBGQah3?*UebP^J5t7tyfY&%uv2xH#7FB=3mlCe-_Y( z{AM8!XJ=A|jTPVtcILwsQx^-D)T!#I7}Cai#nf4c-@A>WU9U$(Eek31! z(CPUprqF1~mIo(-LF9V|O8S+iIJ@m1%AF55bw3N5e)vdPcn~C?>^HR%Bn=rC4QNu7 z;k1jZ@+*wI;`$^fs4=VouK@N|WZLl!ujHNZv#qT`eP?86B3tSocxvNW1`r8A8M^Al z>ckR)N8Jdv{C1#lny-uHF~$HJsb#-duXOxkU|};jiC*byzIjrxNX&{Aq19V8xQ1xk zz4xo1L!8PHT)72iVq48H0b2jMNV2u$ZA<*Z zHbI44)`JRyeK{e0tm>z&*8MqdtRSsfg`bpekl*UyZW@W_X@C+#09<&=k%C1eKE^E! z6KzBsF64~8XX+(yx4Jyh7WRqE+PU<(z?;1-`h^hP-fpOYyOOnCi<-f(o2M5WUcL{< zEby&R3k0V~^_U{1L*LBRRhYmNp8Ff;7;S`U9B;Di_lMoLd#oBS6Hd_Pch^V=}{8`&h64EPLL4n{P9 z2Gb{;$rcQ4{jM8N>ebS9^3J-!vfcg?fon%*WCP>ARY!Qv*SJ0BxSC7fuG9e|@XA@C z1#BF!#VNB%ojGm(RlSq0-j%s=iC}xrAysI$^|HFT6WO6bRI~qgd3k-1CkiX_2qG&? z4s^pC!!LV2;yNAG|9mq6QeWF2&lRwV>zaLUP~-AenEu!;cvww7Lz#!v?QpVf9zm!5jmB0}Z3@m!!y2^X9pJcm|lR4(n$L^-Ev8Gb*$8 zt$~6Xt7TuNT2FB4W}GG;681Y-&3W5*LA=$>yw^O5L`BHJRn4pjR>7^=eEx)PZ*TA6 zM=XMc<~hNx+i_=%*Fn6?YeD`KhP&43rqroln&FaS`Z;^c@Ig_|Z1tv&<39oZ!3h0e z(uEF*`1hakd;0z@$z$9IykCLSo@@wCMiz6=VWb_6UJQ%uA?PE=5GKE#T6n{*+BZeo9n#-Jft7-o++ikT*izm@@=S=2C#n(d{WTd}M zn4C$EP$ecF{kRNJ0A;wGmFAKb+yJ+L1v3B`!2OPsLDaKAb$bdbJEtGX*Im(#j{eJn zoQ4t`7GLh7j4gykoy8E5uSRK)ag38x=1#IWB_mlqU{x5M^Rcq`&8Xn@Dlf?dGE&tM zE8X17*KWO=^wrc?mnR8=$j9Ue^0(uHu{2Rwm^f$OxrC)%U!(%wnYi?A{@&y}qM_HOYPcW)miuOpi8w|BJQu<8u~FaVbUCmlLaiAJ{Tz{If}_?f~Q zqp3DO1uGO!Pn?yP(QMWG%)7@Q9;*-MdW2WYQRt|%^@;aPnOh&TQQTMVyFX3awf?yd zCIiUfO!mtP&j!C-^`7h^+R!1d`Vj2ZAj&Z}9@&){b*{S`eL%FW(D7?1wWO}B1=nH$ zW3~c6-K3qYM>nD@4}E@yNLFh4t7WQuLw{nnuaZgoEAyLvt+^{-zJ^+lyB#isBDo9V@47NeRp!3Dpc-Tn4&2*z$Vsv%aNqM^gU!_yz?KJf>x*TjS$rU;b^*FSSo^XgImXoB@JzY=iPCd9w1L4e0?ji;N_V@|B%opl8qCRx+3?_z}1yv>cJV$iw z^;N|7aFkN^7s^-RjH&!hsl9`K1%3%l$?Rh=(=Lf7)5xu_76>=N9D4i%>W%6zO+^%_ zZGUJAb^#(OQn5VWFHEX6#1`}N8t#U^$zsYl60nOw05BCx`^8zMj8TVzkoz|~)N53_ zVeaJ)Hkv;LejL%#4~l%QB{P+Bb>qjQ@ri;_v&%BOGermEP|S0^^<13D3W-=7Aa?-d z?Mun9jr&Tk=}J$e)dku*-w-^ZKouf%G?;W;J9nq#>2C2{W&`4f_s*`8uJ|)UQLnXW z$z)1o9QLAF5n7arqec_-FgBv_*={e>CiUREnX+0_+vdA9-@7&S2*5JyeuJ9%z3E08 z=ud@&lshdI_zZpb)#tRDbXqH#gQcc$p>-dtR^-*n_QMrlV&JgYI*~S2soMk++`DQU zh;fYm8HBS!%4n!y{7qu{d;2l>o_ts`tpim}i#40itM?_Z1uL{aTza|NDCkXrM8 z@Cs3keR!QJA&ZZ@i4N|v{t3eH37ZtP)9zImG!cL(gyw?gQ#Vp~U@N@MCF55@6+I7Q z)^GffxpcM2L3^!1k~z6N521# ztI%XGtQ)8HgHqwrFt5?q_f>KwMFsZAo2B{e^~=)zy??=+WeksZy!AYfc8S@7B0>Eo zGR6%vlJ|E=RMTGT?QSAZ6!Bs!NaHlV+017%&#p*%O45Ja#YBQ^RV({(YS?3H;?-V{ z!{3r4>js8Y#IRiOrD8D2@cDmOp^&uqdr3%jucfFd4f<;QJJGrA#oJ7)owVI5$*ay8 z@4JPzleX&Tx}+^Zu%IKQ?yH-RwY5*S*@&abcqb~>+Qg9xE}_F;Zfy;iBeX331;?Qc zm=m>_4|#7$XV>ocJ8lbIcwTHs3@e=R9WN=I(#-q!{&kYtzfZnci#kbNzNSm_Z$or1 zt4b-KT-&Uix6&be-6V$s8Xq|aTez+Tm2**sO(8!{q-N`zG@0B+3$zs*40k@_A+GzU zhx&!cHRxn$9VXVj^`37Mz z*VDral1;Gz2$1&nI+3u44=@#0q-~J1mH+AYG2trzWOh?G#xBip28?NhyMG%`#y&VYK*wiahhJd}LtpkhZTuvD5nOxrI1Raj^-5@WG$}Mq2qylP2~67G~_( z+5p-VsnCe;MG4)SHbeP^`(Ye+q8b11!#_L+vYH6{ZJZ4bbHxHI;SBT|C{>PafP>~w z-9o_SRwL*~1+(2hBf$U@El16KKy`bVhXKn!Cb%ws9=v0lKihs~PQ8g>!arb`rfmpQ z!IN%tD#*sE#F18@I~>LJc9s`OBM9sg0|+ji-)K)p{Q1W|#mq0;qCH0Rifp(3>ul;L zuxfaFJAXKDr3gj`*^514o7VvdheY5HEc#@#h6+~Pmt7nt1KTVPg93&8lcQ>n&f0yW@-^%SyKdW+_3$7yTNf?UwC>aGl2T|p!R23K=Xyffr?{x z4CmYxO__h%BT{et@ag4&roo?xmor}^b!(;{X^JXtwSSI-u`Z}u9f{1(&5cu|JAGGP z`LcBecBu|e`HIG@9znCx+|d2eO8ER(bNDfQuOuIRYBV=btX{P56fUgKv=V7~m3}fW`u-7~#hl zzy~XyEDa)7@G*S{*Tgt_Ph)#-NIFZkejbG-rsbE)e-V(d(C8^P?LYjEg~>vB=V9!O zADHF7zHksV)4awE=CwGz_c;*@%>6@Y2qv9pSJkTc2v|qTW}sBBaZPJme_DqPbC;xb zW3_^<);2h=)2TY-w#t;PQ0EaFe@h@a&?yYGaH29bFez>(kYz8c9sFU_Gx#}+0lf54 zUxpcc0gDj^hMwKu-F<&P(hgw)0*6&J%7Y^U*yeQJ8mSqS?OoWJ!`mZ+Sb?C%j<{}UeUEmAskH8t@6RbY}hc(0)`yr z9oVp|dv_NqAeeYDC5oOJMmYSAG)GY6Swc3Oz?^504aMFl8i6?B@K{5)H>doZ=H04f zhO+i&c8@kxw@uMnb9E2X*d2^&08{FwZ=ddDF51e9xSn&)?rx&ZengpcV!4tt>}_p$ zDZ{)Xwx3~3_QfjVAtEYI%(%VzN1$w>3Rl<5 zD^cdAq$DyUs5Xo%H<_hZM_l)Ll0K)$hP?I*-9P2@AzBfxjoKFs=A(CJ;A4Hw%_@y` z0aWjWbP#xUsEj$pO2G1iBk$$O>%rgkg>^6*Ymz!yvE8~tY2_XWc*a%(K332^nq1== z6!feQkA2`PsE%81>NB9#VW=YHACj9v;h0KsoL;uW7oW$zL3y=xRn31>@>3K{gMgml zv7WF8-uz~~g3M?2rBF#c{DkjN+0eo33K^2kNF;CWMsdYCz>H=sx3`>COIa^scS2GN zDM3&Ubo%<7A9|p=@Gh6f0Q`|V#C>TnJtCLv%$76zpYxL7J6?w`oW#Z1xX}p-gsi;C z;v-|ya0S}E4E?vMB!oaQycdIkvn6S7ki$e?49&1oqr=&N=bg9Kwx%yOoL!4lUwJN? zaULDa=@yyD(Cq6kKrKq63dBCuLJe~ODaO6tHJd`X#pUu}ZSK@F?Cdrs+1PkU<$NDF zSgIKbZIpka&;NxwKob`wR}KCb3qbJAL~?&zlNzml+%%O$;pV6*7I4^#n6TMwr#tiKRdU!(S}MW4WTHqT58 z7=i=wtj5J6|_yUT!s15)a6(A)Z+9|8&*V(Grpomo1joj zbagdkGZRg*9}nP95nb&jS?hNEgN0So)lR}a$kT>Ieurp-MaE|yS&2SV#+O-|ktSMc`pZo6ki6_j6Q{?6-RVk)mV<-!y7kS~rdP%HS5{f~l7SZHA1 z*X}yglPiV*!UF8)6U|Fep4HdMNEl6Dem?dISmVl^{?+Gt2whO($w~_s?b#mfk>5wz zYA|_|dfiK(R;s~lz^mIS+m+^;rjqVkGvQ)$UFq(B`$jGF=z{;v+#!T*kIS~LL>8n} zf@TQ1CEaIQmRb0JDad@kGEDUH$$<*r+bF9Gg%()tig3N1VW!Q0NFw<>zjq^g8pgWP zo<>K~c{f-44Ao(7%gBGhH+p|-48NNf&PVt8N3SpMYV~|RAD0ffuV_Uz;XlgZ3jbhE zgSJ;WrJx}+mPmS;x))EVXdpZ$ARn0>GSyuoQgWxRYoaCHEZFk4ju}8ETJc$>U}Bq^ z4nk~)Go?DfTJCO6DV858H^Dbr9zjChe$Yte)XFfye57Z1+rH5C28yn0R4P)*1$+PG z=Lm)0(yv|!-&3aIHk_(c$|dp)?lVi>{$ppGMG#bzzkc0)U0<^rjJCX@_s67S zJLqLTSLs{Nu`aWHTgy+B`De{1A{rDmR+5LPD(P`d+~_MQ%E)YI+SWj8B#R+cUj|*rz8#TNJXn3 z6RZLo{kzv5e}TeuS@H#P{nr-7Y`>}^GN}Tw;rZv`^@)>gcxMF~-eC7yWm*IRJyY#>*s$9xJVbbS zY5WWlYrgOT=O%vq^!W+w($fc69%q^7%I%~PY=cYufW*lmpNYaqbt|iq71(;0MRlC2 z#O6#ENZ7DW)p7l>awgRaJ)o5`xe({OxPZXHaS%Ysitca&^HeQTq%Y-x%ZB)n z>2hf|4XODnh-J%2|`N)=c z&>y;hy{#J~;gEK%9h!gEKT!2E%2}0inhtmszJ4xv*Fss-{ZX+s;OVN)VbTjQqU^JU zt+fv zs1<}Qugh#@7TbT63TX8Wi#IL4uu9kpCq`qo@|z3CydPkE%&`IvW6Qv(Io{7-9WiOJdUB;{#JdoYJK2FGBH!J3)l;) zVbxEr6Xy;#_k(yo!@l7SFw^dMAzJQWUr6}cFt)z;M%SuC<}pgV;-cA!f$%~6fYtDb zXhU-#V-juVM`&34C%}1U1yktJc$HjBgB@YAuSqp!q)ssN-9Tz_jQ`E1^MzcB^6r)%cJwChJMx-eM0mSDA3`{PuNZ9C z*2I%kQGhBr8KOm99c;Dj04deLXYaGy@!yHzZtx^Iy97JHyQdPDYw}X8a4%iAeyfsi zW;I(aOiU$=C&#S_@7=IK*Q@qKgceh!xA67`ju%~bN0o&|xrufafyx)jn^_BHMD6Db z67bjK<^yR-ug2{K4n!+8%e`FI95G4eT_hjqg3ni^z7^EiuB7=)Q0NG5I3`J&#b%J1 znFpMVe*p&TGJ&3%{{BT-qk`1~qUh|+jkIc|XTN6?hM6@E zB!wpB3S+H_9hKpe{jX)h0h7%W&Gtn|SC#JhXN8{+URUcQQa_2N8rC$HPI5ZrhJCMm z*TeR6ruOR07KKe2KwiV?q#B)&hl@sKP^P}PtNVB7FJbw4+D|&t%TYV3#1((Xt{(r; zJ@GVKBbOO0rZI-!txykm;5SSlvIDhpOWG&>&^@uqmuj{d>>5lNvI%v2St5uD#T1q; z=uj+@$*cEu2M(6s4te1#X{>mWDWKOfF(FHBM?To+mtPLMe-rB#$uchFk@B{gi{;3% zwO*Zca3@6Xg)|F$D=0)U-VjMw7`emg&(-SKsAtqCaD#PR5d!+d3m}tGePBg|OTX@d zfOcE@{40bo@}N<$a^6i1xAZdEn6fhE#hm-Q{M)MFwb~w-d1@9^TQ{6dz01b06LNF@ z;L3q|n4Seq`rmJvJWWMQk|5i=Pwal8aB1G|CJ=pe<72V=6FhMzluelh-xHR; zT0G`SYmty5o?Q#`<6b&#WPRIn9?A8#KUMY15wnK_h4wka+)pEtro&VMcM`(q6XwUuI@eX6I+oksX3-}b>n6BR+CEi-L zr5igZ*Q%T-R_q9^L=EST@-)%?*EB1f;K65_LbXb9fMUt?L*k&*^rL4}(1q9I*X^>e-LRu{#)Xkl}+AF;oqS%ydq-z)Z? zPw6anIa3ivrF;Y{t{AS2_R3-WoSWoosWkLg(KXWVaB!WANFHFS!WE)h_*Tr!E6PmVr+~Ao_cZIeejU7fZOHqC0bgv@XhT*;owAD{c^W zunY`XilGdKNx6|X+8i3wk5>ncdD^vkVPGC- zL8s9R$aa{qW^IY-uM7)O#|Ns0{=~r0HXTUp4O9eW=P5y9dYbAyh*yYYtzWR229`aA*8pL5 zK(nq^1W3;+DVr(sD;|gL_onaNHU$G|oF~2M92K&fn(bcH2y&C@X1oKjnRG{LVRHsxRWDoJq z6agXz%rTPm$-P6kELDxf*saiC?SHGKZ50d@;OE2u1j7~d?XpAo=2&mPbDoRRiBA>d5R4{Se| zC}euskeRXW#S-urL(!UnZyI*#aO(U|ed#gaZ}!)yqLfIN2y~32B3_&aa~_SsKzl}- zahxw~{-E!n1EsV_nhP-8@jH^MvTa=IUmz+7uOgY4zl%c5osI3RkVC1e5=Wvnk)~jI zE;;Ov7PqI)K};Ukm%NzJe)b)#l+z{RoFcf2nJt+$cGmbr?`ECa;)yoZAQ>r+iuGtaS z^tJQTT1d}+9dEB~mB55sJbi+vn1B!15D^j~YoxA?nW8`9Kg@>EAT}xI*>jl34>skH zn|~{7u_tK)c-Xk#_bka%4&{Qw324M*K21eVx%UYaGA@jn$kIAEV0Fz8UD zsUPZ>Fq?)C%ba@Jx+s*6nO^9*BOQa`_MZdn7xpKKHr7J7w>PnRgGtTjzAx)a2**=4 zB=9^QV?O!g{XEp4%=B32Mylrvbw36fw|5)Yq-2MAI0g0GA;rxc&T|Ew*4Bylnv&$s z8Ome##F9q}TCHr?!a%@~4Hyu1uVhF5v8CstuU6kl{uLV&ylLs$2qBy*Inh2f2cH?(|lg4CyBS%F(B~ zE!)u~bSSfFyI!9j$Ja*I^-EfQlYBnks{XU=M2VB-X4(e10h>b{M0n(hP24JxSYzvn zDuk`^Ur)o{c2Hl~PfHzf4fk=z=OanO{Am{UCM0CiF9t+u#7-8Nd+s}WsF3v1?g_>3 z^Y@1tlYZZS6NSL!8f(jceEex^NB9ExTF^KJ&%Yc#x{ zlnLLP+MSO@!}X5xKuM2Xyk1m`A1SI0Wy-&-=ceOC<`Fi z<$Z}izns@6U>|U7Vp)E$6pfomi11rJkWS@SANesd=ct-#i2l*ASVBh5CX-9EW>AI2 z2PZ%YhaO8G2zCrNUnm+IwTdp72$bamnm%oYW=z)=X6i(PH+b1TYsg#w^xnJk#zz$Y zee1~=y~Q=`_d1tmWdIE>LLQ}g)oMng_N9-!@P*Q3T=|P|*#I|InYt5j5HDa1bR8*_BtcDMgoW!6Qk5k@Zz4%s`9U>!9v~bkgi)?XPLOMi z#-UyD1MmY$TF%TD@@xkDK?fXO8Pcj-@Y$h)v!GnmD@S0n)IRwdJ?yJRj8E0h8rwoz z9V->^S9e$Srf2OknV&}9d%~Y=pcLP*q(+XA9C%oJL=rkdG4RE<{+>j(AMW zYEdUuGS^v^et+)0K$RjohU(E}`BeRGIwHkZ$ByeS-t>HD?cDVg1J*zE=iSaNPrb+s z-lTV6^kU5PxH%lK?K$6Z*Y2YhW9-E()@10$1jQmrHOCWWLHzE(9KB6}B{U^`md4scSN=^jWfSbx zB>^5Ujl&11%GrT}np(8XM5Fb_0aZ&W;0csEK3Tz@EvR!LM>nK$ z5S{0x<63Ny3P5IG7t*fCx%jYGkT-4?o&~V;1DW#!9$a_-a10ZdGk+HTl4$#<#N8^? z&osXV=jn94E#94%SOIhRoW@>D37ZY2G&TI=A3ne?{3E1zranu$asjwU#VB@F#J?jS z>f246%Jj{|X3fZ8!I~5 zzY`EaTdf)KEVMhpnD&fxd`6hasXI38C}(|hknaQec_gKk?Pm1$^ZfGsbF}RaFGLg> zwg&;oS3Ti9PqcvwUI9dTRU{~`PPtt@n7j@{SO{WcLPuaxtyP!cY7X4ebxSzy`smPV zXRDY&fwFEKsAjn4NMU z>Ki=5S)jcZ!300YIKf91Yfly6xFdH3PW&Mz)*t*NwJ&n94?C|a0*Ggq(#|0I!j|-= z=m{H}W8+s^y(YbkRnwB!6b1U&ufWeQi~aDYakW=hZE4sdBj^q~<^nM`B024ep;*s# zNGN@-{hWN~jQaWd!iH~MdP3e#Ijz`sv^B0~X5UBPhT%a-9?Gfju-mcSWpt2NHyy^^ zG6CKErrfJS_`;}(_hq}B074tjTD+`~O47#Wd&^Mm<2{%Ol2pU|~P0!V8v0L88fRz#ZA-8#ASoGdxd{>4JP?-lKtzlQR5d6kQLG`<uLTlGQP(e*SS(Q?FzU%tlEn zCIN2Ov$1wkDa^afXaqN9u~Z_AequKTdSmB0v8`#a4fzuv|8sJHXzfZAmBVG0H@_~{6t1K`IE3V zVa+$KN!ZE5v&3N@W@_9ulX&H`%(A>^V$Iio8Gy>if;z=Cr7<4(LM=DzcZ?Qn7-{c+ zwd$38uQ03m#ISsh?y3L%N`@#pg~Ozt#tu8q|MI6Q-aFk2#(q0()vP>T6%A;ZtpYdn zD;to)A&gQ?;iBdihGXEFx6h}#$Fv|?WNvg^4~QEaRMwJz7Wu`#JVWDbmh3g@@D)z6 zZB@m0$eo@kjO41$Y>6u9;Zs<1@t2R?o#ziX8y>gRW1NtA8sa`oRofne3%*3&-J$Kixs z2E9g90l@8VmVX5J{Qkpi=vNhR~o)KrdbVAtAaO$ROB zBrWCd93s67_P`PSB(LZCMH!V05F4x3CsZ2UN+iV)YC5FpWg_e1jw2kU?y@^Z?Lv`H zk>oLvM^2907|`74ESB_{B$Ik&!pIKyCi6)NAD0_!B#`v!*K86JO%c1fMUfua?>?!> z{gYKW8>ac*klXjJ;J{yNZ;oo zd!4XUI6CT&lDsKTYW9Vd5rTEE|GA9fUggGwuML~Fc8wR2@I=8#r3_3&UUcd8ZV-CN zyeIo`y>I-jmc=8^40?u%1y)G=YsT*HPjlrw>6uJ<%&9qeY`$xUt*85y@)P$M7PmMj za~jR+f^1Xk&lyD7i!n=6>G)Q4ZeSM9BP9l@rJ(`Vt90Q1O;eH|pNvs5He znBevOJ2pmOl#6VVOY{3+inl_9&h76`8r80|mo=m<^H*1yUkZEdPuUwIvgzf>lM-fV z3%^{os{5-}*af2tN_MoFYh3@^l6Ln_s!ctlAVy`Q0D0=(h&qJwn+&M!L3ikXZGMeF z4Eljdmn*iE@3q9FuHB``R$3Cn@cZKE$Ls%gA>EFfls>n0uOY5pip@(gcc4?<&CSLo zUdRE=?=!nEEVHlIyv2e+7`ENk3$c>R{e<4+fk9P-UeQXibd%lHFPm|<|{sTSdOeT`}Q@{6~I3X9A) z#CZ0N1&fkrhbuH^>^gQh&m}O$Z5-nS6f%1zC@dQym#`sgb0cd1!yV*C3@lB6QxpZ?)MbNfhAs zrtF*S!mR%fpb@XpRTu#S-4EB@2)bOA(->!FiTJ`H&hzZ|y)PIJEOnY}c@dfnMc?T&( zu7(a3XDxKrZ~Y?gI>I<4?5;k{pDll(CHc?;t{}J~l3m-gP>*s7KB1g~J?WUE_oM&I zCpbcTla4^eH&MIRDKM_6^Xq*nqOs4vs|l&HKKhDk+PwnF0_!|U@r&D83!1vFub2VHMm1scVEmtrYVk?y0o8o{AJc^(-!4~4Ja74oKh>h3yXDeY#Glc}z2HV6$F(^U zw#IVPQUm6rpD&O4=AyTYp_R-AYtwUaqBhTjfg$uX7PhwRJtMS*WZ*??{&G8eKo|!h zeU@!*g9*NaEhlsk$X4(XT4htsHhpM~^o2mXs4!}X?y&>#!X*uQ-M9C|~kwJ7jBgHm`ok(Yxk zOUeC)8j7|85B+Wn)Y$OziVewA3yHEoSuft;6X6Wlm1WuT(zDna z%;+sPxnO7|f*yg!0}XNPSJe%E;A~Db=V9$PV#pg2V{nX=k)$7EJHuWA&9U`|GKKdt zr@a0nMnR$Xj%97>I(8Hhiskr0PFZ}4p#g!W`pR{mk0VC12?}v z`TT9$26rij@`Bd@%99eo89M3XEN6cUOR7V4%7|HT6>oNenI4%S4*q=Gy`oy~RrsHs z_0Az_9$%jEZk|j@iGN<}m9uanEzqM+1qLAM@+PiM#DMuXX!1sq@V6sFL>o6)N1d=} zr`{>@1B+ZVU;5Ys){EYua7=jMpKCW3$57rXABBO}b#+uE*YeVMUEaU??BJHn0rp zj_+n*p|)t==da4C0zVXnv$MMuw?ld{ML+|-BW<7PXA(q8FlJ$l62ssi(#{FMsJmfr z?#$=g?L{FWp@?0K8iBC|oSIjoA${UF2HIzWLi`GK2IGrOe6R6y7R;TCK5~aTP*ixJmMs@01T&IffVDINr-rFf{GAKV56F+mIn79R zVUz8*HM?z5f!fTc{873^w7L-SF2LKQI>@y?5!cm5J_J>4&QOqMroxQ#t{n34dczNnoky5}icY|D1pLE=gik!M9e z<(7Z`j{aaduz5QxNLFyK%AwNGEPtsq|7nZs@q^AU>~CPPurhwB%UUZ(iiI-be!E8Z zzPmSV`&(G?V17#W4^DC2!udVq6eWCb zzGN-otNYD_SdZKC^#l#6XF}1Vo5@Kma;`R^BxFr=dN(Mvf|VJ)NPfyZXJ*;LaBuz$ zxqc?U2!(1Hu&z=u2sG?PoEX(C(gof0Uq?HP`F1A#vc0c3i$p*f0?!N%ZC5-e>}nx~ z>-^cJKWEh+39Il9r$49W{~t4o#ovO7_B`l2-re|rNp`G%+`=M0Ogmy6 z-RRA}dTy!rF1d?C;(dd26!YII2@0Lfy~|(fu2J{hO(bv@1E`q_MkzJHtGd59hzdel z3vUcjw{b8XOBDv-oSH3AWf)(5Il^*ya>@vK9bjioq|pd29tHh%tJy=R%yOs0A)5~$ zdGSukFghmW(x007XT=jCZf1@ zfRa;zY(QW}z0T>*Ug?fExBBc%fv_oS#%NIt8M z`kaG6A*?O;GC%VCCRs7`87}yn68=bfNOvtjONNHr6r=#Y=Td-qFvzS56!b$_4#8%R z%emZa!yAhN8)V${5DZ_PdhEFefd@t$nL-dz-l78Ap1aJJy!kClkWH`3PurM5kqs3Z zWL@4N+o4r(Dj?qcBs@|$i{8iDwABW;k7?s)Q8ZAYihzZr>LvQNc%O7|8<)pGK?bE} ziAt)@SF6V2=}U@bIjpHYPmB>Z`kYPuDRw6X>Ok^&I7rjXyp@|WW)7>VIK?YWJc?tf2S^7 z;$b*S)obNx_89zKUjd82B-84hReNpT5B#9m%t0?D_`x=8*U6|hN<*Mh0*de7f!$!U*M z?8$B)LS56m%PeDIbqy|_M>#OPe#XFn91}pm>(@5v{2BW>h47MP{D{b~ZrxEMM-)fBFuhN8XN?0ajY|UTUcKKzl1u`Qzt$*3}1|U9{vJf=N%ePkU%Q z^!G&=hnGFTy_DC#Bz7SC3V;_pocay)> zZ(~YQ%06M1H~7=8OC(dG%y#n2e7<55Obw0S^31(Me98YeJNwN1rk`x<;T__xvzu-{ z_o@UbtGMD~R>FxGybj}Bd5!@!Q3;v8mO^Mtc~UxJ*+k&>Q}rdY;-e=X>+_B*i_n2Qnjxa|a&k=RF}#5stc=X%0Rf4&n&YUJ;-v)KJJK?j@bdJe|Ib zhz43+ulqZTPjv6=Z*KXcO3*U4H0U{5l-+mSLVkZ8Q2bu0C8`%ZOJCktbzp(60b*h( zcApfDRptts`qB1swv%cus~P8{+iP;|S2P%rmmV^JpFMR7&9dexW2wnSev6H#U z@bV~xoN~uOTX9doV)N8bo$?9ay-&{0XRHFoniOddhveAgxK$t+d=1Ez-D_O)G0s9dN3UveJ($xCi2C~s61L0EgZ-m3o}c0iQ!w*fq>A1SEu zIon6hDhQoXsIWSBmC$Y@EtWgU)_(r$i%46D(n>_xCH{?6X$=+se;7xJkE0F)H$Ob~ zm%0T?({kisA1(TIoJOmVSF_rR{j*c5i*42HO$})}?};4-#?^`lw-#ms7^=U2t3b!A z0ti>B3(T`AQ)yeb?;2`rC-i!S^1BuLXBps$-RM5BL2F)tHZyfW=cC{@QcqprAtiPM zXw0V6)WL~Ir!ei4!h0d~8waQ*KFh2`EcmBGLybAQFi;s{fA*5bf-}@lhR$IP=)PL2 zk;eIzw!V_a+K5&IlgTO_ zQZ-!%X+8-lDTrJon}lJ_oV*GO?$kYx+{!X96%u#ZXYtBYwzU7#N{Y7BPvoKtCMwl% ztGetW#K#~q&wf_-yv|ULekT5tm4>Q??eh2wk`$>RMB4e>usX=*u>T5z4{lP>WI|c} zKAPCS?ZD&BluXuej|iG)3SbSB9quT9WO0eh^FGBED9>2V-X$6h|0t>0xk(;0_^3 zfZ*;DAXsnWU0u~x z{q}d>bDpE1xk2RFUc*3=c)BT4s(@g>M+v)nrB!&Nipc_&zDN;Il2C zcpe{H@4y=Ky{ri1aL5@YL?`H-<#&HEQf3KNt+Qu$t%qF!p4;Z zE4sW{utfjxh9H%5k5Wy{bcputg{nh&|KOa+ywi6+tN|GhO`)YG5I!If_?NN@2eM&U z=O`oE_lC_C>va?RvKqMn0S;W3K}VA5RNTYSk(W!Gj?VNkiEK>xQ-&4hNNsiyg@YL( zM0=>J(w2&{oOOi@Af220Mu`=^iC3vcm%FEigc1L6w5S$)c;@=J`o7mm+#|=1E=qnD z6PVgkn&8{r)jnSe=l3%2H1E`z*Jx7>L-K|^WV>9po;=v9 zzqAq`MVJbqiZX)UWd{`VTaBlF+ayJ zrpVsBjiwAM3nx77GUWv!tm+;$m9wB@04*WKDRK89JHpnl0Ks=hVIJayE5YtKuRm#p zIew77HkTsE_)1U4z8ZFWP>#^LSfqlgUa^_~lBM83Y?6iQY;4m8w7LfNr~GYRh&zg* zA7Ht4yUn0Tep@)ze+k<<0b(ueJaG^FW_Id)`c*7MQRUv2;qdY!x#UmcpMDfck(m0n zF1g6vgu=(`!W3tM7vVEnV#*XBz<96dr9hOnVGn18DY8=;LeL+f?mtzmT-%U~VrUzg zJ?DRMOrkBpTni^%2Z&zOwkRt|@Y(>J>7ypcR%oK)$yO@xrRdg>7x&7|_|Z8NEY5@x zJfJK#3d=ZCnsTbr4TXCt@_@jas|HgYj)maL)+e*8Kw;9N9oC4ndS!@%gq3Ug-}?)* zvLvfVq!lsKHKI3uL^jm@HtdiZXGSthl`ALi8{=8_nQ+9bT=P;HD!@zCDp1AV;fOeByd?cqmms&?#b9^Hx0`lC2 zKI&Xz{voIElxn$}4KvyV{Z1HNZLh)!OK0X4Y}9-Ld5A;)WY%mT;L`yb6RpYQ*8+JQ z6;gcXm+#xYcj~LA5WW=uRLPP=+b?7ImIg8aEGl{ev9_*f)LD=de$^L7@mG(?b6%4R zdUHJ6bT3c8aLQfVRi=g6y2f3dw~tTp8*D^u-SKf^wN){&u0xoFaZ}Z^@O~oV`1rPpNOb$FpYKyK(p7Z{re)jN zf><7k87X298&VAArDpsrA4l*9Qo0{(_0kzxDnvEzv0yw=uvGb-$UV+v8fJ#CMee@j zF=-5d6`o1$Mp1e$dh&Fc?)2hdGggIbhRp`m(NlmI8C4H$gtf_BJ1|M&(7lmi3Pt z5DJ(WH3@8dGw}B|Sgm7;>9vkKZTg>!nta_C;-j>VFG@v~S7_i(_eG=1ePjwv{D9+e zdMgVS5zhSaX-j`&spoIdg3>#5*5?^o&)ryM;QV$O@0|t8U+o5jcv64a4GFk+wIpK< z*-$WW6Df^4Q2Z;&&}pp>naq=FU#FBC(Q@aoRE`!h32EPOc_pfFI$m zduBwk$gI!7+yY>TYfz-FT{PqXv5v!i4yD?wRI_CAMl-gt$eiVGElO;7$KQvrX z2iwl>X|hCU zR|;=ZVUlMO*K7AMp4nfN5z{i4A*@_|vX9r3XnXBMf<~>+L%a_w5@*ERd#DoMmbBto zU^3sR@4!1fZLD z(^^l@(|6|~q}%2`b1kIjZ&Qg!-+rAO;5^X3_ZQof3@yn|&K`LkY8Ncak(*!GYD23b zcJFR>e?LUt+_S)l_`>~*H^rFY?IWh;06T)B6U7lJOb*k&zz>Ou9XkIwbp5v-rxPPh z_BIe$3M*QlXbtSalhUf&Z5b3jubX77)4DJNSKRyb%FcOMMy&f1$tJZB!~Nsd9rjdVDytGd*HxS#PLMe9+Fl6>W4j-kTw=`gXrY zP!W9I=K=a2?VbIkQ|K$zedrOMzTe(=DiUA39g zSa6VShE-$)T_t1icd7cfj;Xm>N|;U=LBoZKK6kI>c{5WB8XFBZ#QdC~W7%+*?PKdPSzWiZX5vL0>1?4_ZIe+Jv$6>*J&#V@ z?z3GGhVBgKVp+M#4AIcy>^V8&VlHmAdZ@j;j%|O%UA^n?apmJ>E`((vzEVkI9wV!U zs4jf&(DP(%ermZbpHEo@cWCFNL}~M*Y5}pCzdK>J8#rLcEG5DNIOX9g?sfN8(?X(6 z-g=_B7~_aB@DG3lBsKDiq6l(WX*z3CJE+pBk`||>m9$Ax)LtM;7&Kv5f8axdsfymj(k6yZ-W6_0K7;N*r>fRM4A=&y!_!dvWN@p6>2&=QTfqq zFOf!#U$D&Sgy}OU|DA0@DBY^+Kr=me6y4jTw>ILuXVt>&v#mcCMI5}TeuD34@^O7= zHnS($=UX(Q39bVBohOGZOLGm8>`8M%h#|k^Mm&@foOSzA--+UYj@PZ5NcwYg?K2%h zde^p*b^0>0UmeMOO|4*hrgOqTmd%u0v* zd_+b$bGM8(;?A1(9<^veN^0gS8LGMr2=P);h^F1Z`n3Z4rU!CCm>7ag@r_et=Z#9R z+xqy{N*JOoj5}mUi7CFv7`(S~A-$RYUn~H<6V8=6_uK9ETs#AcEHFo}Ssc9PVZm>b zPfpt`r*JnksMVuZ_p+Zjj2~tvk{DDLjABJ7!Q3l!T99x6l$Ak3;P_*B`JV!wQ&%{U6Q_esO^s8PVO(n(h z6FdS(&7OuddB6}EVe;0u&V`7VdqReZVTUOnrJ3k6k?>4tIN#&-QpZ|zTNiS?xcvSF zytC5#{=XRmJsG8s$5q!T!rS*`>MyAuKV8zmi@P3ewMv6!2{~`CtlX$4TnGOO$kiP_ z6g%@I-S(E9eTys_Tq;pmA3PWe4=B7}=x~xMojsk`{jX?oCJ-MLxX6vbYa{<~9rpJi zE_J^*><`i=5UYq^iMD&_XFb?IxZ;Q5@N9U~ARu;l{&?kMiH%>R$h#`;fm)e^(gw0m zB-F(})tD7~im_TuMH62qKDkm@qf0lP#vKMm{rjb_(Fe?pFlb#YlpAfboWDtgN8Ql@~3Fr^Wu!L*$t`M^L= z{aqCz5XmT|BU)4R@U!UcH1Qj@sI1-VwVU30T2&+7~r8S52xN$)!(7ezoCdK z$h7p+-C=!|=K)HH@5Iz|=fx$BKRMD@s5^Ri3L^_0pAG!L#}X4?g}ITvCmE$(b^LS$ zC>-ddV$6lQ~`y@1~Qh!t6Z7ocZgEsuk%Sji6j)_`S=CGV|Z+?Tm@T!UWm z1R?p#P8@I1;NaB;4Kw+|uLREttM_!Tc&litn#w0e7n$7rWo?vlnz;4}R1CjE! zS2bvKnQ%_*XdVC>ate>@#lrDd?9YiLA+yO5zjmkO`Xm($V?3Y7cWChaC~-qzwAv5I zh3*QF6VXShH}^Dfofq-CjR3j|6`ifNgbh(RoGwld@(!8WDEEPjvRA6TgkT@&c z2Hh$KtI~1xrf#Z5oUNS-a+573@si8GtOhFWn{Gb|judqi z;sWO{xsgJv-`}3yEFjkLSwD@8h)RosuztrtDnXYB?9g3DX7k|c<*=LV2yoO5 z9S;JDE!i*tQ%fV&`#2SNQ_iSC&4;BsYJbm@?&n*fjKMs~g)S^}j)!sq$JTk}KrTc7 zvfSo^KT-C^L9hMT)_1H}D&XIHLT`U}I26XDWKke~$yL!{y5drQxtXChQ_(rC@d!ou z?x`ZCRBTei8u@;T0jW~de8v|d&Gnrn=LcS}q=q(F*i=GBFU~U^3=d7qecrGc=<(x>brxT<2-={k3kXGI9!jyx`{XaY_2P!SdO_GHCbP z$Dxz%ho&%)NcWdrI)*`%D!D@(y6L(=W`N82tyH^WE!Q2)Yu+(PGh18(=TJ zc7y!55Tzcr^l^Wha;~V>@cG6!6eWsP{@YQ{Z97%KW-};*Oa;X@-u=fN#MyI$PKMy@ z$s#MYha}S7=HU}`po>k%;N;>ni>_wq^~Z^BVJ990D(BnkVL`Vls<+kyQqgVGr5pL* zbH1Fx8+SoP)fL<_YX}_BpC0G?R}ZLTQ%#$*5X#!Oo(me>`e*E$&lbJi^yB?czl1tN zs@`bte`tSWs8Y)>ce(%AOaC`dDdqGLQCEx4k(?M8dn2m%rm$$5pU5>$gSO|g;Ef>$(L~PoQo0zMSS38Vpi$_T z67y7%8?jcK0$Kxc3kq{E1?OUu^DS7kb$Zf~UFK3%Ip<-u;|}t@0Qw&v;_6}^^5hwW z)vUoHiskA20@1(Y)70k(JNP99DP3?YYJm5Y;=|;SInD#x(~3eaxP71^^qyuO_Ue7;2n-fzE0rXWxMZl|n0QHaFjUx?FyzN20V;ltto^EALGpCZcT zYzCsW&yhGPYv7q?g7(tnG2Tj+9=;vCj7oiPHTCO9Rn=ar8j=D|(6(%?a{*#5iVMlh zFcX~HR)ZK-ETdPGCJeRh@8qfbCx2#t;n#rZ(Ur(>Wqxk6OOQ|1Z-q*1^n7NxV1uFY zkj)z6;hrS9re~iTAXC-*D46HSdk&bWu`~rl0XY=I7RW+*9Ww{kT2u}tzb2_v4b?|! z(U>m$WljKT?ZqIBMO7rE<)Vs~ipGD>R&B=qs!T2xZ77PBvxj|nAfvT&Dx(f#*e|YT znOn)pSXKP^&i86Kbh60cD>~jsy_N`O2PN(H^G}DKyULJOuCx-8;e09o z)f?O*Mm%D<8#ikD0>{;oga)4s2&=10Lx!ck8Gezw1ihRni6LDu-y%iN+0GUQT*pIi z;pfNa1|c;K-+I2PraQV!Vb0g)TKQ@{n}?yf81e@UG*`s~efUTDZp|c8#OtWn54yX= zYgzUeTj)#*@GVv$(WJoE(vS44Ln~7x2&4cMj%HFIrubs!tEkAIh=H5T=4MDn?IF>` z5tX8h>oV?Al`hllf|zbCT9FvVWM)*{?Mc&yfyq!{)+l<5xoS$0FvlX7E1l6yEke;q z2+B2Yu1duD1D2i+kt9o-2V#GijNx*#xG4RjtJCqGQ6I@XsB%By4^QrY%aSvmVbH-IGdbi@0MO$OvRqkt{(Kmht%X4GDRPMI!q(oPU-{qA*sHatdIRj!m zXogv}rH~}d6D)6PSqWV*{L(Dm{Cvq4QzbQ7E*jZ7an!%bvOO(s>(HIe9$}%o-5-<}pVZOJHa)PbS#QD2E5nvAeL`vKIxJc9u**e9aX%WY;C#d& z#5$?53+=8170SqVYj2etR1!w*&bzKZp;m9bxVRYZL_&Y2a%>3<;9uecR+<%#tylk5 zSkli(-B{kP!U-*_CNEoS4&oxDeqJIDG+H|*5nc7;;3hp(hot#&HyDStS{q_-)vUo> zqWG$%*n0S3X}t+FUvk8=Rp$Nb2i#FA6UDf%Hp_b1Fw-;3!IcvIY<_dQDb%+~R^KD+ zG_^3%Q}f;CO(2T5(2&PJ(F-%mEzTR!?l-G4GvPutjop`8(X*z2 zEv4EFsLIA~FyzXNz9DM6Y-vD=2WLxs_rLjuwvM_Vdu9%#{A8=mZVk0$t~R0?JX%Y} zVGdT)w`&ZcC*3}Mp%YX#UjeFSR@WoO!@+bQ{}2P4$_aDgy5^;ZSx1GU!a#-vBY1_U zRM@3nFBtaPiy+=^r+w9PkdQRXG;>59F(n7o6H6h}RxG^A)|oyn;}J>!VwXA* zzAWW4W3;)(mTCTkA|OM}hxdA^Ije0g$Q8redE#3<(k>>WhibNiJ>N$wxVHD1vRDznKs!Sr)Vn%Nu#yJ0c4@g)tjYl}h-bqeJbi=#3A&@1n;i2;tcmfe%;N zV0-Yd9al-~*KVHAdT*=9-UR*8>Fs}$?5;MC*#aqR3 zaI%TdFgA0qs(X_AM4-u}-|JXG)){?a4E<*`Blfr#9!g71;z_5mMGxnZ&T%+dB;Pmz z%<~zzr(UaLpWY;-bEKdnKjvV2?jrJdPfT0Vc+1*VMadP|B7z^{e!GkV^hVI zLG^6?c3S133bv}EMvv@%hrP#-4`p>UY@@>cf7QwPA}cGXBlX5!A8UYml*%E`Y3A?V z0Kfkt)bn{A=SQw>=c5k*C}8g5Wa0|G{#t4$Q=g*(w3fPVK{C5SuSdbV3MZc{*9pg} zNyjcDv%)&Mos6y8^Q?_1BDQ+3bC(C6=&0+IKbfe(*{_JT3vJI%=2PSfs-pEIdFN1X zq~iz}QL)?8+#}f;%Gn3xg3MAbs3C&y?29TY)pR0Uh~EDE)$m{_pO0<)`|i!~h6t5G zjLozTBMs2|rFnlq(a#(w&1Ru8MT}18vP$0Z=rO-u z?LB$emem!RgJ=Aq)e~)w3Qttt$CV5=ezWWO3sZ(AldWB@jj}*a zkhUNs405yg*_KP2zqwo}uCqGb$M(gyQ1+3bj__IbzUso^hGj~Ae3p%1V= zrk5H2pzh87$AowyudZoE{_mVJa6qIOUB~}8X0W)VJLasO9ji8Ocvwl*NzAT*kZQk+ z+4ubLC2kgRT*_t1Gcqi|nm2Ou`vwVD53q>v3;S6}!I>c^62=rx*cx{%K7tuh@7h}9 zHF3Do`eH)uUbGM9-vTM8hp#+^FA7IkXruSnxs62K#zU*tPY zbSU-<7bR3YqD~4vg3!f3Xkq##L+3tNXJ=OnzOCG(I6m%n9t@Sj@GGwY;8|mBgdN~h z;Z@2}iUK%lx`0pCas;{R(~TlP=($h-3pL^GMGGF1wUSTnKE)wp#9_ja$0|T(6N`=F z@=6bn-=l17R<4sbr(AW>VTel(Ib0S!6tos;B05JyCxL_t0@2~gl?UIjWY5NgNLNhZ z*=CK<&XrF|mP)BIC_I2}UFC(DxQ#^A!Nodqa9=4rJe-~?WzJn6_f4HFdF0g_{=c-w zJ*}WN-~85zS-u$~JXQ=%MQF3>@XbL9_-*bk2PUR70>zgAe+3HGlv*oQl&sz;V}A0{ z1*f)l#O8(iyf%Hz&h_hDzqs>tot!rbXWb1xF)`PE&1Qy?N?xA_{({5=2_eOu2H9@_a*pdW>MI+Vj{94~-I_!gMkQG%ZJB%UwaDb{p8y>5=|$WQjPMMK9312M za!-o4s3S~AX+BU0K}xV&GV32Mf4bazzg)U?7ZmVBYPAqmgnwJydf4r*fOqu@kCWL@XZ)1q)ZdQH96wlENL|u|a>OQ7_M*YWI5OZy{)b!OD6Ue> z`+4qXzK0!hElx~i6*Ej3Gh%B{li|igechcrnSlECo)Y+b8cvqo&Qh1#CLhKIpN#K;s{Wuhs0o#IpZS4j*TfWOrKxNQf$9T$4HqC;YC^ ziiY9|S&4pM9cJVPMwyw55@sba6^Ds-JOCP!?tCLJHdlTBl1uILt_`N59o`@hUKxG= zafhzFVr_a+FpF@*ym6>XpbD@LI~Evi>7k%hKhX(`70&UfYbA0JarQLJ)aJEcQ5E7X2uH%L&@tH_cNjO9Af%JBfLQ-YRoRRR zfyz&4koMICd5q#$HzQ9mRrT>$9pYJp%S16h%RA%lS2@s-E0_geY{Qa3nr~8HJ-ts& z0dr^uGGT3Cwh-Ug+|Mgur@w2E!r1CNeXd>7ON!7@8%OV0VT;KaxTSbMEOBg0Lf=ZD zO1|oa%z^(mh`{T^e8mrP^it zt7WeYv>YzOs*~(`cgI*TGg=%713UAT8XaUK5S6#EG{m5CMbom#w;xQLw9%*8gI`KDcp_9)8oSy%RLaob z_q{V<%ESRAfuiF-z;c3$IQbKWi@t^p(}qouMs25`>r$IUL?%rD4lqN_nX=Yv<2XaW zNmA&mt`NzGlzwNY!A75trxPCyVW!0jO22@9IDQ6`dt&;&IiH$ZlfkE1#|2w727YCK z+%Ub#+cc?J)7{a`q90oN^65P-Dr&Xdo34toPY)nn61C5L5<4J6h-7E*{iln(x0`R8 znqPLBC)3!~NN#SyAC{T!e?&_5r!D9x7@oW_HZY(upc2KwCGZWtKk>QWXacCc`m-I( zWJwirL7QG{d`L!1&41Za7M$0)hX^4J?% zNhCKVi#WA$c}*b_iH?rE7`?ajz#y)&-;WxR5tGyK9DG>Bo_o!8AI%>rd7yq^YQ$tF zDif_apS$;bqVDOp)+B@1J2s{ZaZQQ0nAnjlb@xC;w5W~Yi)jDD1r_MT*;3=pirwnn zzFRJo+xJ2oVffLp_ut=m#fQenyv_!O(DaQjNLaENtv}*4SS`GraYbtVdZGf49LM=_ zb1;te&lDxouJ}FsGjE?>XGTo$fVzTnj%rw0ex&3wm8El3SS#2MNbRTLOtCfm4Rfe z-2IFk11foRnsxCD#ocS&bu?o{n9owxwv=lf`Xoy@{Wh6`3Wk~V2 z_b1ttA=|Uk^Y9^`xr=FOVTKk_$%op%<>7T5+Z4a}Zbl|Q<@a3BlXC9)BXk+yE#D0? zDywDBiyMu=uon=sQ9RBXjk(hL)zC1H3KXRHdQCW|_Imrok}v*j@#Hv8=aDJcgYnt5 z;cD>Oo2HAPcFSNrnDPu2PSZ7*Z4V{fJP5Ag`K_0i_cDGj{-n3?XMGUlmg!JZX(`A>Vl1i~f zcz_9(?_JlSFek2wLGS0#fEV*C669U%L-XM!DVui*4XMqCLnu*hQ6S!8(Af2et!RP* z_HrrybDJ&yL&@Ew?0p#hy^jqlaT!X%vI1C|NPNPGKeaLT{-aJxs%uRSNosVa>)U4` zj6^ZgiK$$tZ$!3Ae>fQr{#e?aQrj6zZtbZD=sSdlK5t$C$FSWL<}(#rumZ*e-6-<} zJ4QSoW;Nd)x)5y%l@u4Vk@d&Dc?+f(1q97S%YWAvz($lmjZ3ZRV3<#Stv>t=I)Ck> z#Dc!qNZ|9OtqY%>LLOJXk6C^dbu;;?B-%V~iM)pd@fbl!!uX$uH*fl8P%K%>GCfLD zmmgo-2wZD(bh1m%P0_9S)z_L`ymwv*7@rM^Y;8>P)kY_)^!3cIq2LN<(Zl8dVL|D2 zZHAof=&#@3+kccP+j2OX==VGZiN$&=`h{%^g){ZzA-Yd67SdFoaBl<%w>U#sXMo>Yf2A+_s;bwZprA zRAwvUXeW;*{GmSNn-IcY3_(OQv*|olwH{>oIwts`#?#$RF!A+kp)!eLfOmzJ8q^i7 z6(FiZw8Jr2olyTtD@jDWvr5UT+&bsl8b>*v?Jv$3lNVE%o$bIuEh$KAOs)4v8fNaX zsl*vb2z){dKwpR1i6{2WS*-7uW(Ahcnm{|>$|b<2D!Cvf@K4o`C8yfqAbMA^Ze-5! zn$#MlWx#fDebqb~6sBb66kg$aV8?5?`FNH3_;P22*3F9)@D__>U7G0rUOWM9LTAhr z@>`c0d@TrgD_?!`>!S{~&zK%zyAf7xEy*P5Z0bm2;B{>+ z@0PE~*c!N}{PYr+Uz$JUA;2N?SbOt%aVvM&(T-GTVy zb(u|8i{8L26H)?&ylFsDf^B#+{Z71eFk$o5k?W zx3G`IGgH<32@PKJj1pBH4>+EC?IOZuq!NU6m6iy=eo1JFtEuSr`d5|Ay~;>LB8vs) zyHVV3T-E2zfSd5`@N19HO7o#6S$1dvp51NUO4ePr?s)MusCX@Bc~RMfBg3emo*pT^ zH!tvQqzUd$Ly|J|+YQy*S5Ul#q=7&=v+AvYMm-FaEHVK;G{bo6JBH6Av3{OQt!;VE zf!wvZ)s>BS#&8_l)Kr%Q=5=92?U-A&7YwzjZ?xx&LY=Kf%6Y;l4W9Ut;HU!%4h}{$ z3(1(DS#tzjO(_v8Ur%@9VBoNuEd2IY;LQ%gW!4Rw#1D98aaHR!VThH{d3M$xh0SX6 zhaSV*{`vg|w%j}UcSTiprfGklK}>E6wvRfVB@~KLMo9K^qDihhNa10G?P^%XBhuh# zKnESlevR7&MtVED$BSM11EnJ6sb>O}`$s6ae*A@7yUlfozk`DFvc&PqtUO-jqbClC|T$Z~=S$6^q3;)-Ch-7|cY~4@g zTSq8G%=GTpAtn>1u|p^k!G8QHm(z4jVW@NXbL=m0`@`%6ZBI?p{n4!+`)23V$hcO+ z%;b`LoPjs%q1&B!wq5MoWWsfMNSQj6nyP-O-l&3)IFy^kzt!lj==#?=9N$;kh~wwV zU7ISOf4Z1?;c(K#;)qF*-_(lwz?AzC|F~+>hNo`3n}N&B8UI->8GV3dJsOFf6|m{T zPgv@-oX$n15&tgQzteJ}fn$Otj()~JkGUNgZ#!X>qBznQ(~oB;Swz+8y5;`o1fpnS z9~yDE*N_=@ZP=c$;r8KEY4bQ2h;R8fefH06p^GCqy*UEv^7*jkmrElt4%}EJGaIRe z_iev^QqJT07!Z=Z5Tjv-mwO5sZ-$sdoM$PL37Mj@(KnRa<(HmGuC{HFPm6PuI}Qj! z{m#$Pi_pT*e)lW)N32s1!>ySBDbe(VIRm`!iNSj;3v$x-Ri-PMq! znU}on4)p6lNyAa`886!i3=;1q%w*yzBBGX#-9T!k=rEw~*N7yi+D`TX3*N2vJvX87 z*J$)PS+p?>X@si>t2W+a^x_=2<;E19Hl#^pzbhg`?71P}gt4ZkCJO97z+@>C5r_yG zgdSPHNq{D~D1=kANJk`d@l>KB!|R$nuip|dSFF5&eraS6%)WJ^c775Am>=eO@>dLr9(Y9|^v!)bp(_?_vIe6Mr&^Ql4SGsV%&U zAHYov?R*-nEG~%qv^WOFIGK?`@Zg(B-u@7`Ax4G8c|aO)LZ8UodY$2NT7iu;tV%Qq)A|J|yhs`r_Bq&kH)kpXMfFG z8*rH*d8iEz)_xm<`vxC!`JIf9#Hfa~*>`?0%r~Fbrso&Uz3WlJDE>~VL^H{}o12@g zW}_8GXGznOdd-^ICt;059B*X{2|)))o5|!u&Orf)%q=hZ0wl1l4Iue5V|+vYz#)Is z^Q{~c=%z3Ib|Br@isp5`EcO|J5zDPmLM_G!|KEV5ilOJVFD6dq<)3w*bd1=An3~6e zuv>4Aq8qCx-cywJ$-8F5GBUp}#}dfd#`8FrT;H;;EQn0rrh zc_fNf2OG0yKfVU_A$D6!IkBNZ4NlgNh-(|y$@#JZ;E2_JV}`3O+8GT0h8LJq^~a99^te38 zvGWMl#Ih|6FEh8Uq*M0hC>LEWAV(oRI3w})MPf;9Ol zg13zaHEnCO3*XQ7hEbARz?y5)y^Bu|zPPL1A;o1X@}N!!kCI3v48O&HHd9RXr!=!etTG+|zp| z)k_wkb1(qTT(z>DWvfYF)A(OAhSPaN&$$R=mg4YHY^}syWnpcGVrDpa)!vE#@6ZSLW;x zP+HnFiLhA!=BhF~VluOJeT(19;|GgRK+D;c>|Phuk{W5UHxGOs0diIML#l@R3)wW` zPhMZY$vXl^U(EdM8T;Dy^+0jwTf@n(oge;FA?`^lHZdF>UWT#K5N!vBz{PDURM0;9 zdSc$@%plEpkmu>Qj57?z3YM3;AZ4=Gm+_wGi=1ve`Hl5K0i7%O*4`wWhlv~M)wSMz z(H5c0gSj4oW+u?3pvi?J;u58;de9VMXVcMuK0=qf*2ohn@+r?3J zo|beMP0*Pb_7&X4LApS?w6lpN5Xq{r8m^%u?)mmr98e|nDee-hNlL6Bb zxA>|a!CvMxuq0GI&{uo#(LoTi-v9S^ul-Igf^&Z~-no+7^kYFNY&lnv_#Sl|O1Qq- zyHW3~Kn;jak!9V^T1-TKwAx#I5imey#|cX%Pk9*9>dq)i^Ik^AqMCH#XSxKWJBS*8 zwSLh0M?ZhAL&|txa}9>`icCFg_2BEgd^22VmN6)ln`eb5C^{y-`u@I~1)saImekCF z&0PVwZv9R}DDhN}>HxZbPfDHoB9_T=l*^cqHnx*+rShD|R{fmBq z$VuBr7)*L!@!%(d$m(M%0sw%wS99-oqHSB_TgTXFIc+=IGz>hcb;tWUx(NFF=0_i} zwojMK#QXppmFKO+&of$|6j+On&#&gdGeRp`{^uz%0B7;%{%o=K)HqJT57A^B15;@6 zrciyD4dK(X-;1wIvS_K8Uo5%wt+1`H9X(yK&K|edR$R{O_Znc) z0u5xk7baHKK1Ke1#kt^}FpK?x$z@{%bTn zD0swhAV*-x!fOoo*^l=)BzPFG%YQIZ1rBiK%7_ac!VDv-1$~*#tVIr7ksq|uAb0vP zC7Lh%dekdlPsRbPWzQb=uP_Q>`Ni9SL0s!mMrbJ5Less#ARsP!5(O;t6 z_I!h8<0)d&PpU{nHGt0BFP@ucPIRz3F20RJ_s-{ywKdU&h6+1L@*TnE!LUvKe&5et z_P#jQu1JnpCtT2y>2h*Yw!V3 z%n`?at|AcOzaNo$+V8qgxzKP-Lbg%`$}I>1135%b@^2s}X9@V?B(By2B12Pgk@}i3 z7k@xBjQE3FWDsKf;+#9*zce>bOE-D?)UdGD_E&)Waee^xf{j=fJ9j}P&Q`Hj7N_8V z^9Cxwi_`i%0H-xp`U(0sFC{97WEQTt&}#F2{_5uNvImQ*1t?%+%_FXx77p|5Y{q`Do~@4P3`rq9SL z$3z{z{`n#;$lwBaUbQP0)pHM0k_4jUJmK2=+|0`WZvzct0IoW zA(+qH?7{)a#w6Kc+dQjb*{; z=MWgEB_8(MfSTRI!bBvb{C;GmvLrJ-(v4XzAL3R!2fQ$_=mDCv5%PbM1$^GY^CX5p z4TYlx82@MxY9inlMMt1Pe4coI!K8Ehp1fU#@zm?HjrK@GxWDSo?y%@D1>Vs+IQKw_ zoCIbT`e4ITI;AN0qh(6J3-BkVh6IwYe_rCl2f*0t(P!O4^kEOa;z4)Px6vdYeP;Ga zy&q~aVrJlR)`UQUakPT*v8QAZTKOs3)=qS|{R^M$zRHyqf>d(P+p&(1Q*-}=w733> zGXC3rXNK;QZb3i^38|q)M5IMJhY*k&y1P_hNa++Mq`Py3p#&s{5=LU^ZUoNwefG20 zv(MV+r}IDDYkltb6|ZZOR-poCm(+~iYIr8h^!es61}9p(_}oKc1|XXuQcWpSPr2{; zpt>R{(1*tMyX5}RcqFX%370Nl2Y>E^4BhsT`s{9`cC#Fl-=$Q6i*fMCQ+-2SMi$vq zDsg@6yz_l};-{=~j0{;)z2iLo9|OTsL^`Rm#BmsN;6+dq_}Un669<|VO3@Q6bJ~Qb z>}8AxdFC2bseQk`TKy3E=i==Ahjbv=25l$;MCm>M$uRGhA*rDTV;5oj=%^Y3XV^$C z{GA!Xan3VId2C}nfC9!9@YI>qVebzEm%J(ZJuI!mpt)rc!=|woLDYO5q}GN}{Q9b- z?Jp}eRZk?wYOa(j*@bn>2&|su7vGM6+z9QS!r#6PmZhtf?|Apy77+ypmB;=CN%r{I z;KSeVEA8pZNT2W4n7_&&9Zv(paTNLX&4aDZ_m>!Z@Zx>rIxlhiPB#49?rG24ZAw4z`j_!o$bn7`}Q>F*kX~I2B3G>m6$I;mQ{WmlutN#0GXzRbzL|X%> znBfpcHME+YVs0u)+vPG<;eKdC`s&1uU>@I%Ae-)wfmjl|9Y)#W2DT5aUrVyys0T`M zyVnF_&^mF##^~_^MQ!elk5nb@f1g#l5fBqL&UM`maHXhl4QrA29p;8b4SjQ-Rs{V> zfv=XzEm!agS~JIV=kW1{(k>KTN#%x=$39UE;L4wtO^R!+eB6|KZ15c->$2P^vroPA zUIfE6s2I8OuW?!6^esP-2+OSfGZne>kWr_FN>L*tJIjfGpWVFni43<-Y0i(clOVR4 zKjH~BIO_a&ows5TUK^buuA5Ee`!eW#;01y_{ojb8RZf@;b%@x_8~wrvI}QJi$Y?&| zUy@|giw$yt*BErm{YkOfuV<`I;|?FZ?taAwJrm}hY~}RVBI`PL=%Vp_w4-B6aQH~7 zF}H8LAS@}YAUr(0#{44G?UBDi@@8!{naqaKU5Yju3nwz6Cd_5y&RwQKvPTr(# zeMWr4C&=TjiTfR5G~EII#X@p_l@@%J_KQVk--qT54gMBbMT(t#&~fpbr|g7(y(H%Q zliSDtEx!Fng;OmLrPR`w9!Dkln5XS4h}XUN&03VSpD}q6yx)QGbSe&-`x+lN-svH# zO@*%c^#pdzw}s4NM7>FkGyH{G0}JD|%X7YZK7E%*E7h+z^LIK{8?-(3n`=l+fO zHYI+(Olg=$n0eIM6*+^2x@W!D3wq%Qz05zQ8^j^{q8ewSy|ey!iJK8j&YrOEP@ry`X0WSBVq3o;OuehQ364E}xAC`<9(B22gPZFDMw zfemtFE|ERmd=g+TacW_4CMxb$N!V6Nnxj5l&`~TdeSZ2&&_l178(d(1)>=^&dH5xx zx~)s@)M<>IC9xw!ro+dYQ~IKpzPC{ur(tWti=K=2kTr z29jt$2V61yf^SW7Ko}AVODnQ&tJTs+?B(NqnMT&i;p{D+NO6?)UJwn}K@QGGp%w?D z5_kA&Mza=4?UD2Vc|{u*Ij^D5VTlAGgEclYO}PE@r>9I+k9SiNqN;~+y-uUv^$SMq z*dyP#?|$10_fKq*-EH3mgvgvDyW&LqNCgv%z#-k&+fae1q+OCYz#d%D3Ib%?Yi(j8 zMgW6gz_n@dMnOEcN1v%E$@Nwqjz}_pS2Zzan6stc$E)O^=%zh=saaUK3b^o;fItXA zKj?$pS-PF5ZwZC%#Q(sdYzZBrV2BOL7}ggJ(5|?st5c7LgTa_6K)#3YqDX~>cY6rF z_;C`&Il3*%0_~1S7bjNDt_LHH3C6C+3*&E}gFJVC8}JgTwp>Jn6((r9XAiH0s3|d?Lm| z#gk-j#R?vzD&!qZ{+(>HAdPvi#QbqXttr4*_)eg-V* zcU@28KjUmn>Mo9Ljb`!Vng4#=3_G{Fhb7O5{``3m7lHO;HLS?x-4yqFk7O8ub=>i`zkxph)Nq39JVaD6z zjo!J4yt(^*{e9eCc9s9D@yCOxJK@C=KcAJ*n}-P{q!ZWI3GvG~ z63qJf+H6xyA$fn-xSwv$oDW%d{bzA0BV)d^RhL$_9g;U>Wvcj-@CD&BqSt2a7leWK z(UE`MhMboh8!juimyc7MemH#c?{f%ur+7AF)}W5i(F_cf(Qev)A$V|yX?f)<_6&P> z?3k{x-i_QJ7}*)0?KKbL=Ct`w-rBlqP)p-_0u{9XUQlL-HbBve_Eq=dBoT*5MKkH~6qnMd~fBi`P*V+i2%6aF3c_QEE?Ay z^8A{ZkEIF}3-L@?RWBALZe3(rnKi;rd_v%B_*eqZ{ToY^8VlPO0`7bidGshO@+H&J z5{bId!6F0c1s{(#*6wGU?x?6JKPEXU=~DA}EVUx4mSVskqX9^C6Em9vnrxSrDWj}9 zMM7!6MAEu@Ffz8*Hwyn_hABrma|==r;4M5*tKrig<@cO5v+I*@)%wV&Ue96~0NXq2 z1TL~^M~_>;_t4F$$J$DnHd`*%9{)A7z!y)j^iAtL{O3WZO!*4(zULyC4%Xp8iPnWl zVjYuPCcm($zkaNRHX0zUjrRmRQkAh7+1-^M5zHWEibg3`;0tzV#dum559W)YQ{k&` z;#Z&61cliO#cr-izy?T1FY6_V!OxY4dShrgvyIkwBqHt2VT()Cb*Pn481!Hgpd^@7 zM4&v6Tk=>!sxG1LiqncHq}&lFpBNz^%)zkwVC}IL%iYGyeApPx-W*ZJ0j6J%d8~<# zJD|jfFV|~wq0$PSC7LjjIJKUYhfJ3AAzv)Mx?8K|3xg46z{q)mgU4E{I(KydWh^NM z`0r5X8Nu#Klb9B`qok}1#YQ?uFW?&0Y%&B08q6mbF^X5?%kZ|U7IU!3-P?RLYxom9 zGL%`3CGSkYrR#tgg>HVN3bEbDFO8JJZ7ZlDlrNV#UH$r75=k6R(e|Q~T0U0^>8{V( z{N(TD7RTmyA?efGVz^awd~|4sKmKs@Yo1s1uGKGoDHHi_8c8wCCC3eb>Yhn4Z)eT- z3Z*-S8Hr{PI-0WihK}duNXP>lqR_n~f1hal8XWI6y4~*T5UUsUOf)~pfUccN=oOiQ zJ^(360=M0E>;Qn@K5}2ms6Z0W1O(&)=>%B(~=84`3U6?#Ke+-(8+NM%8nn40&?cSAMbna?;3XF&-en3vop*9 zFZkkDItt#N?2O=X8H={uF#ygPnk&^H_a}~R?>d{XD*4E1+-J1X=6ugNR~Q+LY+Pz? z0PEI`9)}j7SgGCsfy6x5j}FhRi~e+vVI7L1nn!z0oLovjvaSBP)bcq-9n_c$@m>fv zzEv=I<34x$Av*$W-N9uy)@k$GrL>^eZ%RkcLRcM2l zpdh(>`<9RX=#N*QavU#{`#Aj>?_2p+^JgY_=cJ^~>uU;( z7e3CD=YG7{Z)v{O?sV&H+Cy)s7^HdKy4Sey@B`{x5YjO{bNry~$rn;W%%W2T zGqqdszjJ9)y3}>UzgN2 zw;nCp=%Jrod0DW8s-n6PEg*?Ez>RR z?*#T4R!n)Yb4r=ln{5n+_7QX0*?CbmKj{AI_YA%ciO5tVLCJALlp5IlMcHrP0m%oY z8q!xE??h?g;3p2&N2kTBCpb7W96rZm%%>z}^W=H+P2^QIOe9g8OY36Pyp?0*Pr7f| z;pZ{AljqoZ548~O6}CFF^Nr{3LR$L36ZMx!Y2xQ6lR}>aY4U+UoYI5E8H+r_b}gS9 z)YWSm2+KywiW;>=QDcE3#y}&hSoIOo&k^Ty6_%I-91a0qIS^=Hk2)CliYU%OonxVi zWrBE52+lsNI#Ot@l^)Y42-p|Q`@uSh`IGaF{2qN}E z(nP*d0^e*^)Ss^!!@%%nLqK;vrym)G5mcZ$ZJ)E7)tPvNCuwyS9#p`JQ zo#Q?mLA-B|6x^+6S^|pQ80Jev?+GNaYM-aZO2Pf;MNUSp>W~36?`)|<%<(i-p1%P7 znHs+zHI;%R*N7nxhT&A2%#lA|nukn(7F5O=ogXZ=yK67fJMAQfyDS6P7GKjXdOFd8 zu~zy`@&fh^B>qm2v-Q50Q1ThpMTVV3Bt6Ts2oBavXUGeGEKYSYrS2XOka^2-8l5Y( zkO`)9|+ihn_2ufUxuR{iD(n{U~co75#K36tas3OL5iiaM= z-F}o%p_tJ@d&xR{Md-sdcRpUcy?CM zo?#NS$1jm?OW@r?7%o7SxwBI}b}lIS`c7u|-Ge9#?iGJ5|6oVAhr0_Myu{8sWN`FY zjTi@nRQc?g1@i+7x);@Kz)|bR&Y8G(c~8 ztHYAQW%fKTil6SZRpAuw!gre3!e_a1=D;(PF6Qq!HdkG5Eg2J!kDvUVqrgQz|Sh%nmE4%Ur$QGo>qd>aY>i9n3%H; zF@J#$A~u2`!>Kf|cyKz3O^5Zo!lbs@+IKGgMC>4|yCAl8N@EU(1iJ>Cn+eevW|v!+ zv&vK09q#@btnL80586N2i&+_YaDi<*n)?wVildrcg$|r+>dx@frmgMRT@b=-|1f(m zQee6^61t-*gyn4O;XQ<9*Sgp|guS28u^(_ZrE z1hR7>UQNYD-|Xh?J3}3iXJbvpEq)_isy6hMpfXM734M1zwr9ZOwqxnz0S;HX^{vg# zH57RzH8S^l5;h&}NqM;@(P^UTx!*}nM;V~=vgfVB4EDRZc&jqT^$ESHI>eq%2KM%s zN^{^gcG;fsmCXK5{QYG-M;&Igz4jKbH~jw8BD+h?;G*5#dwKZnGr3$u%C9sf|Fj7LRdx{qBSug{EDF6S+cls$JD zN?8%rav7DWU*Wy2gN^(VVrO9MWyZ0m#}-2_cN;GKf~mPD3}0c^+jGI7vpx9o@ej;G z@Qkq)|zfpIWzs~fSZ zki(mDld3+ts=iDY-LC)j1~sN*-k{(*YN>t)r~l4t|0gnsxsdML?w!1Q5{dJ}tC$fV zB*&ojni@T8?7J-N$3;;V=jAKyy=nP6?B%10F5htg*a)(b#F@tH1Y^L|cbv`MNPc94 zpg7BX8w0d`h38Sz!e0qT0zd-TK)6mCveZYl6}M*QP|2RhBp*w9R>1C-(d{M`?p{Ko zXQr?0KO!>I<4=Q_CMG>*VTwhM<&rgoM6Cl9TjjC{G@EcaUJ;t}LPTx+Y=DeYtAquV znmMwxe%Jo+j2icd5o5lHk;01d9M9~ljV0qgpo>{KH4_)u2W&B2j{57u^_P8mtt$FyVf@l9^8DWGMyU zwuuGXutWjR+%2bc0bEnb#?HhD2a?)U*W4L-jS%zt)!^;pFLAVlHztuEi*!`c*`$wv zvOB~%jHEXgdqwxs`Sb6wk=Rm1w?Iqn$C?Ab2zw>>_kPTE)bR(L98oZZg?yckpu!$` zrfEQ$ufbdaGJ;T4XAsw@1dq&hCa@S1o_ttNAwG9h(L){`TmaLpA&)|}7TY&mMrX^8A>iS$q}w=ZlL#59)}zs@ z+4$@oV0qxANR7CDs9TcGMHMiWn1Mf_izlOT>*+NeJt^331W|X|DYFf_8ef=E(P%Sr zWbuzOHPA0x(v3u$OH;w}m?8%eGk^pUeG`t+E_wX9jYcrjN=1b3jW~p~x}x&EsPxTg zLA8|yt^88PVFxP{!Ikjyv0j60>=BkMrbjLdV!M^0z9612T#Cx6x^JUu617iF!^?M0 zMVTsF1N4y%?u^3aH3(!?wR*I2zl0dTr{+@l)<-W(%&)A17#T zXy#nCtd!^rTT*k7?taQIAsY9b~!BJS2eMJWyQ6H9gAW)1@| z06{E-86?SxW=_5ZfLy|yK$5U;zj5-g`vV>q6AKwy zfG9?lEEEl~{T!1|lV*O&;!q{EcS_}=r!Q=7&Ji`Xz`Q8sD60W^Ck5!ZWuViKGl~^0 z+VkRe`@mhz?tbz-;XfmF+$-;z;eXxEm$J{iFFuX4tZ_N4EOpi=hFCqH|>l+&Fz1u>qgo! z={kvf%hS*Q$5k}f-QBI(;d%b{$^CnVSEC>Dz(eS?jkIOh z=dzgzH!;CPvNyt>HiU$hNwnf!djS9|FA(gt#N9$s9EihI@FgR@XmdB(4=B09n(^kd z;2$mkaXCkDd0q6Oj_@UvSjm#!vGh00nG04&z-Id>%s(cCD&pX4SIw0x^2KCCH+*jF zFN4J#Us7A8Ni+>1@>(Q~qYN!Lgefme=BQMfjqA^x3+Uc#w@-Lsip6CkUO8%(9 zrogJ8xKR14>Pq<VgFMA;3*g`jk^ID zpTO6$z5MoiW6&qW+eXa~M_yxGEn&P>=zuwJ+o#S4WuV0J^^MW|W-@NG9rr4l$Dj6)y6VW^3q6_Tkym`ge2z6t%pMJ=sPZh5 zxQM8~qhzGfI^2VyQI7JsQ}#GK4{zvUN4x@Zz`q*~KSH>r)-_Ug~!c79i^?{5_x@ z@>P$rlB&qw`Ljt}OoSu$U!Mh%h;GMHe2!`gTl}gyqPB{T4n~^AH$F#ePzgV`51sgE zd>*us7d(M{<&DeI(yhePXaKgKYp(c_A(y?O59-PmUbT1ys|L$aItMK93lh5m3h$Fm z$Vg>wgzpK{O%BCeMaJzJwRH6AmLcz zLX})BDf|!;hcoSl+yToo5HW!*+SNd*Q_zmmo{Y?JdxIXMgRi#_M}8Gxa2X(rCSnQX z?3{XuszLX_b}MMwJ>a8*N~*)JMP9zR+VL(c@osAoGR_etT!VTts6|;RSN8>Wq1}khX#};28oQH){@y+an}ny{0J8z*BU7 zC;68w`1}lis)cn`HjYt%RC_9~-qz7tF0B^X1-rW(4bu0jasoXLQvomX+uy%;2oovI ztu4y3+IciL*%tBv=BW5%Fg4lc3x~-#Wc6(P$TNvZdJFp0#GHf|$rQ>F3RZZgfYZac zaBawy(;a7#kROi-p82Vtq)acK>LDE(Z`Q_lzRJX`xY8rJS#r_*)aHRfGJnbL`D$}% z7v^1>1D6_bZ_SQpY%Tuo@aG`6Hh3O`m=3oHS;^>*wJHe?WmwlPKEK%My4w+w%K>Dg ze?CgPu4Y}3QeL<*9Dg484GgoA8EfmGHSzQe@Q!5<0R!>R65YOkleD7+8Gt^5ifDF9 zIbt06c^)3x&^Z&e!hm5dW+1v0Tl&vI4>d7BU}T9;UKZp zXD*>4dp}zSVNX53{f8?Gj&O5KXAV7we-zF^jMiilc?=sVft^&V0U|L3Wn z{iqh}BxuJ780KeWRx-KRhR@!xGR}QI&$_Pbkk14Z-3**jaeChFxi8j=5fIcEewJv|>n( zJgb(FQ^o008m?aLaJHiwa`abKz@uIpy3uvpks+TI+gdys%JW!9($j62nNQXEQ9aX* z9)d_IHWCIHCBb$TyLHdMS+%(kPi}#E{Vk{H0~KVNbB8`}K+Nq0f`Tey+)nE|;%`#S zgDRp0;{H!(DNP=WOzukR^3q4}vp?g35XMxpH3{45aBdCg!0b;rKRCuE|60G{5~6fR zucNkeXFkzTPmF%0EuV9LdB)nG#oss6v~0P6Ijzd9kd^5z+_n+-hs$cNEDUq3chO7L zu}>hRqCG_!@hD=FF^PB)nKrc#xkKP%9bF~m8R1sIDC#Q6SEHrO^`g1jgU<9C%s!zPlhPu0T*~-haUTbByMecSC&= z7U8qVKgn}oW10;#U0#Aw^{z&qG>I`OHyCy)kbSEj(O?|;T8EXnPZlTcBz)X|n?1Vl z{wPnH=oQ{D78?|Z_NQ*yPo>$gI2G+J;>F|1CJSF^>OmH2ZqI@kHfXUY096)ty72m~ zT`BU;+n>t7I}mA_4JR-9U375|2M6g2USq;aO0Xlk^=!Dre>n#ddN3w^YvOY(gd_&w zffQ*3McJ?wo&k8gaY90xlW$+V%voI>DJ>I!ikSq|5CBZ|M6A?xCqo!**tZW2SL-CZ znfxQIaPmIa3gRz4iN7A7E8!U7G!jZ<0_21!%RnC3@Cnr6Zg7}95}%(AbP~+g>y=}E zm_{paDq51E!SnPLc+LRaPx(1gJ=(pTv^aH?=j2wYO^F80{=xR~Q}M5Q3ROc}su=NC#LwyO_WXX1f+ZySFk>k(UW=^L-YVBO} zo>4MVMg(I9s+&{a1jR(+a@Gkhkcy;oZanK2n&mw&aMFYBaNHzvuvQ{+8tPwtm?_fh z)kxx~tPwHs>;EynsI@B52!(*Oi<1a0EMUCAp$^H4| z^ut#Im|O|oU0xttsHDYRAXCJ}Loqj*FoU=Co(D=@t!TY=P}RKbmy=b?6U2gciZysA zR_*7YkTJD%01*P<^=0zYqyrarHB7yfAm5vWaiB+!XeR>It1(l^o;>W5!jw#120_D| zdl$S=OpgvYZ{FcRPf&{SQDO#GXJ^x>4vZs3O6(N{uO_T&J7RMO@uZuP1|Qx3W_;P7 zHW;o?a^hmVIoH5p4YAQ{@S-@cr3JWA=#^i6q-!hB{F@jd(AOdbmR0Kncb|Wj&j0I} zj%#O%ZD88hpUHr)qoyrh?{Y6Ige&v)P9!=-3?UTZlw;f3tJ9vR;HJ6nw=0BD|=>s0|iU`=Vja*0Iy z%}q0uY1L6PSyhnTRn(^MF-Tw}%B%8GUBrmV=+g*e(tQF`b-~yoV)Yd&O>^q zemW@7cdx;5{n}aTVgw`jcj=aP3U6;N8!YApR!3MT4~(NG0w64G?PU`WZtkC0q3)_(Sj;Kcpl%?pUg_&+42% zofm2;#3SkVhykzHuvHU9Gg7VHVXW;5_pCo!OU zP!r5wZG2eh$rXv7@`mvZhA#~v&CkTM_?i@> zN&95pv(lWQ4mu$sIBs1>aV|f+HaJs+Z11-RB(F7MnrSc$s1{qB9D7CIR2<@yAxk>lW&PA!lqxr&E9OiR`=SenV zkvD8U?E6-x?eey2hy4YpeCSW+fQiR#{p$<2qpyeX%*NneRhI9ryggT&v-q=0 zt46+!r)5psm74vJqpK>IB!$j1^5)8NKf`4DAF{#Zc6PX9@nuG%aJ(hD<6n_!B=g^` z_4MqY@+TEtG15V|)cFg+GovxlN_*nc_}_)uAxvX-`{v4qmo~M6F7}@1-sK*B8&T{) zU?nlIFu(KAy#hpTg)8_xp|G78tzl|aBL09?eil4>W7Lba0c^5fIyU?_^04O%+MY)TW14wNK(5c+dwh0TkcfQY9 zs5rq3l+(-JrxPGeNmt&*)wIpGjx!2rKb~6@UU8N4MfLYu#cTekIYGYim24Rn7GyFa z`1Zl+B6*>vqfS$-}1d&F6ZZC%|O>%AhYdaV~){N?f|o;c+Z95ioPG&|aoIX2WB z_EOMsisnE9ydE*Jmt%TwKV;f)f$!3Kx7-UinPXle_Cqu5Pr3+LPNOO{fJ1uEH9@}x z)AFS69{7JJFdTwYhszXH@l!=b755fmdM9S;YdL=Un|lW&a(>5=f?~k3&|AG}(vt-8 zypE-gwUBJ0G}Mnik{EcfY&Hu6yNeC;=yAUw{?3?my6X~tu|Ex7GZ`-5$zeAo=^}A= zJxU^NHkHHQnIvi(NJlpI2ish}^F5%;=6vzl>?dk@@rx3#dBxFz(m_K%MYv*WrQwq}Sc)6LoCKYliy-?%J}B95rEfW?NbCwsRIW3UT$fc4YsxdtXC zrq~go(8>kpHh$^TaYc;qx8~O(x4R%KKB^!o&1L-a>b=yE-95;A`&DYL`x`yP#b1}( z85bq;tsXp9zC{P=6V$s>iYbHmzb7Q=*HgJ|P(aw%s$1iY>XO3&&MygFT+K zvy@++qOs-q<&q@az9ERf-PY#2N}XEM*&kyRD{Dbqrn3S12cVjL6(@~3{>ER8*-f*; zPH@@j$XSja-XRWmOyg2k_xi zX&h5{T3D1B?{hHR4V>9oH`|{cEkycCnbkOzyIlERe5;w@4gRlS-~MUS|0~${AI?x? z?MBtRSW2zpb205kx1;$_J(uyv!S`LiKVZ2?%fBT!sz>~GS^~t2M6i!^C;WNr zu#zE=&EI0eE^f%nE=aOIJ&sLYbP|3w1>erHY0uqv0(dT=3h?qcgQ?4<kTMImqtuYxOOswif%ZezGp9)Vz?x z+)L8=g%8G6XdbjaQ9jTS%-$aSm}(pNZ~);m^u&kGeNCv+Yt@(8ursC4JI8w{CHM4q zgFhev*2xizqS|~V-|^m~i*TSOEW2SU_@r`PYp$BI^CX4MwC5@#+tzU7TeXP9<@>UM zELS#xQewZb= zKSM8;HSYib&Hw+f}V%-XbUVk&=XmX=4$FbOok?{_r2C#16VFv$nBg96BQG2m{lQyc_>( z2!ffY5MX2ISlLv?DrSr0yYY_0{nSZ9uQ*B>-qNDo`zOpOj9JW$8PfoJVHdhCP84(W ztVKX!)xuB@q18g4y;lMFJ*jiD>G@G-Uz>%dgzAG$MI!tB7h)*^_5A};%(y5SrWbYS zXpp-)-wnsA*kgvU0NmeOrrhR{9CTh;l!Ppa`U}vh5)aJ>^3!H^7wNX>Kra251l}s_N>Orwyk0X z$>!Z`4KZ=%SB0b=9$BnvVxJnno*2oi;We>ow+79>AV)Z)jXK5Oyn!jmV=HjWE#x7R ziNP~C?%46f3bsDr8;#?y4x=wy1n#m=^G(j{YT|DF&GhoizdUQa^g zyq;?Ou%z16bb@Jb_&kiPF|pwDr@-PC{7kc;xlo>H3*^IDva?mD-C0Z1*_VcU!|q{p z=gA&c9m_Wz%Q2D@xVX4~MEmYi;N+now=kcW2zFNnEB3?Rfy6@jRRjB*>cY3#Th?A#-b|-uGUl+J2iq1WgIP zoegH5Rp}_9LKl&gk{QOIueTt%Piir5{6dTydkmU?R4&W(Q+M|9S0;bh+0|IE?DlWT zM+?FXVJF^8CdL`>_a)DYa(DHmCQ@;jZp*W`Oqe|2tTtyXec<1USI#w^vqcM+rl<1- z`)D66Md;g?#j!GbKP($owkH*Q10`NRtcwMQ zg3af%op5*>^w(?ElSBp?BJU)FnRH~F8y$-}uLXdf|F`1{lexGJ{+GGfez%_`R(Xec z#heS(j5CyLPJVCGHS)ew|MdSwk+}62Mh-4ompJxsX$VvkKDU}l?fGGZv)HZBS$-0= z>4tZ{*Y`M#1Gh*O7693a$UadyWCFb9U|%nSObz~~gq5(~wrEUGuT$RzovOoTQE~XC&4fj(f9w zl7~O>t>@eRedjS@fW16)X*PNRqKY&4Q%!%eqgvo%Y%6j6cNjofQIlKPN^f&KSguNI zc@rC(kF-J|#)9;r&fkbWlJ=NAx0yz93OjyV$#ifq{+$s08*&GPL}|?IrZzQ3N9Sb_ z7go2WOa}$n0Nt>kkTlpkcQAG5$mhLM#%(OH(4@awwCLJlGO+XODnIpldcd*z}h6tOceXMkufG}m)k{f~ti9RC%Yz2aItc!K`P(^!%%t*_jW)t8EqSQe%X5vcB(q1pH15UUW@_M2;RUW!)ww)ZG2AG zCnHXn@Y8^FL(MX$R!HmQVTc7czKg_rImVYlM*O<%Y`2{>@%cvJfM&`fpq zPzL7M>T_UjZFgM0BZ_5x@SsW|SD%G>GivTcCiL~be$4Hha*~pkf>*2sOv69tBn%5Y zRFOPCmpAGJv_u>>YdB}vhT+4$jda$l%o>jOfx$zb`#TY{?9MrHkK!=7LE5}JG9WWB zJWlCQ%eI4$PeBmT@bxa>-Y~Gpig8C$f1Q#z3CFvSTK|Vu&gk^nxs9yQ9Ht+9#twjD zrq=ti?SmTg7F@by!c=CcPPGtWBEtT^k6_+E#xod!JnQ7oDBBO~R^nFY#C|GEri{7T zjCp!`^oxSA8_pfN~TG{4;!zjc2gA4l4y2`(;rlt zKggR2eo)H0=HLWkTky}vu&YmJ<>8EHm-R^!ihYaL`O`xZoE_hFHM9=q%A)RWxxc$v zH5l46Dd!#5v=~1kHr-;X2ii1suAHvpRpKxEZ~D`|)OHzKF==2$2rsT-%C7#v>|c!& zOgKS{BBjW?>z!o~^i{KyqmiD8wVm!&d?*OIk;&~}o#X%fP^yByYunXyIgxky17%Uum>_CxlD&zf?@*iO_MO=`858>nWFn}TneIJCI&zjY>81~kD?;Wq3; zMecXo3VIpDT0ryJBCU28gO6U;a=EI0zhD@Qq1&7pR1c%rI?t70b+x^l&%O1ndbhxt z<}~t==dfZoECS>ttZlPvZ#6Uf+r%mqd0VA zPJXud0N)e8YpS*^tE=zW_xq?A{tqoWs)p zc!EMvJhjJpt|o{4g@obuHX{Iy@2gTZTy341nPrD3LLk{4AF=@0PN=DXdmc) z6Qz{yvPwk+z;wDYA+>;QI41?x`Sk5&I)-iai5|bl`nby9Vj&n*w!O( zZOt_$ahWqF64a(<@d=}79U%Z<6 zR{ddA4>G0R)0<^zK;S-1wDyuynPXK^q#xEU_;~TG_xEC5+2eZAodlNXE77s! z+mQc$2S)H&+<$gJ4KI?;pQCcm=j|3VP)?; zKX!Z(jCHx?#cqKSgX#bztnS)5J$a`bN?P51`+C0QY{Qs9nrM~_S%*fuPXd`)aHcW{ zuPzK=8K-N}z?%P0`&P#tc927Nbvfl}Z5_&|t>-*IH<9w(+7=M=%$5pivh;JqwGnc{0(n z&1``g?@U~IbHlfdVwukm=jibG=>mwdJS%m?H@qxYpX)!HcwovT+B}<4UK_2fXv3j^ zn16US;i*34aY&>kUa*Ddyr!jm)Ze;0_Q_`GyHB;a0Gh`{c4>Vxc@inYGv>kll07k2 zXYw(s$$&}IGR`k`i-kpYp>MSRW_s7)ZgA+_6nvf0WUukXZ|xG_7woKnHM2Xce#7we zi1^7=@or6;>MCft#aF)-L!ft(ckkBq$A4G9ZvK$V+Xe4?izyqL0rxwrv77?bre3hO zFlL>p&(Yqg0wUp|=8>fIEgCq^rCw$MIvss|ATN#GmIsNLq8;$CwwdsSr7U^gA2c+y zf7JF^D)RIL)12n}!g^bpxA}`Dn|r4A?Hbo&qe;bc@`I!id6x-fTc} zAbFW;!196Q@XkG0#Du2rSq&XFp|?vSdjLAmm^?ScBjw)mNVrdM+fQu{aSQTUd>_vu zPrYP3>AU}0Kq)49z1SiH`PX3N&%Nyg_7~0;gzdtx3GsKILus~FHU~Sbw?HL%kqDJJ zMaGwsZwqF-TK(0+4cZzhU@s+XIYPI&%|G0dMS1Wo)~i7-oXcLxTko#7!kLP-r%GB% z`Gc<{(e(-*mS%naZ5u)00XJig_U7b3TSQ&AmwRY>qZ?{&4@5H~>K!%|E?n8zvwMVg z*z1QxiTb#yo;qcQtY#fq1K#-iR=j9SB|Z znv|y4y6QZfp5MV1ll?={eG(1vo12y9w*EOe;@q>nTr-cVjDRm2PpHWK3@~QD;3j-n ze@9?8l?c_Hq@Y0J21D(Sg%1Y0)5awrVN{vX*3qJRvDL-C&ONibvilqBeedSyNX~Up zi{X+K3?fr9Gj*r83&AP-*IO8NwWqBuzJ&RPg+D*jvMQOrRs4TagZ&}juH1i+9&dbf z+?00Vl10*s<}F>L!cjkF{VM;Pw4i(-|NmN94U=(n*4)mIPJrG8LA6<%B>yIbnX zGLFVs$!y?i2G9>s?Os{Khqm=rWIc^}S$Bbp>Fl=u0O!W(bcQL{L==z}Zb&ZhCAdjy z><@&2)nrXq-vqy-EMm%g>t$8}2;$g>y^8NICqqnU7Y9hp zqp$jOW8mlMO3W^4nFt8Pm-XXQOO>r^X(1z@G%~;-r)Hoc2&n}@jg9{8r#QzmxS-OP z7lu0|17iIp#9G;y2763f=D1@8%(3=BVc)SvchljLbKm+cVXO}4z z%qIqBvY#LPLA#R1I;$YRAy-|FWH}rw@O>IKuV4>*to&5veDG6Kikv^AH zUgIBPKzDktn`R=lYUJ~+1R8H@T^_d)AZ z9~FL6bv~^NU7k7<+B8>-5tT+k)psJ+!NV}&?rn@8wzeM}X#3YTwfYl-+auaH&XQ_HLbDQ(2mI3iyh3i$lums^x@GMZ zyfbg(X4i~G?SMsNEFd@SlK@>ckY_xGsQ;ZP;8p|JD}8yOvNLqMnKZWT9bE5%9JM^Q zaJyb1coHh|wD<70?|01X?7DNqX+0U>6;}>PUUEap#)4#Z%L{-A`(nqRPyhlyr>E0nNp@QP*KjMo_X7vYo z4y@#{BM5pVOV*PnT;k>^%x7EjChYrg^JXLQLp2o_&<(-b-r-2RHLQ_6Jc`=7zqNim zbhq_J-tQ&hA%96TfWiRE(&;4+>1tP>&O28#Xx@2bGzc0=JnMmfiK-Q?K%o}_=6kK1 z+%@?Aafrh;2^uWkPeX`TfJ@Uoi?FHuu!o*R`sJ6V0=lP!c)9_iyP3xJMWl z%SykHAjpQ?;S=(V{a%qC)lG*X*f`jkRG+nKU)m)j(8It3U`jf~@$4HE;x3K#%YnK1 z%~f?#U=YeOqd%i^iluL&ZEquAeE)z`X+T`T4-}!98<2o7AnLm>pZ9Vy-j-{I zaDhH>-m}QgZX9(S!>zGrIN!MhX6an=3b0L&PJ-gQJ0|v9@*hJi5Tc$^3WhQ-`MR7= zeVh>R<3NYwNb~A<^^OGlz5p6cJc+*V;B4%Zh0?$#`V20!=-Q&45bqG_YP?HlkD7%E zX{PYY>&-;vq?z^|fyVg)&u`YqCB3QP?q3pjZzrpV=XxG5Am)=2Zo6ASi_Eh(cRf#c z5cUX%#18X=HBs(!WXNmay!TP0Av(?0D#+A$Cb?aE668aUTr4=Akf#a`P@}S`#ol6D zsM=E?LxiGk=d{{-Msoycpe`;j!bREOL1g+KlR``0~B%&Tx^Nj{E-> zCaqKGps^NKyC46RwidJ%zEY>T3qrAju(aXHA1D{=zc}|Fl`5#Jz9;R(e@2yUUh^Z% zaX$}fLgK9sS*n5rpX|7Offm)mnNvNE@r1Pb=7f zTNK^-Ru>?qUh86~j~9mSpuO<7=Bru!RZJ*y_+cVYo6KepboJ-{PpM zcT96j1F6WUfRT;AHE1)Ve<(X$j`_kBGc_RpoWFhZ0QcQ9(b|*XGcDLezMLj$5GY&( zATQT@srrDzQNoI`dK=|eqL~IUjx)o5j>9Pi8eLr%;hDup83V+4m7H=tHDTK_y>$7+ z6!afuvOvZ~Q;((i>=6=kKO}Ozs_@!8s+5#A1pD`!fI`)P?~s_@G_a_Xk{&%5ix15j zgoCi8cq$)9;?U-lY|wBJ$QxGyXJ4zZI51RpS2w&a(11iPYY|!g9*;&|iYT%lToquh zznIJtr41kCLKZ}gVFYQeD`#=1ZkaE(y9MX7XX`=C)|TaUL5+q z=PMi;m07oI8mrrHqz3|!y>R&BUMgFtwa?6b92ry=c?)v;8|^d1ryF$^^(v30U_Q`h z$x_st8@D34(?_DeX`fMy_FG|PO=}q87jkfEFUTAJBiaDox*wH*8`+MD*_~V{-5=2` zAKG6RMc;fmy?w=_AFF-Cce19?EZ+W*f%@1{_PR;L_eCMYe@;y=5G#D274I8jKHne0 zvZOD_#!9u`YLZX9NI*|dxFK@3_%51CQ{U4g=$2cmGILmI3=m@nhIMUd!BU{mb;L zs^}2(UcVQ!UqvzNADJ^Rgx0JXV|BQBBr}5&0M>4-6e}aAM*g=8%$D9(GL3bUHBz<0 zCSiw1NycC)sX%DF`cD7w1{I~N#HDoGGhprP&kZP`Yu)wP%|j^i$@+Nw-2t>(a=h}J z{!&nr8vqCJ1|3AG_;Hcdxrha4<^^nKC*4MssCi2ZV)a;Oec&6_VK0Io^xW>n3VzGy zB|-cSI;JI~@(@9ocG^pAQqE*jKVp+w(n}Cd)A3!fxf#oK6kBgQdgSNt8NC%(t6gom zQUOB8A-jHI>|u9{?!!A`-ZGm0>X42cbJ|}?H2`~|>Y%pM8u4E`nowW-+M*@^J*8y%A*QBX*MfqYZbxT5Rd?xJ9kaK8dsIaI@zMWhi+#5)K zx8Z^62%RqHbw&iR0{+~lO-QzY^})>GNgLw5a}8v&#fJltQU5VNBuP@ebRz2tHa>Pb z_G^EhuPmi5Rqq74!N%YVaEgmLVLwv!bvbM_OS|BgeIIaO?kmy>%AfOk!RHqNikBNf zejrPKAYydCN0&=6OF76VF?h}M9jw)sKI;MVbgSVHyWoBkx^(gt|IaPDoJB~E7!2M! z@6qd-i2HH)Gs!EV;pUFLlAMXgL%~t()iQ?N*C5eUljco(b9gjk)h$V9@`hbNUz4Z1 zX4@FI`_4RP?89ZI*oM74`$b_csHnN>nIl6aJ4mGYFd&g#tPqxi5Q;R0$N3iXG;g*# zn8V{-1R|DaFz<4-p(VkQTp&Tz>e2nKEW?tPOe$W#CTggcD5~S(a;f;pz9A*}4hm`W9-mfeDTWV2h?-BR&5wp@wOzWGg_at7As9Nwdrr^sL18^$iEaFy{VG1JWgtqE+EtF?(?%7Hv8b<6l|9B=S%j~ z>?_r#OaJn5p4;|LlWHc@(AR~ZsoAUXu8#{@s1WUFsdpVz8`9n!Xev8&JOm}iuwOlk z{*7@}+{YAS?SoTVakrqmX+V^llb?-W1u3wB@`9$u`cIt^MFb)$nHn#4|7`{9cyYRP zZ?SIdFi5{=hLIY}%g`rQ1KkbCUdE3>@?KKKX@o%SG>jtJTYBz{!mGGmT<}IAd+ycc znCI>9N2_VFbQV3DO*|nVblX}!4hL_6S@G!~gW|vXx$sltAu8#M?7o@USCzp`xqT4c2p3>ZX;t=oB5xzsPljGe z-@@p$RKqNj&EKORnwx z(ez~;fTbQY=5;NtRCxwkd{IMGb5w9?KSrEBC`pNasLV;R;DPy;DLA zoiT(=1^`UtiiVbpp##ZI9)di&FkL)rLz_g&y!W{0Zjl0+Iy2iQ)1>4cCh64JeT$7) z3Uv}Le=GYW7KsCav8BLD^p@RuV_3k4srTU;35AQQLgJRq;~I3=l@u5n<>qFx0_G)^-bvE^it8&zqC@1I58oz z!U+nY>=T0#wO3OD8(fl^_7&mr(w5gV91oVVO!Jbls72}8MCk3CcOjj-d2V=;7FiGX zmy!btLHPX|th9{jP4QI{ij6C_7`JKjLy; zbx75~afPP;fk0*?KXlsCIE=vs5wLTt=1rK0|18!KuUgSw%=vxg@G#YU9J?lwmG{Sg zUu*#nM!oe4%89^BvKRW3g96e*L~Oe&1ygO&T6l%)2_&zKg?V5=NoPmSnBk4&sffJ$ zho=W~e*@qk^I0>UuTHM>d=Rfsd#L&uO5__``>?=CTW8!)gT)`{|CC?b=Eoc~UzbR6 zfOz_sCm9NhfF3Tl{Z(aeMFoT&G{+}hx`YexXbtTm$)VTk`@h@vvx}#V*X7CIN~mg- zHcfaL%7psn)$&FFk!mPa(fcFvL=WzHnS_i)acG4z`O-mu{I;hYU0(wt3Si8pSEF}- z>by044Vov(nqSnT7N0Z>m1;G#V7w|*3UsXLNw)PD0^dV%$~a2ZIDNJy7$6+Louz`~ z;Ny-r?6XW-jMvGxwx%7vrsS{yoWh{@4;0euUa!{WQP-C;um(rZEvi;EvrHd|Ez91P z5`Sq}_|pAt2(-yIjgZLnDd+CCy-wGMRDcR>m(&(`n#VV?8FA7oMf6sXmUy%oM*R<uY=sxBcHaVc*$YwZsZpWn z5oCbgTYfx8M3aVfhTPR;=%Z6|x)fboX(`^%R8GUEy*?wkKU zl(?w+zM`wt!cf%J!6K;0kt9GhVqt2)>U1 zaX+}3c%%kB1A6!lpMId+ZU{=J1cJuZdi3tQhl{?PvZ0dug0rh(?WNp$Rju5giuSI^ zk9{4(r9=Mme6j89mpdTVgk6nQ;UiT^E%xrnX}@P?I-R1!cOyEPC@B-xD0@wPdk3=l ziX%MP?uVa$lZb}OVP=H($@P+yf!?QL4{c0&oCDK#TrIimBhU@J=Y5M(OAfN5wnK zOc!}olBi#A(rA03wsGfA*XvsItwp#PR1ZXSENzG^SPdagol`PyDHE@Rev3AqzAKHr zRCa$}Vsc9@R>O!^ICS4q*h)AKAjbXIUKHd^pJ5qGLY}vXz>-_U=uOP987R~HNpSIL z4}gVks9(&?or)?601hj4w?iJk4R#S#0ABxoV?*}~9?UMH64Yp$5pH8cjdlJEJ{G;H zusM&n8KqEJQ6)1oFqE4UeTapo?moFVgRC#o^!ThxblcETOv=Y}U%v6$HjO zAMR^iEn51p`POnO#t%v9e=Ut>*+R+&G^hddeOTDjJ^}}l-Rxt!|3Nq)RBW;P0~OT= z>`^Sf@ee$2$p-TLq(+u=B0UU1nH9L0a2)FOd8I33v8!IbLwsd8eInz7h?l)*OvwFI zUS)GzmdcAada*6t@P{w(#296I*{E)E=0a9u7@6@@)~d1(>F%u4pGk}X@Pfw z^emYyQhVGr!PsL9b?#5hK>#L%<&#){**IW8X*T6qCDYyI5pIY3ueGP%hq@zJ*AhSm z`vIW<7IG6Tni?_7d)j<@a2x73Al~uPp@=s=cw^^6M!?Mz@uFFD;4^qACzl$>E#N}6 ze>;Tcxv;x~199w$!}T8+!IKflC#Ku`F<|;L$)f0ZMm*Q9OS4iDOG*Ly^V{3o&%%pM zgVv6w!inqIl}vPhKp32cr3k#kQnaNeRr_`XOu4k(=f;pGrRh%_DVNU8FDTa(V-lkl z`xG01nZqJ9f+;JwS~R_mPBue0#|2@X-_U8H((ZWHD&%h>r>#{%J9Kv6mg0#W%25i- z96Pp0YKu))6wEMCd>Mya+15Y&O=nQ1sqbXW>kUV?K4`Po`2VP|T5~e!Nu-mcp2Rg6 zPCpCWd-RmO?jx|GD^Hx=%*5XE9}8|aUnP(=?y*SUrNfmMS#TYBe$6<~y1t&d1P|cZ zG{~OxohcQ%BNp*Kn6b7ZVC%Z(8!8DgD6qC(iWDE=AQS>LjM+R@srqI@8)UY{d!S?{ zIx!8YA*ZdqpDrzXv`xjA-4$qYx5drvgOr!2)d(f51OFBN?AHcgj5)7Wci--xG!(31 zqd}%k_v3m?+iMv{s;a&S6oI7D$AuEQ$0KI@AX#WR6gK=YqG4{4-zWWlYN7 zSxE0lTFZJb2R7;)zNBgFA_!hbOU^_Zc?I5ckXNOdr40)JOLC(#aot=)!DX`l8+ zyz8+kC^tPT$4zyPKjl)`&)Aik9aGSU%cqF`KK7dv_hHq_m}Q)-24T1Uoxx_me^Nd{Z!6m%We2-MCqgo zc@2Q1V|mRlqrJlk|NQa9uOgXjlU}O{K+H<(4HYfYuajNacQG}{MHjJ7Ew_~;&9}za zt&K4PEWtOH4-Z@t;c@7+Z$u$$`WEC=M$=FV)DTF0BS4DiHYEgUWI^1x;a^cb@TL_^ z2yzg_L~}*I)IsYlh|ki^-Rh2V@J_P{a^IlMssVkGe043`FAX~YvKU9%3MW=Z{RX9x z+;|*|D2VwI`jX5Md-B#6M;)_B=fU1 z*BzD|+F#OzceQoi_d_o>1FZ{exvClE{Ui9K73L{-!&mXfbQ8n6 zKz@*By$a(7{r7SOH!of&#kDr#+355}b_KM*>S`>;(dK29hx}+}NK~{n_GAV^i`yD;{ai=Nx1IluW+|P03=ipj9q;3b ztk==+zl>-Ojkz1frGN>1x@4ap-LAM%M$Wdf`AYNJ^EZ^?^_JAXjh6@Tl7==&ad|*f z-aa5=OTW~pv|QgOk>2)z0|%m@H1)Pf*G1r8BjYK18V!hou+XDoW>Ny6_q!o_r8E9! zjLQ#vWRg8?kXKj}TW^KYL1*|OWxa<_o7lmcI0=2wAC5p5u)s4*>JkT=wcp~;mAwZ0 z_YQEDnu%w9@M5M=zyIvAR;44pDm9iB%Yy zS5Yw$IjL76y>z9JTP!g0u7#rC`bsmJCiIkWLgUh|SflTEbNZ~7O;}feOR0fVq@Y-D z@UJW!xj6OF7bd3pIAN!V0{p8LAI;Y2)3{2irdo`q2+o}v{E)eLR(UnRBXN-j?r+=; zlAaLtzlV;I|MckK@pIAg{mv75z%Re_q-`l`KT#Yms=Oc1h_a<8q>KqcKKh|yT7D;t zslrHq{miGOzj`Iioly!;)rOe;AJ?l;Y((>!PozNUGeAoWOO+iyY+XKFI&m|T7j!R3 zp;xCq#|m7ha686z3*H_@Eo9x-6x?vrE}G+_U*=ZEB)4F@FG&*dr$paH@exadh+~+UHNT7{BXWVZ10|Z6-k`TD7`lssmV3N&8=x> zB`ow>Ig8}K{4u!`=N028PpJSZ5%5SS@jmIiL1*L13CEr^?g2z1ysg;RRWMsGDy&E6 z;ln;=rCr-LwuWK9$`N2Wo8>(dii7E_>gDFDL)O?1=g1pgXR5rzkzgMRVNt5sW z2|Y-K2BKzVDejgB>EUQ-n4jW@

    d$YSX>P18cvf@h%;0KctG%=bFL0MPxeur3(MS`$>Y$Su;e zCB>n3J6a)TW3R6*8Y#t}v94!|kV{OiC)Rv|Hod+)Xb_> zWy|*JJB1gVy$P7f3UoJb)(qL#+1QnR3c%ydT2z4<#d@hrCVA|7Y@Y?;i0>IJFK>k-q@cgl<5 z1v)`>z(;=<-eIv6lS#eM?FxbY+0Wyz^Z&;Q6e=yE1>CP+^9VS~qFv~`GF+7`Ij`u< zP!;-e)%h@#v*vr6F4)64nJLBaA3e@Qx(cPodEfoN^f=Vjr%Uw91&e?D8X z<+vO1PW-cxfO}sRW@E~wc8Mtm5b|A)SP|3^6EgP3Te4GF9;Q*NTBe_=3tX1Cr{jtZ zaT&4M5cB<^%%4gMY0we2RL~daq3w4c{|A<2%+O#SFeY;!Q(M1xD}Hdg)x%^iAEGy> z5pyL##8M2Pp~jHm_0%uep-kv6zz)k4<00$k8*e>au|q~&xdHSrmqVPn&L?S)0%}8f z^M}*9=Rs~Ngzv+4ge5S#)u1kFFH9Evzro}*7t7GR4Z?@Np!t28d%hms{$?Rv^#Y4J zyOGJfCR42kA;w8_Re|O*jcpg`^iQV*3ngQF=8HKbyW;roeXp0zGOHIl z!fvJozPw7&VNlWR#+|WUOU0Ma6oaAojk+peZE8E)<}p~US%E#KZj$;%K{JRH2ZK+E zaKewu;*wd1`4a89u<aTdT(mZp_E5YYQ4^(aaH~4PD+^tGzIZ21WO~QXk?CGE*Exi(&o+Kl<@AsGnUG(~oWHt;%B^S~-E$VH0&fk1Y_|A> zkDf(6@z%3xoN9#!@w+Z8#^tR?VUWUN7J}}#UbgP#BZ?Jf0}AtQ+mkL<+R}DQ*2@Fz zhtJrzg?fZ0h;R(De4Ix2iOWtJc1@hea;l;iXfvv;UddgZ3Sl2%$7iv3f&DAjPC>$< z6twPifcU!J55XT@&;mY6TbVxFh(^mWtTfwiMAlgV`=%~+Un*51dumbHB>9=3j z6CUP~vOnr$76}F+Xt1x;EpJuH0eA+Jo!C(*&KQbx%qHM`^*`-JNw< zB|FeyBzv&$@*so%qDF>pI_w@17JoY5>}$~hPY^Py2|QboY0D@8tQ0)m6vX~#Gtu6l zZiI2jSq4d%soQgu_*ZaJq68D4_WkBtnVm@QRcA;|aOMkBS_x0m;f8>(N8@fw6SmuG z{CCRJL)m*vo7J4@bz$WM^jBUO?uozfou$ybFfS|%S&9KYjJ4L8DNIs5sEVdKa~^`i zH-lI}8UK>JfM!Us0RB6KG;ZFQ}W)=Iz91K)oWL*E2GPBT|HZ!!Bb!9=5(7N z_)nv0qf>4_^#6|@w~Yy<{oS-I{weYCY}>5bq~zk9*{$b4YFz%|odHs9I5d;bj%M;l z=2C2@b&B}Yf8B%-8oye1Z^qMG5<0E@i!RNg6!LF>viwRdMC|zrW&G2aDrbd6lCL(&Cfmx~Yd7KLb$U#sREqk9SHb7Ep^&)i|27 zXEp&kG(q9&iP2S%_u%wz%Q?;ge3x_5ZRCLXaOHW1YV1gWJ9_5o2jJO3qBKPARf z^^=KK-M|pcLzx#v2C`sf9w+=1!*7DIOxS3QLFzOZ@#|+hkT7D(?49sNk@BTd zY;qB4UQ*e!I-B@0dwd33)!(^j_8;-{pt;J@>M+YI%vG8!|0YOM_x*2V@#AM%gF+(8 zw|05M9`E`0XD$v@1twlz2{Sg#yx%+qY_vjQ;6YqVA_?iuW$J|}jV?5b}-q8YTV70Jn(&dO*T|9W&^j^s;4G2c|&e2wqCfqqvJ_p&d6#>Ce# z3Hwn#m+lS+*4P#~BC-qe9*RkVO?{!Yd+dVh% zkC_P_m0hZ%j!b@fR@uz*mG{jyk`5f8w8(ElJ0*Z1dT z=dkmV*`i5J0q461;gIh%Vu$!Wi zYh9-Z`llDWs}Oi#}tC+EqlFY&4Z{&`^&jtbNxT%L4w4D@HY!%h8@_0iQG zN9{xIr>&I`U0Mj;>HsBz(jjKg>9qg5C)>e=OC7I?m1vMIYK zG;I4`{tQQMk5==5mP!XCG^=km7>dO=+)b?Ys_0)@kJQ(uw*tyZCtvwP9C@re?Aa4J z6}UF-k$jjOl?a(k{VZF}yqb(!;gS?PvZiM@Zoka?m-3*r-Iz7_p~}u6cOXk z3H5#Bq*oz$X+Zr;V*y1u9jafHMuW%OP;E9U^>jh7Ep-q=AcACn+|$i}faZB-Du6r@ zo0zkBo5wor6GCQT*Hd~S9iX40OP&#^y?eQx;1+Cc(-pwm;JV%ZpGNPnswF}4`4lR4 zLi?4Sv)toL)m|lw39&{)*a^!+xRig5cC21hpH#VpaGQAiAR~$* z&TS4IHAvj#wQ%8hJ=%G{%}+oeeXixAnul$M^O*`X(>apmecTcLi9i5bs?9IIu+RtB ziTwtpJ)*uRKXloL%@hxZ-mOUNP(l#klHVQe4~ui%m#WQw3|RH@eT-MXNVkRMwm(*& zmUBkn=vNulmsGMnPS8q|@cI$>txcsa-gf*dSY@QSZnMkM>&mC?WuV2{Q#yAT ztCu1g*|WDIT0iCf^RP7+KDU=~eEsA}c0b(J!w}XGIJqf}INR%H)>r1r;{I<=;UmU3 zl&UL~_?^1q$|`NwDn-1?fnY1r5}Jt@mnPhw7J*s-JH3V2sIG1$xaOZ_v*%j|svL@i z@U9*A@7_MXbu|=)gCaq>O=nvo7Q+y=&o2&f)=g;SfG&l@j=4er*@J}Uj|$&I>b)Hn z!m_MKA-|A-y5-pF5_)AwuN7w3QCN-<^;5#!fbE>I2x7bMapk{^=lnU^iW4rR(A^#TIdA1e zpGYM^%`(2?$J!{_HC%Va2*q5T)$2U$h+)6fDv9*wt5G<&rj1!pN1M=eGl`7;{uIVOg7ZG-;lqT^RJ2i8tp#z!#sA90h)rg z(%||}Ya$V+@Zng_04i!M>aIQGY+;V~NO@8f@kJy?=xY&*`o2Nn1Wox66k#P@r;eB+K8fM{INQ_E3=GtYMc zjEHL0wL&*z5{R~@Lep!L9dk>dv63B&19c>&T1lG-Xn1!?nH!b6L6CFFAsT@U^<`gc zS$Q`57Y=KLi6dzJvgrW&-7J9JQkDE~Mv1|AXynQYY-34WmXNM*m=5gj z^=xjK?VQayHMS$NSUjFEH-ywX9=uawZ$>t>s}5U7;s|MhiHPF{C#wk}RcD>^wgHKZ z9}07vqxkdY;L}n*$S>v~JdKd4pZt*LIx0z=bS=3mg#7gWg7L^?%fFu=mxq!o=>R^xJtWYJ3zW5KUfpSk|bxSHo_c)dO!ae z+TzqKuLQ(Cs1(LOP|Rx`r;{-fofF4<5kTdY`xq`@blrH892RLW&KJUvgy6J*9l!0< zPmAjH^D!G>^f|SoJ3Utfh;}6N#jC~cfXdPO*$e}tbc&aCGJR}^@(*7G8{^jwbwI6r zJ@=;$H1My(0;qkc09#jVE!GmDdKXF(t_-eqfHUXd1WDc>jM zAc3CVn(%DS--q_wgpH^Uz%WXgyM@V^$>1GfkI*c{7GyydsoyeTEH8Lx-POEt1-1(q z+wy=JqGY&Bhdhu&H+w+ZZ=pR~L)p99G_TQrb)7C^yYDTEZ?zdlY$R30XLEK+=X{Zu ztg6jYQkCr_{%|<~f`prudhGSfqHHslVbKAx;DFVCD!zsBBldJb(;Vf(>K0^(Gtq`xK8}{364@t$|8eG+h&=Ppo4}n}30-4n*4ll5 zUs0}BREkz@uNHOko#o61@>{R&TGLQG&#;|ae7ZOfsq*2D-Md+gso&lk4ZQtl(v)19 z*ZEL;)M!8aDPvWcf4?-2(xEO`$Iz&EG zE=|9nupl%}=hz?BkZX>m*t3pDgKhn8h zuoKUJZke$`W6J$QX@9_eR|N&27+7cln%ZQ+lh2JlH)T)6r-BCWC?RO*fs%A0-DA@~ z7fDwiyRTv#b44zq5O;rednofJ>j%<;3<=?3Y&}bEN-XdIoZY{VVM4V|K5yUDgsUp+ zbK*@+?tioM{*y0mc+CN0jfo*$e<6-Vadn<*%I?KEp5UMpWpUbJNox&JlS3tGsVzTZ zrv>myG%st8(@3r>hNu3RG7+ZnHD4uj4R*=Cbi`e$A_XYXxZ{Bs%W3*XDrF4`iZ#+= zH$ir{MGolFKaPqSayRe2jywHHRAf>Q2YZ1`l%}w*+*)lG@80Vcky(PSN@_d_8>_rbO=18C=`hw?k)Ds ztlsDbr+16qZ-vIl`hl6*8ldpv-6h%-{7fyg7Uo4$$xZ8jG0$a@cXy`PRV)rHVqIOr zE@jnfkMwvsxV9xVq4Q4Q7ycpnH{d|;7IkfLkq+};d3GBjW4i(=n@UWzZ&tFy)T=c6 zssg)E>sP~<)#S8|Q4v8_j4`cgWLmoJ%M})OVlkt>=YT1}(7)bfgqOCGJN->_O;ORw z+b6P5yZ_uRu*h|a(3@?2DDw;e?&jE=!nH)eYFxl|@+Tbs)fsJs!Jo8azL@bGD4}*Tot#cK@`RKoDgv^{PyB!{wl^u8hutq|?mX(fInLW0jB^FsY=O5My*; ziIZ+ghd;}9nMw2f?OtE8vc)!UOkRc=d7zjJPF}{*%Q>2XtFY75DV5f7XS1ut+V8E> z9_tqVF6*z#(1OWo5095{tTQn27NG+}Qv$w54Dde4^2DP~WMqSY3&Wc7Uxo87E`u>C z5wM#kg$7cGD$Xv{MoQ{5wPRp7S)q1!2PQ%6E**Th)A6}@UX&@Pc;Vj4VbgDIE~T+6Z8p%fcFgF^$Zy1rDgwG&rQxbD z$(l46Os^Rp=UlLD^XuSnwo@ zxBiTrZ?1G9muHp-W{Gne&iW_=6y0Aor}HNoYOr_qW(pa&1%wF2fqB5fm&a>i7=$W5 zrGCg1ALb%JOZsVXpXymOYh{k!D? z8$#);{lF?g#~mSh!Df+RpfYP&--*`-{^mrHu34Xn@D0wIiMYVp;(S+_Xo;r|;*b0$ zi(2j5lt7H%VpZa+z<}R`qielv`V_G`Vxn-x}=~7``b;U6?)P67VW+rDXk0P|0_o4<5 zo(Qc=oXxv+3GEZVNYYMG44{)d96zas7YPl$Bt6h5tiIu49{T!h9)4L(e~^kN2eh3F z@41fadB4FwUVKC=Ox40UR(Zw&>_y?*54sd=ORo{=2e7$YQ~un!(3ayJuLL5<*r|P? zMLii($jz!8JJQkqt2RlYg&kr?5LI)QJysy6UyQ?&SHT=HJ!5|{gXq*&Mn6)7jY1p! zB6RJ<|AWF&os~A~EzC|28X-06rOcPKx}`!4 zHD&WF#7-MiTNq|hz{2W13WPh2H~*!ZF9cW4zb{YdJllM+SoTNxUWeO&^y)tB-UCUn zhl09qs>I#0{x?x~dTtsUKFsjwta7PPe3KaV3ohxhELJi5UK8xuwbP{1uBuc!cz zVwt`@unXhT%91c}3KyjD7-XP=0y+{NO6@FKey3rrwPYSrprc494=*XQuA&ZZkoG%B zPrH%FNN+qe;FPrJ1S?U+xJkfg(Y^poVFw-4&7qt{DX}R2$I*;r5B#Jzn9sK{F7XKPr;`k zhy7|q%B$1nooTzZ*Yyu+0$_8a76zskPlg24Rv+6c!Vy(1z$O+Wb#sFr{FHIyd#j(7Fv@oS8VeNXUjmZq_9XDy=N#M3|$6;elo>+HLDY8^x0Kl5=6542c~lYr-Vi6m^eKX`|- zZA|pAD>4U%J+Y$W;|W3>T)BQ?(yj>O3J3`|j}k-8jDRytq&AY4JP2%bV-^z^XH^~W z2;=0>E47}usQ<;~{d~{XxAPvyyUE6EFme3P^IU8FR`@~icd*cRhlz*I*3^_|k6D^2 z{-lN&vMZFWM$g$b_#Z zQ6J{pw{u3}MmI*?1a5K8>GmwL2y9#Nby4x2IfSc6N8S%ScyLMhTMH{w9D05~avMg2 z+-#Uq^o8D+hG{htRH|*6IPtDZ?8!q9p50j&kim!<9YmASZv?aSANd?Mc{yDnE(2uJ zIi3~em%bYAOF-N>|FuZ%c~!AU=ev;F&4TG!Zc=7b; zk=l^NgZV#9UYh$p1U*m8k}Y{V-XR)4bq+iNXc@rQsMVMvRXqYwF1q#|nC^?63= zG7CxmM=9ck|Mj}iB<=KG_O~J9vEc7`df{G5^b()Xx}>^I0-0j+z>Q=O$b_XJu>tNs z#UIM_@tTNj)6v27!Sx6WqdBg2>!7e*C#+tbv_8LGSH3!Iieo5sKT)9gm4$HT>416M z^rn~0>&vCdsM|v&UF=k1!D7-WQ(w+-kHP+_-rA?JEQ5zjEv!Xcs|h-Z_1u)I^=XQ< z+`L#*Vry4JtF>i$b_;wq%mQVl3we;Kj_TsTg-b*FZvY0nk^#t-B(MM!utj-QO)8}y z2CY}=NHw1#_%qk;%8ov3?VAcm-W~3JVZJrF+EELnLw;ZX+50TMAroPCnkJpKZuesD zzy6Fh-iK4(+|mr{+r6VvX`TfwtNHJJ+JO9_sw&uz zE|nE|r0nPk8b9LgPAU*B8~gCoCGOU$1l1QN)yyq^{M7flOfjKOEujJKy)NxHSk@X9 zO~&Uimv&HCq>OL~IJ;T`8?eSgeakBdN0or>K+MLD8I z-tg;(2E>P=jgtQj1^s8lHo3z*d(x?kO7=e_F7<3SS-FNFTvt9qek~LIf8j;oMLp~| z8Bz8+k9kzf#{-hkzeccx9|I~=00ZuP9#y>a!&B}>L4Vf+)FfCVdUDu9Gl;`0m+&RU zL_{ci<=9Pj$$6X}SrU*&M$!w&!L}7-Wj&HoQ~DkWW1X230!-Ln_n7bQEirUu(M*t^ zTe!PFx8L3=fatn~(ql82^NUDip*Kg?ZYLDGe|^n0&J;t}b^Q?Yv3+^Fk0k4AoTHl; zSE@Cp@0k+&I6DEU{5dlQam;1h3`@G=V3dQJ*Tq7lJy1@6NYljTi6e-||Sgf&6s3sA%Mq zqL=>e9RE&NSqqCE4)vKeI)golj2zj>C%Cr`Z#VZ7Qy4rd#_x71g<;y``zeNhEqzjZ z@m5B$V@Ub&Qzh_+(Yoq?m0#Z_84BQ&sL+mT+K`Y|D0_)s9_w;e+)P5MkD_Al0FG|< z#Z1(nx2`a~xxq_(h-yufP*W%LB}qsSrJ$+#BF7n!5Py{I17Ye%|nJtG|^B=RoV ziA40a^+2cdq?vA0=ksWt&1sf4jg^MDz8*bo>XZ4N3}B&^iBVlcLT5I$8O^&M{$I4m z6<^OjMyV14T+MQ0lbLWfY-f8MK10#~>RcdL!=r$zdMb5VKRsQGWtMfqgNmGrX1TPW zkiVrs=jCb(L19sXF(UE(KQ20EmG6~i39`*&Ap7%Uw98%|#*MXB##iePtx^)M5qxQY z0HTmn1DVmGTElQqiA&1w$xk<9%SQC|PJ8&NzRqv3#%QT(W7RVoJ6Y8`vfIMctNGk$ zYbyLNdXK+kMuq0e*0=`;JVMo$* zh*x9&1Z7NrXPA^hNF>zXev)tMio=rV%MkXt3VR`hJSSrG6GMa7%7e7%pA644KA}Wy z5_wy1L;Dv|sjvdBmFDeR%WvJYQ#AH%j)>I1eDA#%Eq7DJB_2E8b&>VVGO#edS`mP9 z%)U@IKv835xi3q#J4vy04|Vq+TYK*-p1)@lu(SgtANhSYcJBw1hzxe z1G~n%McqNt8^Dt|3D{=;BoO631kdnUW_hEB%qf!GGC8_lchOcb!g*sYlu?Fwt*g;d zwm~nuNN2S6#!nz4b#kGR9{u>9+*M3K**V3~^w%A$U;89^ojJVMFTdN=-AIxoa+OlpAP0;=%MI=2h z0u(*NPbyxRqK>|%u%-y1bXQi?#Rez`^MaIu!>XgE3Qy-SJ@5x&Ji!9&9tm)QBGG_B zOGw{bJI3@A*Y#XUqc;uuNL1zSVyQ}lI#{>*8k>(I$ts{v8}K$E<+^O9zI0)9b0C0V z+gh-F*oyYz-z=f;thTJb9)ho=VbN8I0U4)VkZLcusSH)PQC_JNL33%or*%+*X`>1^ zv1dxv=(V(WXE*p`_r;?LR`G9&oiwW-Z9aKTajvz($r-lp*#EXmc#o3r^o(l;mPa|n z(VJ)wp40y>Q`jCqck)Rjpx!X(b)SNdq+>Niiii+gKbT9(5E~8MH(SG45)PC35*0-h zL-W-3PSSim((0lcs?@euZbw$$UdK=0OluKtzWm84sEV#D6(FoGxOPn6{hNq7@FzED zh~9+^m>BO@tXB24W)#LjM|=NBBpe+bMWgobzBt&bDN-XWp6m|#tj}UhbLj)IyKzAk zZA~1Rd(md;lEfZ25ZrX%%zr(6^BbKu>}Iw@o(!M^3_&7&_)J!q5}gATSKZwdc~a!o zZbu1Pp064>sXUrjyH5MY5r`95t0EJqJ03OpR~0UX%u=LRmPY?|Y|wc4I}V%CMYfPh zwUYnZYngd{l>PEM-UA|wY(~5y)oa-Y`A#d@E_vo9v#=5wuHh8!jIIw8)I0MK%aXlf z2y&~f*ij0+(D-j%dUI5WNNK&_8gOd!8OmEBOt@IK;^uUs_c?ndyDZ>yR?$E*v`HI_ ziL^d^Za6WBXoBjft(O<7bk+1Sy7Row4Wce z$$o4EXp!*k^qQh+>WgyI)nP{dKy6~bB8Es3p=^A58+(7^WN(4A%6KK;cK~AdKT=n# zMmmy9*>yx?AX*oq&>s2dcUhk;T~pjbemq}U-R4uJoG&nN)8tp~%F?$`tJGi|ex~zL z04?ma^S5d0YheCkCVz8)@B~5HgG6?8>#i<`+UF^;Pxsc7G8=xbSMEpc40;|F)kOFqKXma9^agGBYj`@HTZ9U&nG}cCz4*q?N0%>t=P26id(+yu z0kPlLRv>bkpC*su8eTj9O%^^4YqWPQG8!%sl#@?Bj^@OIV<%N(cz)6~quZ0mAwmF+ z>b?E2&M@h8MZ;$raV2!@@zBU&fxQC%;pj;70r38B*36xlVNXW-k5UmNv^bk|06m&J zl#gLBr#7W!VbKVw89g_59iUYu`{7qXWp2eQ1~HeorUl#uo{$lJ@qZ~3OZDIHn1H>& z6I?v`Zjtf_pT>j3+(*`>@=wLrDTE+sTbQ_! zqv!QuddNs_!c`B#L(cCV<0E2Ehgp!>5jotT&)NGS=6KccvU?fJJ!e5__{k@(UJv2c zdy54Z>F5y7%k1a&_K(!hpQEaO7!H(9)uWi{Bj6{ZBC4Z3M7k?=7ZM^kK8_P{L$~m3 z>?wkXCb{R8>~+SZQ_0524nPVQM-YD(J!2f0ENx`{D*XwAF_Mz*6>;VKSx0O;7^z-ETA5=6(qmjmmOCk6tq4j#x4yShwM z{y^deZV?A9n+IP6UbS=vXL>v@B0IYlNS+zpJlfK99LnRLG%exAH%RKhjN!zq``YY7 zDfXCymo_L};!yN0`d#MT-QA-R}uQuxpM~RfL=Uh?KX1mXJR@@W=F+2p*huczv z-BGXf9k4u39nQXwzZKXN|<3-+e+zxf5?bHwpoy{2^=!KR0)}{^cf8^M#)cB=mWJ#zzUZlbA%nIO-XIH$Q*e%?ZWzpYc=WEM{&S{- zae7{ydt!U$-qOv40a!cZbRDxRk@AFmK>G5)4jO4SW;arh4F7>7)|<6?CjVaTF9(;i zR{Lf0*a*%T`8i-bt@LK?g+pidOm3?E$_NO9exI_q^U92|hiitIa43fL)H+3(-^ieB(_~iCBn1OWI_pP+<8)g$DEJRA1e8 z&t4uGFLY0T#kXJ=;eKy$a}1fQ+y74`99`@vEAB>$YBE7Z8(LNUI#zpp4#)NXdp1@~ zKFQ)~>F}#R3JTDjoNEir5YFJebfun;u3O}V&^zeJGu>^)58YC?{NF^ae8Yc-#Cb&w ztYPL2*U{gf39KHlmBBi$g13OOo)Z>t&(BvMMP+6i zMnc-SG(y>*6@Au`>JsmYSymDbF=Y_BI$SF_o)Q_3_kl%JRk;9!-he?TQ(YNYMyopp zvLrwX!c#zwin2UyF!D z_k{YxtOe`@rr6yw)}4S;{R|#;LD~Inb_Y>q26`?aO@XnB&$J#aN-tpA)?E)24h zx0)@m!7P>5#@oVrmdIKvpT+NI`#RAUI(prSF`^}m%gCt+R}XQz&5;DkZX_F)UuF0 zq5IF(d+gmGu=>#EwBRRtn+5=EM+ZkM4Su8TY3GVp=ZuLC3|1En-7d5lb$>ngs})lD z&QzI*oP72iJ5TM~FIIJ09-`3Q(N1lzB(7epo!HKiI4X&smWRgnS#_U>)KF!GczU)K z37$KYktI6r5p#!3NVuNA-JYKsxc4~A&dnElOc1VbzS0^67w)D(bSq0fIc#*3Qf=jM z{#@PO`E$Wl(P{gTE5tC>bnRbhfH^Z47*H|OiuzGmMs0#cpKvinc-&!TC3Q+Fkhq0) zEZ#g%t_oaM8@ntUejpKzQUg{u``XXd^_GaR_Xb!7{*iE`VcmszOyCh8tUMF>vD@FKluJ-UaC|{&)N9BZ5C;cjz z9PV?bqq;PhgK2$I7++aoPA1t&QzfUxTfW-1S2@$sH4oZJA}^Yp`<<)L9wm?`Y;@T? z^YuUeL4xL|^uy{R_xW7|wE=<5tEFgp%NPL()SvaL%<^NRjy0`(cXpMOJvKnyQ9A9UGjd3qV80rz|c2J7RpwNtj8?m zA2l5>?3W-8cd?nb&+9XzhJMzzW7ExM+-YblenM|qb&ap{kuVaWKQEyEPGRIN^i$Ex zm}vj!gE8HBdY@QE1N0E}P|n<=3@LHW3Wp-iQ4VqbOp_9`3b&860Z6X^j(Po7#D~ly za4&<^LZ!d$XuG$vv{GTyUA>wjsmJpdiEo1RKFL>IPkrZ{W@CY3Pzrsw^FPfBCD>OS zhWMFYU>Qp~W-?4ZL2zc)dhOe5G7@|g!-eB{(hUaT5ZeE#NqK6Dqg_qU%pDi5!>GTh>Pq}auO zUbD{i?JzysZj3gR3E8UszFE;V?@)I|@0Y`DbX`H+hBnzKu6m*JAxE)c22s&usIpDe zU*5t8Z@7#4j1>oZKg~JP5A3`%;uPSNz3D=;z>8#tHQJ&%R>zNXFtohDEbQ zN}OP}gc6eXZ0~69S2+g$Evvamq8ZoQuV(Wr47c|)@$Q! zhmE?}*M~jGwAZ%tw&`NJr>%e(493WEN%{inig^fw)a{ zG)lH5eJoj1bW-1B)BZ1Kp#QP8^+sr20`sE7NZASACC#Q~p$oRFa%VoNZnK{WA3)B+ z^pURpwQ=X16j`G>mbAvo7=COtp9hCLtLW^KQok}PMlT6h{a8h!}H$!I@i9AKM zib`km3Fp>JM=m7(dXkuw_MDfUr~Om+1}`@($#B6E5)Q&B-EO62B6Sh>TTaU`k-Xq% zJa+^|n$h2{EoT*Z!3O}3qh}H`X`P>Bp;x`y9hANDeLJH&cgDxL`76{3B8nd;+6v6% zk6#8$O(FT)0U9S$lG%i*#ptW?N1aNJSEg#o*aX;H&KPB~e7WeRI_3)AsK*rXvKsd; zZNKzwW0&HaU%~^hkTohpDb)AV_iLhHp3rxj+=JSsDFjZfIh>11-hZ-VMLmEG))8le zsdJ+YYoyoSV1guqd!G+fTWf8h$CknAv+_pKw$$ z=OeW*zH>BLV!Kpaf^$xNIVqBJ_Ob_qtFN35vQ+C@khELm4j&dSEo=emE%x$KtIArl zUK=`BJENJM1TO)cS8S`_8D6s{C0+dRoSxaK%A+CZBam{$PO0sCvK6t$#2E4pg(BL= zX|iEu`Q(Nrm1hfB+3Jz-lTqb`hiE8a39Lz1=#wl6JDE61cQ(;>j$Xfn6(#fWsuSrf zP7}~{E~X~qRZ>1rVdLV4ci*Jo4iYL@HLI5nv%_*|MyIus0syCm^!QStl3hW>9T)T3 zeQk7!l_!3Io@7r2m;pr#L;gL7dW37g4jfAHUacM9yKF7Fn*Z~3pZYpvH1(r=-nm&A zfT|F{i|Hs1W$w8M*|e9ZqOsrZXrq+-?&gH69^f8x>=xF|-2efl+Cv&ct;6U}7UF3|?yEcRhe@fs z$>SMJHPW~YTeuR31L0`Wpe_RJ;l67=ZF3k~4<5OdIhy~isac5$5!FcDAAC8$r`uf= z?$~GAQ-V`T=~oQn1Qky?EljR)?7iAi@p0$z-)CheF@Ct2sS%KBlN^jYw`;loDN>Q? zFzOXV%6JE6j@RvLb0~!9EswH$JRi&ALd~ob0IHps&J28f&a7Vre?)PMo!c8%{uRj3 zb^<9vRLWv6FowY&>(8w}rzZ$T146TT9e9Dppyz{`o!V#U>cDy@Bah;CY~}r2Qm@gy z+HtWht2rCcmw<;24k=n%$HAl-ilHl*B%PS+YDC=*a6Cej+t>g zWcRCN-HDh6E9=Yvk^GahnhR_FKHxS{DgRcL>QG7G!ekH!`Xjv>%A6kb9W|5ZkJ8nz zhYS@v1t}nwM+GfbtEogY6#XduQxrDD`7i zH^r8*Lu|F_rj>ZMox#)j@KbyRd{vsQ>9fHc#+RAII(-O#)X-VExJ}0Ooxy#r#}VdXAUTgg_oeN-9lU9i+&muX{fJo8?zov2G_#Ym@wZoNqpr&5N4z|W z^v@a)`W@vbDWlZaf6c*SMs zY_Bbf5FDpS1r=b91Tky0YNzssLsOFh*k_D;HJV}zZ-4613&k@hvauBz!dFkh1%|i# zR#M^X2eK^lB?C=%D+Vi>obgy511KDMgRn)ZsXT-EmYK%d00ND0~vH%_C)8Jxq^9f?WR_L=0!!*rfJg9 zP}&5ceev7U|%t_ zak>FErCF`Zb6s#NtqqTBMHM+Y%%4m$)hQiJKHp{$6r0PKF>(mtUe97$Im@_wJ7x@+ zJgE<$b%a8p z*_kCyA-(3tX-@1FntO%~kmDe-xAfIcMjbdrby$}Ko@Fj=?u=@C@osMtob}duJ~Hp& z?82>>_v(giOJ#P6N{>(l7 zsZBO%=V>V*u#x~EdY@nLtwFgHZudnjFV`Zd8V|)Boc(8+H-u0^NQjsP*DaFIi{2O9 zvnxT&mGptgpE)(d@|S$!hWO zRxCznCPRsx0w3dQ3ISe7r&SS&Cr|)yK|D5`K)d-OjsZDdnN{35d=X1%kt8)BSqOvIOT0=hFf4@EKi{ z5<@Dsc}|qk8z>6kN^P3%X@=%)x3}_UV4qv^TA^q1b!RqtepBF&#NF~(e`x{il%MU1 zASJ|goYP?TJhaA7ZPq6c8ZvTms57mk2fOPrTl>klYvA{9|7 z^`vP)kYq6~NB8#uoB)OT?p``92Kru7+n(Nx^2Q@$4(Q8z2UDi{P|kge(EAqotc=wIyU*McKHEnADUqs=F1KE3AfNBWo)tE|{nnBZ)i0Nxk|uqh&j%q; zke3p|xhyKNAQ5+V4s_SK{vtM)D{QJa`hSOl8U4-I=lM~ZLA;EnHU~9O#xWx&_uhG4 zV-QUydJ*|A+EX@~;O+L~GfcIZj@9oKFjs|{Okdin>~CZFA8^cXVyD<@Mw*cVjO$Lg z{cS9!B=?=Z>dh4Gzi9VOE%t@uBv*V}-RPU+rPCvCw0QTW^Tf_M`Y-e{BWCoh-Civ$ zob+mnnz0zn<)QN;HmcE;Q6Ju(;vO|0h%Vqt;7`kjYgnL?I5!)Zq8H?&i@&%VN$#Z8 z1#FHJAPdrMM)fijswj zQ?&>Fqs+vAxE+097-G}a)JNn)ttr>nDXn1Oz2h_wv@RZkJA}0klRc*K02jE&m5gFf z?U*1wq}t1K)S^r!cmK9xJh2P)M~E^~oFR{Y$y}@~YpoLlrFS~_JHJl#q7Me2-NL=v zDesTT9{5m8{QP2JS#RnCSF`;ee>cAb^+}r#G3Ak9n1v$7QE0ax*s8ha_ZY-NGDdP zI4&}%jn0R@X}gemEY^Vk#` zbP+huw=-xek5jtyB^kh)(uH4df02OmN-a1xwU3;+51`UTKpN#|oQpZWnnuVhusRbm zXU1{w0oBmKSVB4W(fH5;^MAj)Yotmkl?A+kzFe8Ri%f=}$)m^ToF=F=PLu4)d_S!O zw+4T;;njCo_L#j`08bU0S@;&XIG4TNsBW%p-P}(+Z7C>Tz@B2u5(Ikej_u`a;(F_J zHBa2B+oBC_)J4kO>YuuS>r9*SkcBl$Lz1zO(shF!{~Kp`i4yvsEVIpR8{Ye@?WWy} z#jXq8eNs0;Xit62a4RjIumE+Ze&*geHIv@3z1d`|kp)&Ri&fa7QF z7~#Ff-DdJsDLX!OLl~t`AH>+uPnO}U^BlySJE@)#KVN#DR8?7-}pX0kgGFcAQe?^aqp7NUfghiUIzEYZt z{!lUu5MlU!zVQ6TXNW&ljG_nx9F9ds#i-JE9Jdj}$#z^v2=maZ6otI_=^WSpwKCYg zmO=)6FzlQNqL{7=q05Q#?R^QdKG&36qBzy>5V)3vRKdmG9XcivRkXM&HLhiF^q{!u zdqho!R*P|@=WyX>vf*5%rA&y;SVOO-I> zx4qr(FY!1vQTN2r%3*zE3}jgHxIN#W+CL$mg;I?0^5wSfPI+ne9uCpGtWwR$5wW)n z^0fE_H{BzGx#0ldy||rk{0pji?J%u+q+1LT5}3eXBOK8@1|(lnUm)-8+v;h@Dy-Cp zC7v3kMTU!Bp8E+Ha)G>59VBWTcrJ%2F)vK_)=(nN=$~?GD!{0tqouU zcZVLTqO2BRSP?%{Lx|iu2Jx5!UhhjeCyBjntdL7L2;qJHG6&{Ruf_@pRKj0CyYy2n zby)G&)?+OnY~z!RM3H&&$v+VC-2w;}Ovma$hoN6VP@AY#I%ke*wXcWeOk4fWNsCX4 znTEkn~tq_@P30O=tT+sUvVZmAAkw2RSH~K zm#i9!5hy`?j-wbuAUe0F|-(=8-^O(+jGv=FJ&a@GE3d&~#Xts4|@ zD*=yv$v{0c`#amG;leYtT=`d4^uMF?sHpuCQm#4HR?U%wLqM^Yl$}FoBEhvsv?=?mq`~oVbJdad|OTd zL#eDuxp&sgC@sTo*_f zhq@t;b;!G)Pq+{-^nYnc%NYCTc;XX|`bchBs~(;tsm;(Fp04G5)J!}b6T{DZ%+dHP zz%&Mr&-u;ExQE(x2x2&Qf4YR2eF0(VQM)tCHDf&Ne4{pzenF2oCo;Zzb5$dSuIWz^ z3co0BXlOe~!IyTyzM}yt$+`40T{KVhw?#*p_KkbUb`GCKl|?xq8&y3V^n4~83F@~a zL@KJi@yt_`A!^-hw zqW<>52?QMENh&NW4xGWJwGc2e)Mn6U-gX{AwG7y$n#FducvtR6&j8X_jPT-l)lQ#c z_bK{$Ibd!Je%u4MsDu5n#B$@{-;h$XiF-rsK^Zj+v;2)@A>ZFk2P1_d`8^lqQnY;* zT!3FGnKXiJ|r0`_Ap)luj$dAQp}{b+FtfzN;Xa_6jo? zz#V&h;Z})oyU|QFX5=q63=kFr!@K!M7qdStbbt4@{L#1b`&It|j~<^bES32hvuzA- zGpPCF<>b!#zQ>TC$yt+QQ%1Veh|)#I(VfAKf?YD%OMHWt_EyX^B~Iyi^#;N1!HSP$ zpbT;2eq40cj2ReGmF>c-TM&(Md3Fxh;C3cxDc=9g3+gQrD>RacNCPQMm&4YX&;Q5` zeg7jj__Qw$#Sd*D|Kr2`*V%CRIV$_Ean?bC+RTypG)nP*BS9D?-|L7C@hgK!zjaLb zrSy`X+%Ji}59hwbz2SEp52qT^gc&J#=R5l^K)A2F3nux4du$VahQ?N!(6w}HjJ)YY zGN+ghMgFV(?PNou6f&=GDpievz-cWGbN|~Q*P)Z}Ok=KM5ajL{SwGR#`aEcxcy z%t>W~!00JGed=;_zf+iv0D>attbpE$@JoM_^n#Jd;;V>`6FmK!@q!*1q*|!Q@R)aOG}?INxvT?V=)1)9ER&Em?7i)Ijjf*u z_~+COCz~%0L4qx9Pb6a+0N!jxNF%p2cHKnkk6jR>$|*vvv$d2&Otnp>=;QLmDly{7 znJ`ItlONk?LqlmR+9b*YT4xPfidm}`T3IsrcoOoAiTuNegPHA(4bgSC0^Ya}!VV*D z=j1-KnOIi(FF8zl*`2G5ix~>2`ubdAra$3q*MnHcn0*kM(UAxj_>qZdRU7EFEa|vB zN)PmQdC`x6SP2CSo)Z%L@FYXxHB%Hx7upWORp>enMhD1cI zKE}aL#oK`h2|Thii6yJX%25v#pB|-TFwoxPaTc3ah46N=B{K_P1U#sRmxbqD{5>@yZ<-2py%tQx&zaEcY zc5q9$n7~|~bMag-i1TAtiqYP9d4@$%peY%}XbXy4TKrf^g<)c--}Xl=aje8mcWBaT z)LJX3@q^2>7MpZ-_VLwnZmp0?z--8{F@AD(Nz2zetkgFTTjkEd#|aVEMZX<@0QbPw z;cIYo`C;Jx$@WhbRkH)goNY$xWNo{hl#e6fX>GQ_mbM(N2YBZ0q>S>TRXWncmFT?x z{e(-g0a(MrhW4c@UMeYFvQjW7IKT9$Sj@$DB%3jv3@mOjm259-^&<+fcfq;*C*V}R z1AhCE*(M&?lK1-%C%_j#r%oVB_Pt_!F=9DObOY@9P4WD@W}5W(h$sdBUsp;Qx4>(~ z*uLZEFW)|v!R5F97x^7GU*+|x`*e5@4sku!%V$Y1MrPet?&bFq;!b>pWKSW2^)4Xv?QD%$}3K$0ElIrf+jD?hX1&*q<#wcn(gEyrJ$lL>t@z9QVs z?gvec@gi})4?MG0;tfu)N^_CJ8H}63lhF$z&BUpUn`DONn|uW*UHx9qS9KgI%wTy% z?@K+a5olvmTrY1NECPBPMF30pK@CM@-$lLM<$WuY1P5Qw<#-}6;QLcQdjOU*a%xs z;t}ESKQ-$8frP8wcPGDe4=F&kePmwy=D#oFDbm!uWkk35fF7Ebtj5nwT@ATmEq z9poRtxjJHL9^F3sURtYVhcct8cpZ2dA>=yvx(V$#*Rt;NMT+UXh`YgPhy z3Acm&3!+2Tz{8k}H$1?_?Gyu;6HAntRzmfWdf(!z1WUZpfE^bbOGnjyzWFSGaa-Z~ z0x$*qHT$6;OiUh-xC~J7=Yw>s?gRgjk8Sly>zO+M5jaIP?Tr`NK8j+}6n@w&9}0QZ ztw;ooYH{|vv5NAcW-JmX_$PR)>k@?O9ACy}`4V@XVuv%gcn*XV<>&(ijI*$}pd#|g zPB1=%jWpxfiWRL8OgYo=v9xx-*R5e|kR=dsVLmF=8*EP>l8B*hnY>B0v;ul;h%kfL zQa1h(LFIdm_Bp~meo+B6V>dZE&MY9NJOnCC>q=W20Q259v#mF%jlF%w6e~P8Vs-O{ zdIyg?RmP)pFj>*M_SVCGRf@-%PYi_Jr$}U!w=6aM{LymFveixx15wh5e-;F`fcfUUE!=TN zJi0u9qQ#3AY3Orab?xeH|3a#{7gO9>n*{+ey--z@G`yMUGvz`F!-6@nNa$!@^I4mW zbq?A{!v@LpfSWM90ENprQOf`h!$cLCM4{(<+_YFzK62kX^Rt+L?XV`j6znDQbZtt} zIUbJol?n;c1Z_y;0v`c&?IJx>kLDkLds6$R{ne}E;xtd3_dBFTPiNU)umGw)c0LUn z*p6oa&5IEX@23Oa-jG$AT{R)?y zC0zJqtm5bB4PcCtfz4^Y&{%t(DCIiMcWpkP?qsezsXu&^Gl4HTFIPghG?S>lOl`wZDeAoExd zAIr4%oc<;MLgQuvV;L8dSIOHc0Vg9$V*XszJ7c2K3A89@^4X&|y+eS=O9L;ypf9q%3$g%PboMH`Z#~rClzHcNqXO@ z$;XH5M3DRui6Cj7sJ}mzsR&Dmu=E0di%_z-1*;wfr>b;x(a-*3@iUL$nG0pE3Tx_2 zI)|ox_tQREIH^Hy_kRW0TetfTC>d#V2^>6y@) z*-s#s2N1o_)lj}3XdiwoL^a}N$SG~;C@)e5k$%@vYNPT`Wb3Ogtw*l`Ws#s%bDJ?` zkrIMvf$$$a5ds_gg%#PsrT)aBqQ2^>GrzlZp$WeOOx5xAtDBE?W(CP$F$%Hh)JkD_zyMP1snY4I zHCZ|OU@@}NQ$yGXISP}}=^N0KU@BqBT^5;;R{aWWT5L)4M>=QNd9^l%pzf-y-J^8{+6VpE#iwgLr6-3OBc{a%9SDriQf3~HZLP?y%-%=dn7z-E zI<*<~a`47`LqNO`Ay&xUB`=+JrZN$Fwu?_LN7aY@1G^OvyK6(Vqp#2cGW5rjLQc6! zu;9T!SI@qUbYSz~aEyu})7tK+6e!I-<3-YeT)@Kl9C_g%MkiF#=0upU-2_?1_9su` zWE`4-3T1N(JDDc|IVua}!`jDEkdm!X0Vsv->!<8KK)fkrF!0rUcs4^A<(B!8u zPIa7xo9k}jdepW5%BjEp9om3k%yIEGyjnAn>wG}|I_jQK+3t%I5el?Vp1EKE=qMr5 z(S&B#%A#bIdRw{LjBo!Mzm)LOVq{N^BEENcNo!$#o&PTvFW%nIqznLI5?OX%-)?8i z4OBV_tOtQ4bFfXk;>59zt6JV~B}iL!vaVxOH0DZJxlc0Dn$rUECY@;e0c0z6Yj+)k z+(D6e!UgixtY9aK96yI~DRnJ``usrC6&}+q-fCxgwax7JVe?pv{!bmJuR09+I=zTq@WRBB z8MC25j?#>}UJ3d_^shkI^8~Y7Y0{1Y{&W3qKd-T!e;I)K9lPWzVq&96xxIc}eeJvL z-k!|7KHskDK+TS88Mps7@1^#uz{*lhcrivqunPKy;~n&7i{*?mYf%r-x#3i8v^_2{ zdbuqi9nx%10*i6!`qb-BSrn@UB(IaRfQ;d;{FCoV#(hPa6)DNcn(AW3bw(teabiox zPvE>08?YM-hBRbfDfnvyk~dKS0k<)&w}Z=_Ucw)#M{0T`vUrdN-aT*_Njq(pDph5~ z$Mu1LKWXbC9e1+U8IbM7~>5v2w5s_l022emmdanrqZ$YIC2pAwJNRi&9g&<0= z(mM(Si1biGAn?WedERrrA7{REew@FV%r%+J?0xOM*4k@XCtr1G_<&t?vU^+n4{VjI zod8>PDJ-AXFkgT~wyrc(?|=4c9Rmz;B9LI*b>G5dmwcyyHQ%Cyt%eVtMNF|ok#7yd z;dP`hCFuHP-$ru(i5&Iqbp2R^G=20aw+xvrt*rDmy7{(}p(us^p|S@AD1e{ zM8SWD4MY$p<%tw!jH8{}JRPCXR4`c+T^(E{pLN#@9~W=Gbz>4e#jZv@vtD2Bof9<=x)KJ!0Na?pg?e?y z=Y|O^R_vVx@Hlt3h6l6NIn74yDZ5Q*(Bo;W6a!B_hnT#?+dYujeNpS#tqub{B5>Y3 ztrY}Kl79a{nYKOc0K7M@xZru$BJ6UQHi*m4OK4H}Wa`)$=OttVh~mi7hP424*F$} z{Y6LZLwrQqD1M)Nn(ZI<&3-3L?2h7MLoOcn*VtN!wl;h0QUoTvf@SGyDJf9ab=HUW z5AtxT<=Zr0pc2rhSGBhfU>?@IqkkG@%f7aC4`|%RWMc0k6)E)KbV}Pk(-NaL(>4}= zQzUQ;eHU1``HLJDh55(L`Xs%xEui{mF(Qwkp&9>@#yFYO#`XHwSF}Gkj@hbT*0aC} z=(R|Rgsn>UkrcxLXuI!RC63uhc|;~C&O9Cb+Wwt4@@Qxj-ni# ziwJLQk7D|$cX0zINB2&mP{&RUias6B4h%z%9ziF*f}z6_YmzUcLIAr@B3$yfJHFo) zw6nFY%R(rGg`9!7heJ(?vuM_AK;wsHZJhEHS_LX&bw^Z$#Sm`T+ zv7e?_VGKiCjxgsawZ4!_Tg_7k#T@RhixO19?iUufPbb<7ewPnDOANxFS3m==6Wh7# zv1HzR6lRUo$1^|VfL-E!p<#Z1%jOW?QLyGsr2en1@Th{BusmL3CjcH(6v@>d|l`!uH* zIQZvg5_eNCy0y%V`n(!jH?#6nXjEf%N8g@zMLSjJx;}*Z$>_qN%;9S#JA94x#|K`K z9#3ZU#GNXP66o>6PTQZjV5}FT`zjJNEr>-rURD*2X1Lsy7E6bcWYyj=r)PhAg*oGp z*&*omyK($CDsDI6($146=aVN><6H}S3l-iA6pa&8wx+bUprYPXNIl30cl1qav6pM! z!G@d=?W%M?C8xrU2*sg+E`y~&0_ntA!L&P_xEw@Yb4(( zUwtOt{*^ zxv!u`_-<2!F3hJ&|8(dbpdl?%gprBK6GX^M_OURA_(Q+G`B@zB^XQ_au&@daU*LA! z%+9)4?-h0qq)&kUQB<9hJENivS1<;sm20-Qh`R=u_cy z`I;Jy-*B3YcQG%CFSM=__>ch5mS_bavz+=T2_3MH4Dv6~M>jio75b(*jku6{EamzS z*8Q65_l)*3tG=a0?F6)~&S)Chu4)Cr#@7ynrkdOJBw+O0Ip+2<}n) ztzr%OJ{Q3ydM!OqKIQW3Vzdj|R;6bQ;48LHQ-4Ubk{qjA^J5LN~Z!1a-aSFB?8@rc#CSA4d76D*;4zjjv z(YvwNFsd0?{XQYyGG@zyHn8si^Kt?{fSLRJuD7Ukw0;(m`E2#0%lwS~mDH0LT^Q4gftg<1EpG?9i^;~yc=WQ04zKGz-BD#<0j8$0tg#n{Jx8}TOHLd zGPyzlTi1&pe;At%v_B?KKwd+z$wzoo$4<4;G~Evxn~OEX`J_r+NRxBt@P5T{O3+e| zFnNLqCwd=>I)w$mDsLxCDX*nRFGW`lJ5oO75HPd|pKUhy&P)&&Vss`WM5<3h;S^iago5=M9M{8{T=iC=1BIeBO&dm9IF2K-_oiS<9a44iyi*R1@g5;XddhOB( zVo4O=a-hX9cpWNP-30QfnZakpL`(_fJ)`Rsx>UdvE*p#`m&OkNa1$3|M3EVY$;tEQIZF;XPzg3pubWeu>oug>>2I1&l#8Df!TKU0B9@! zjd?_o8c4~Ni7ipNroRyoR`8?a&gnnG)K|LjoKC;>fQ@`DypUgv5GCKpD)aRQCR%6| zG8cn6x(+H|#!6SUnAF>yv1Igxda4&|mQ4NR0py8@Vgm;2p|Svm=fCR<0VbPWPrJ`k zCwPQ_8A#8LOI2yrQ}2enUUz$tn1e6-8Gp~Nu9~m5_+!Z@C>hbt+@8fycL|4n4yL&O z)RTCGd0Vs`RrJ%%<)Hg`0Gk#9b%6zF5TDv-T*(1}ZQ_ZjGaK_EssZ2Sbv3g`{XW$E$0@;z)W^HY`#+4V{yQ~Dr zEgxP;CgYc`Qf9IT*U_^Cg)eWdT5IHXG*iQy4zPWNH0B*a zNb5WF*G7>h#nIA_Y6{-~uPK-EdUX@IQuJqVA>Ar1_xW7}cw!iI$8l36fWPoywJJcR zadB>oe6Xx%oy4v>68!vTe_ldmZ%2^EklQGfS`53@D%q-a&9iS=EE^~X29^O^Oti`0x z6g(ZC6JWu+8~Oso*;DW)`4npns&DOWq88|@Lf|pc?KtQCj}5MqO|Cx`<#r?VlR>vH zKr0)ecdwu-a;%KEcii{w2I#))M|w%x?m?Ma45;hSEA{mHQXpZx5fYdO(=v%r6_EK@ z3gFcG3Fa^sU2j>%b@L1#Bih>IN75z4@z+zQ$9DY9oZ|XME;l=RMX27$oIH4@y7o0a z-C1x60PI-jq4-WpQXlEMPf6Ec&jkpMN(Xls>DoOQ70Q*vJ>N62m>AALz|xmX6s(*POPwkZ!d>4) z=-wNN4AYke#I~Kuq~8jHX96?|zFRUQIH30q&3DSl#p#M-R5;!PnUq>6sdj;V^INb! zGZk=0r4Lqu-Yw7tTL*hoW!1&#&K{)sL3v7bxo66js}#~G^BO4Gq}mzk6Bq99OY#5# zfXK1kH|3zr>sk1DyDfgB@OUz}*cUu?gbjEKuK(@TH1o0u-@y!)N8xH~)QZfG^ zG^+{LW^Gfadzs{aF_``~YHfF;jkpa@CjIJ2PShg?dOvtINp8D}GKrbpl%^V0XFmOv zC8IDBWo9E(yR3W@2E4zmnkxrI59UN)N^m*4d-JGLr=;_ppy{oW!Pn^V)Bf$s*K~oT z)2ep*OceUU*V-Ftbsc@$gsI~Wa_@WBT4U4&T&N@6n+HzhJnDERlF1S{SbUZCCsw^~ z9ZV53J}1AVfUaVC&iH9t5P$Q;SsCC{NuGVf1^B*_fCv7RTj0y9XO2<_Gc53yPh0T4 z;1EzLy>26KH|tnj%~jEwa>ycZy%g?95P1P0J%(U@@$7~4&{jp^j=d6lQ!aV*&2h1# zzshiQ8x@c@s?&sAypOI5D16nk`_X9j-z9UI^gpl^1S=oW1{fN!VkccI+xg#MsT}61 zjoIPtFn3oesmYckdiV$TT*CB)xD8cpAPEzI!PGR-)~Z}0*`Nl~E|;V~>H#!Dv3_(@ z21WmQJjMUiX=NN4$|{MGDHY2!P*V6yBke|{TDXC@fq`KuAn$U1#^Y)8HCeX+eI)A^ z^Ay`=WBrt?%fCfbN(aJfrULcZwrPC|Gp@3>-`Cdf%r!duyWD2PP5a(1rJ6w0(NbWp9GA6y^y|6`j!uAnlmyyV{U>^r$v{O=boq@*s z5gxgsq__te6TSrvwi;wDfw}dSrm90|->p)gT6-!g-vTf-KLrLYaa&0x2L`n18spY_ zLOZF28dq*j8X#_IwlRHP;Y9!%-p*7mRX1apmU^5P&TO{na_?1@pj;Y_!)7o*gaG)$ zLh9}Ew~TpHZ@u#|R-lLRIM})*RsEPUuZug{H(G1_`Yk~Is7jAZ?m1Kxc@v20i8QMyrWVX;jG)pduJT5(0)OyCeczLaQM8Qa3&)*&O*2=6nF+?~GA3-llXF7#v_OJEV?|c?t%lWt z_W142O}#(w72{~j=i>Zme#IpkzH66jSf-J!w;Yd5LaH<*{+u9@hc`_~pyvmb9?zx+ zSu_9yt5!zXg4Jc;>gsrguc;Qp?*^&uI4o>rwZ?blzQu^n8mMF1HL>vqHNVi)?kvDw zY)v$9=@6h;_p8Rv%SwqJ;XG63M~g{Mgj1KTO8_#2$h3)jTq`Bzdkm|mEi2mQ9@y4{ z$2XXxlJ8dCM>{OmIC^(>NSFu%hTFSh?PnTyKFiCRVNNVbu7xhbzGENHQ--Ry^hFv% zb%Q15xnpM~57~oQ6-bb$klmkcNOXnI;=pit*X}+r&-NqlknR9VsP!ov;3LbSa4t0;m?{Wb z2zvy28TPDr!DsTemaLXtD!_H0={39Y(&L1%*p0x^`n_tJZpe=AZl`}u--~xpT7GVZ zIYV$*IH<4uw>a))vRYWXYulUlx$0p3OYSTDH(KA{1&12o8NwP4oo-Fb)~x5%lwZpUWqYm-JX7vi>I*2x(b62i?oa%LM*;4kM|N@@Q)mA< zoj?Cdh(&EtDTc`5_1fSpw=e?Az;Qb}hS1(!+A;`hy(b%{YKw7!{<7str4!ePr4@kVoM^s z?VnHG9_VOFUP@W?pZFL8kbr@?=~3JG$Z;=f4S|Q?xg(^?Bz@M>Qx8b>QY5ZI~idICa)R=->ezm05>UfX-3R!({Qx!7 zu$2kSE8rDA=J+2z^DjZ+qG)rX0Prc`B9!XxeRpw5nC0r6E5AMs+tp2SK{L_88c{-~3f0*7_LF{+Ce0k_FBRNea)Vow2nCFqKK(UyIY1ZK&>s^`#>S!Ky^NbSKuLA>dN`)L3MthL zn_>J%^XLp01XWkamLDnc6KD4;UbAiZvmhXjUBk{1Vu6vVX?z%C@J=;FspF%p*+O~2 z*u)P}VgxpXlGUh?@JJYu?(?RJ&*ZfpzA z>zq{OLKY+vHf9d^Xz{aG<#B&+fn((wcYc0IqBlR)*rvLPMU(cgMySA_;p}#n4{d{` z`*02K&ZktjGiIYn4^B)PA6bhk&Kd<<8yX~4 zyjV%^Jz&T@O}HG1bBnKvI-Y=~E_W~ih*?vLfDoGO{b+Q4x1TdEl7o_UwOM{AA#J9H zH#5~OZak$(ZL%}~K$7%=i&eiLaEX19Ha*FRP>PA71-+bDZt=frL^S|p<7-|Q65opR zN6PV;O1;R6P5NCmvGz5kHSJaRpPr?gADqU|r7j)03O@hK4z384j#liKj+(M55ScSw zcY%D>L2&X9|idBMS=E8y`8f|g~0Wn%%vUs z07#fc*iM)~1#p`&)Xp#!T5BS9a?>et1hhnB=E@3!T810Ynf7})(x5I zdG#+?xST#>8tY>6r5QRcZ^h_j%a;4^@x|TD>?%^(8WLBHQ$5qpjmLNGfYw=G4@7zm z_}N{AfKq@@F%PK*Caw%oT*nz~B%!#t(}u8vg#i}&k?g6bmvNbLBIPS0j}gi~$9rjh zkJIP0An~E=C?)0c&^{{hz{W1Y$A_5e@VK5T@^%Vez~JxEWebqOd{>)O5e!uP^JShd zJ%IU3q-HRD{p&pGsMi++u`|7FGqeY?Q{}yboLv#QEiNrr0~=bez|mG;Kx$qx-Y(D< zQM*a)QS#P`y$$mtQg6^$yZ=0r+NY{v+`|s#@M;=IAwtcdLkNEZf*w z#!F2cGD;>U^#~a=QhC2{!c__N)9t#Pk#zP%zZJZ>>p0(UM-m(W;wljRabaNH|~H3ivf;_!+A z>LcOHVhY6%>0*c_3v2Th$~)B%fwIPc79=FmLi*j4^`|Lzj1eXCa_yzAQ-VXcAjC7C zbzgg_fo|~!k9|vOzkj_-9NWx-(3Y*@yI;CKlE%*Rt>1Ck8K~+BDrlgE*A5Ciohff) zAHYTWSR(9^T`tvL#|V_)y)WzzA7EaYdp^sfosI;Z7Btwucl%D9PvF0M*^`3e!$Oq3 zyz+_z@^GLk7=rv2`Zy3`AvjHTkoBkUV?Me6_W=19Ec|~PAWhx|gr^~LC)I(S8GDtv z!*^@-phW?H^wAQmk`HbG?m~Ok2zFIlUE)mHUc))iTtev^kF$k50FAZELDC~907LUv zFn;sZ`RoUM6^V?e7>j6xL>CEv4BUMnsS53WDwu&L*Rc8RRONMhei)a)^8#S=B<*}& z{qCM{mV@RWGev^4=C*|!m!&amFI~8xR$Ri-FytZ;qxG7Dr||66e(Bt z+zqO^WIql_h&#|h(xo7b$KZJUZ_eA-A=D?QZ3bA@;(27x+vp)6ujdvU@Rz(UtBED| z1t`NowwMca#09f3D6$zD6}wbL=$F$^E7!R{PiMQusbi)I-VUEj6CZsrwbZdNF3|0l6#`-X;RXJ~-O z2Pp?grAYiwek{X)-IcoZvho2FiW62CXuYs&#*Z2^S4hXa3cjH(i5hjQd&CP!f~jnz zkn^57TH}ji&Nr*KHO5Gd2jWhSPV&)34apb@&38%1l`?ZvfMc&|>HO zC|g8v`_m~iUEwwhernPh)AdnZbkWhpc>Ms418Cfv9wBgc(hoTcp6621#q`@hC1<{u z4=DhSv9JD*?Gugx=17h#P1Fy4ZVd&gHaFoK=6Z^QMXK%?U+h&}Q1H8`))Bft!(yYY zX;5dGwC4AX;9UJ6R-0-Y%}fEnNwk}5NoXL|fZIGETh{YJ+YXmMU;Ur1Cl;rRz|3>6 zniN*wG*J~C8sSv1$OE_dH%ouL9=@~~{DEf0(4qvXDYtsX_R?h!~KvqOA@8BxrhL)XK|RL}$ng z_x%8*^>K&Z!AE4vy|y0PNSI&Ipr!4>4M9?8mQ#R&chO)~u(b%uzGRIoO1hl9{Xa`4 z9kba9`oDw$QRHF`>R7O<26JZ2p1CpZ&F9z_(^Zzt;#XSXqF#!C6tb=CMN`GKw=Lqv zxvL{*CC@`|1zR!G$Ki{#-i;$ePQ#^CZ}cjD)n2{;XhG*=+3vIZi@8ukrNl5L>T+}O zZ%pULAMLgFF4QX3j5==%(;Gp`5aF1Eo*1^|q8NGeR=&qVL}|$JhTNQ?sxjy#OSGZ- z;?Th4%wDy?T?W2(%OsCYc}RUBGYe1UV{7$R5dhMrtlBKb;$@T;{7aHDPV$eh2ip0N zV<>JH#CKK*g!x$MbR;e0cYa00#I=}OheF;NWOL% zz+8YA$N_Ywe1~zu^PaX+BIVKaIV&Sn=YxWxV_bExA-C>i_ zW90*<*g{Y9oZ#j4pT9X*czfO@M}Y>bU1*xApO7>*Bex z>NL79X>2|sz0aT2v~}THC~o@+fwTV7?awj+z_?WPp+Td%B?y&k;dJ}w7+?5aS?us} zg1&o)e`$CCOrT$ymN8U@R?T&RnjJ-pZ28=aVt?GuWcrBLNZzM$@QqC3)Uk|<8Vlcy zx$|)|7rJ!2l$Zne{)}AQVi@Yk%X$Fr@2{D+`V|2W>Wn&|uPnw#9vr>(Zl5!K^Y zzjGB{?ZwUmR1y{rqS*H8H0!n^KD41&Zt^FOu-nNvs-snnAXVR@;BxQFh>C9v-=$uS zEm0%#+g_TVJ-Q}sQQFbMbY^FEs?EZwP)hC;g1qy@^;(E%b!DsaHPVNrl{~f^zq{at zitR$q8@Mtgm)v~c^~~O*-`^Vb6in)uOE`N5S=2WhDX~5cJ=1DYXTUYzXGL@CI--{9 z6`~H*6xtTP@f`oEr}6$aQkY*eqMXOJDtAAUyLG$1>c+v~`8-?Y;Avu?Kx`qyL>X`D z{L(;!hgwO7SAtiptw9EANrW8jrQYu+^KiWH~pDNgne{G3yvOZs12&7t!cJZR6Ty307Yfuc^ zx7m-M36V@*mrO!Lom6qTV9yVeE26d@88F_1#Rgcu6RqafU5imsr%6ArUx1+^7@$Su z=%SaC;Nj*kW8z3KZkMiR9Nnh){QXHYRPGxg3D}+**y7tpAbGC%Y!|lps<1DPS$T!;GFKB9hO&C z>zSZ;s+56e@0umu90~Fl_!i>4IJVw~gG`3Wu&FrJbTMBh*9Rh%n2`Q<+K5(lznOas zIp`y5aXROsugh&!r-;n9NUNR0#ndMb!;l{I>r*di#Ihz;swI#uF^gftZiK}}R#tWx zaW?(=Xv2m6Q>DhdV{+u|0H&HKk?}XAFFctgryd@&{SKP1A%1^i9`~fXVBi9}ikL&CJ3F|6*+5cSB%~F$E@#t9#_cyuwASFsYv#I* z+(@=|R&Unl33`Iw+Pq+xq`Z4~Yfl~Q4-ejIl|yAgjCeE_nf_t-+hjcl3!$V?4jAmy z&^<^R0NdyT0tG@`mJ0|aHXMzjPIT8JyaE@K@l&z3vG|fLt-#@MK%^&iBjxxZVzmNS zF#f>qLPFJ2e5~bVCHxn32}c(MoW^QZUQ-A10x(t^oKzLy2v64H^{}0rg6Q8uP3}|d z%auiph~4NkZ(HYW_DrV9(w6JrVrQZtKo8I7gX$+f1^34pM(%iuDdgH^WP-a=%|+#KrOhPr~W3oZc~7PL;cJ8 z$^{thO~~QsM9yk}uimEIZcD=SK@m(P2Ti!8pc>8vso$P0$#W4{qV~G>mZctC^_pm9 z;L97_IQ0*&;DiI)xj|iw8i7I3+(HNpP=;Xp&T{OIr?n_`TA~jYhtCI(!Vp@MplWBp zIc=f`On(D_@_JQv>tts9+gAlVaH`b{!{?jUofnC7!oop97-68HkS=JeT_`K9I$95n zzYVGSod#bx%gAg>(tVH<5WE{-3|t*~fbN!)yPrCBXjpFI>jWI@F>0+Ty8v+Iu$#&F z%(W*9&S+H^(9J;;%Bb7`7th&~-jLa<%$Z%Ekjh^{?wMcOB*kAA*^-*GljskR%c z-Mz&9HQ&jeI3R<{YdMXcUjU^Osmdh=M#vKy|(X|k)E zvV2kpyT-L#wI>G~l?z%doMIKKtpoXxYOjR%*-cIOnXwd}iF`hwl5PUAd6R50_yIz> zYW=$J(f|}TV;92854WZ z=Xc!=pEmp~W)kvsQ#??~`g&+rB6iOemZeT+o2~F=E_9nu2D0@;jIdQ}?byqCObN_Y z&~CQIDvkw5$-{`+D0gM(bt6dRk*5`ox5z0eAOe2m@tFeMyc~6nJ}?#Z*vdK=bD^j+IyHaNbxq)JrtANY@s*9GT>~nG4f$ z1qy~{VZ<@K&1_C7zDBBxi2{-gnRW^92=5EtBe&Mtd~ORX)R~(Kj$b#MZMXq)3o}$0 zILefWth)_(Ot|1vDJCh#N9>$^rtavrjpX-yk-$OCwf3IlgKBNQEe1sQCSYY?(%Rx^ zTjZ?{qNmWDIL2k3^Yt0`fHfy;3x+gAA|tPTCepo`DG4`u`qb^TkmG|YE{c?d|EpYw zp~jr4Fw?l52<6$znv(%`P1d)ptNHUPNXNF}t`KT&i22KZKtl^JNF5HDNtva6pyyPs zLTG}`(~5@UaJLwCX10eN!MsPjtakvnP+Cubj=(2sMvX*u!0nMl8~nCEYZ~K~`A9jr zd)AOjuDicyfiK76Z~}chIcZ8m2NNcE^Cn$iw3o@iAD>ZFR)&K*jo1BrVNOV>N+zaT z7iQQu@m)95wEr!fIoQ(*!|w*0Q~ze26HZ9LJL=nXnqKk6nIKF{o%)(N6;P)IqH~ z-`*2hfOK~?!Sv_)vvF$W_e0gGv6Y`sB&iRrk>yCA;p8tf?YU`G6Etx!2?9vNZ@m@% z#NZOITT15?`IiU%pWC9|(Fe?BCf>GbD1C_BY&!383Dl z>1>c)QL2$80qrSb+D9WoPm3A(WJOWs8Q7BHietvR^uS2!m1K>B4kHm{;L2y8LgqXU zW0tQ>nSAW8xdda0S72IxJik3cJ< z^sxW-kVkO51B^w|;=zrs^dP!MlwrtVhU%GNlwdn^l!*lA@;e>bzT@o)NLa+qZdLgT z8nGHzJ(NRqs#smOR+{{#cNm~i=jVDb{H zod3h*{ck`Foyi+1P^#p`f3*}5>}39xk!Oar;myJE-d*BhMN6t`LZH5Wc| z$pOb>qebq8eU1W?TUQ^J1abQ7B{T(RkLG2>e;Ga1RWKrqnrM@EO z(*To+?1I5gFL9tg=3Mz0BikH%6#EwjC}YTn!2b8ujh-56U4HO(`%JcS*42twFA}Q| zslc~k^Q_HzjeGJgYmW#STrtu(&dK|1VSs+X-371^p^JXP34Cf3dKcugWdN_5=W_=d z-_*5wT^LqOHH1vuUw>2*IJ}&`5$uq34@EnZ1{?yCW8lY>Q;GhqSg)|l3xi9EaN2He zY_I12bQUBTYE9)&Kag8KrJ@I6Y8yA6ouQ7@JU#}<4i%O(9RG@7v|UzFi`U^-y>Dcr z(-bU$Bb-fTLNQV7&jJ!Cp>x>;Az`*#18f%gU^tW^?vYN5O=B5sdJxY=kR6EgSRH;tsNU%xAwCbcEBOw!=>za8A9`BhX#FO#|m% zikP-dn4B8Bqb%6vWU}&r(zS_vG$+d zY4IT1fIiSUld34=;HMhlD^?Z;Cy~)R4n=Q-xKv5CSrM9Z0qLe8D{#YEiy0NgT(HECXlo-irCPH@%iMVohJ2?TOA-Q~AO0aP7) zWjAzj2e-;+pUg1S(`or3H#R4j4C`YcJ=;>;TOPFRzgSl>BPR-e3~*i673Xan*+^r@?oG^?^J?ns`DVGE&x_^LSD6Td9QQ1!q4+=3Xa~W zD!hNG0OCr<=b`wg$i7!xWMY^3lU|4)W2wS*Pb zJ|ev=KB{N)sYKmPx$=sQeup}yln=VmT%Mv%@wN08|EB_7I#>vce=<_XJNpGxbz~dt z!$g7|yn1j8+f{X!8tDMR%l@z!{jrzSI8~?gO~4ObdLSSj40!^shurpBiMu!Yv(|Yb zKKhx30E=d;NqbfPOBM-1Or6q%K<9tB+e|F;(d{X^UYk*=5Ke`fO3eML@DXd9e!R4f zRPS<;gPVld9S+DpKPioX6*4z4u@>rwouJ#hL{qb;1zY=YJe5C-0dNppNJHX@G?3+lb76WI!(2!bi&*q0E8zeCa3W)C9;x4A7AA66OPb zFbNId18Pq24$Z#=K_^DTp|7?VezyLhTkj7{&K~c*s9%;VmlTr(Eu0#^78hzTyZyc< z>fh6DOd5IMWuTq7kpe5D!g4}d7(V!}_0|o$Phvp7Y|fgSH;%NpHET-FQF5(;+%9Fp zkod-=J<&*Lj<59V`wQa9m_|TOCf4RD$zLLY5RbTu2yGy-9&Zf-e4M+%V)Ck6=Mow3 zZ<_chy9v!I#9A|uhFH$BdIwbF&`#DN!|`X>Qfvfoifd%Jck|rxOZ3xH#?X~E8kJEs zcIKC*#cm?fkL*6GFSfr&zfhiC2~Vf!9mU@b`x>l+J1E&QfKi(#)kW3e49wCmcLY1a z&+#!-vd0Z3UnSH;GVbb#(>+30-_%IYFfFZ|qP*2bj0rUz5KjupOoweF5$7S4EhBV; z$zxOyYHMTv9Ml{kz;ChB;Q%;AKx7JwMxx_^2hP0%ZuXz9y>pZ7Yw{A|q7J)ab^yD< z)>zQoOz6-AU`SDZ?lpchds1mA(d%<(f=ey^1oZTYVa^BVk`aBnEplWF%b+6&*joq8Pj;8=}-~RS;Gcn&f{9!Bit_iEE_9 zUt*H{BRxvIs0@~&OMg0laP|bC?qOBo1`ySy>0stkh8OKGUc?+es||i^)oSStIVgNd zED;}&YQ%yyD$XfhQ%5c7j+_Epe|2xw0GDdFmayB1hpHj2S?zfxBzD(2rqX?D@Z0=e z*^$l@##oQKJYh25_|)UkK*yrkb!xAszrX{lgqqFkZr$6CyTs@ROJMt<9xQnXr$d=| z`3!aqoEl00nK?bl6%*bXpO?j1}8~h{|f&OcWjIN<6J`a6RJuN z@XjrAdy~nB1H)k3|EMpD=Zz2kGQf3T@IOMRl6C(9k6p_&!_WSAp7{c7UZe5nvHJsp zJJuWqSt2gfJV(`z*Ox{uH~1VpRr+U-g9@%Or{MPNVf$2Mx8}W zC>K7lN#yxUpl5n8uUgT+vcbZo-; zcjXBiq~Cwi3&Y&0Ywr{2rK?xDm}a8T9Q@b_0<@w&;T(^nRu)w-9lT z`!fH7g=f;uY=nvXbZi6)tYplsyhK>}Vy&@^wF*sEn6J#|xD&!y9{Lm{`FhIvpJeE7 z9BmvIeN1=IY+#0`xsB}e11=ipW~{=2qClH@5WMXHm;7v1ksSX4pC;=uAiRUV-XUN& zln{b*JaadaN$;!=SM^vZz_4Hz3V@3d&t#0b7gI3*Lz!_a$%rVHDQaePB zwafH@@lI8KT9n#cV!;;N_n^%Q(dTD#0VNqBadNT3LNSA$={Gzxz?l(Ct7?lmChML& zdif+~{*sEMyX^934t`9HtJrM_6%2U{+q(xj=#81Mk(kHG?IsIN-hs-6KHeTc?g&nn z3A!7*%hVC{t;f2HuJv$IyZ75Uj4wHDewaT6O81;=jA4>dHa=3EClbw;KqsT9|flADbZoBucm}SPu)9IR>_`Cj$D#pco zjR2q5!8^KeBDZI0ktz?@VzdKoJG~IAIAc+VB^st~!O zql9in4G# zyiuQE?u5^o*v5BTJtI`DWMZ3+R|d7>HLZvqm|z&(u6Ynu=SW^GR1&V~?MkVPDBr*0 z1|qEem;m{Bx5*!HBOc8b0bP#nH??138(I_v9zxcZY9qJchvd%+$7^D1u~95eHw5X6 zjI{tu1-0@y5}W(SacRsGKza|3%g7mZY#Z}#m`(HDYl3u5taAMSkGNFsJ7o5%*)jZX zD@3Gb)+x5M8kG|N;W6Yx?UaY)H#4GkZ66YrB;feZ;$4)1qJ~UKLe|5>jfY{=0Es20 z`-~clh)_=oy~{wiUQTeigaWjn8cEHzXQad^7urS1y7iO`sLInX;2KP-KxsBL6`0<{ zxv@{|E)+wPup6$bQrr?e_b}X2EK`m%VeuT)(86E%pn*$QF8Bx!!c=#V?g~_184nRQ zo9BI3fn3czzz1_5p&t|A@e3@F+ae#MzFu=lKpWaVc zf1K3-zeCzpwWTz#FO5vQI}-mSJKq5q?kP|PvNHKHZ@OQrxpOw^VkD*r8Z{?qb`aw` ztYgP*b7qVsQAHOX7F+y<$b*quOw!r8SlVhBW=@)Gi)9#*6!VvZeqZY71}EAxK#SC> zdfw5*1&s(hWNW^c-NE{C4{JFETcIDzk76|C>gK*phy+y1@*OVIk8T+4noL?d_g~ce zPoEs?4wF}#Sq>uSvNP*2rFCHr!A3TbQzRWYjQu&an1erB6VUZncG`A_nuD6tsVJsW zftF`hTdV_6S6hXY!x{T2vh_~6dJDgEJ3HnMCPwl1X?mD@{qL-!u5Gqf4UJYS?Y60E zG}4hu&V2HbwqTpE-_&w<&GDlo?2$!{Yf-2^%|;r`_FZ>aEXaFdIz=)3H#Ts}Q2esloyZPN5 zLtL>f?{SA76+C9bflJoky^M8%mo{Z+7j^$o^ze-%`(x z9my!X6gk0s`Gc+)7uKAoCumQn1MxFvx6j-`6LB==|4W(ZjmF4Zn9KLL@JH-@A?E94 z_EK%+n^|&Kx+b0#HMa=4X0XTi92FUmtps0OGjym*aPCM`-Us9t@;q1diltI*dI0_v z68-R+`1Ga0$X2Q8GM=Cd_}6VjD7Z+EosWGNSjt(JM84%0!{SQrFz{ z0IKOiGWp+*@g-Z8<>0>*5#u;d@6|S=^xrKX3+oSHe;WVJB3o}e z?C^24E7u!FcM8VKZcu#g5n$}9QlxC~s8V{zZ9pDdXWo(ue9pmNB`0`iqrpP8v+`F& zFMEud;b><$7AoQX*77wM+qa*!Hc8vwHBL*@^W8<0uEH*}3ALBT+KA2%G#W-stPr~W zWbI4p29GaW?OeP~-Hd=gtwbFv7r;75Up+h~UDPiV@=L;sUB^$^#F>2ue{x!C2MgPL zK|y(F^BdP@K`G_*#L3;_FAlWKf*^%oU)morqi?|gn7u?X!Jm-SE5Xce&Gt*}cOp7} zcl1Rm^7ENk9c-MpGrMepXJBP)4n3ycy_L;Ley67JbaOc3kXKL$jcaj2t+8hWKARi= zv9YB9oEo*8S2NJz;hvv2R z=?Ou$&0SX&k4<$dg1Zo~9d)QSDdaf&rn*|{t*+FdoT_A7aG;YO8n+R7Lqm(PKoYOsHwdx*DhG*Z)ejRmW29bw%uR{feV<1Kh;6>BE>+ z2ICqkfJ2=xg1A;al;#x`t2FeNk+oa?Z?*mTG)phGrU{LaZ$xT;?grAkekQKS79;f^-Z@NefEDFp5ft3eq7U zAteqeGcX{6bcrK5BSABL)ybL&97j$ep+!#}-+`RoG zhpwFwdnlaE<|xu^CzZ_FiSoq|L{}A0ziY$C!lzb?VoX6OtY|{9!!-B#9$-fGdJxi2-jd-luxy% z;}rk!=9=gO!2?YeF`Iv*JDr->*uf}3kWCNpE?$Kk^?+z}=D5~ZH>;?y4Ycn~6zb;| z>v?bCDw3!M5FX*65RO$=eCS!z#P;D}7u|?(_uOHsAtmdj3==L`Y{~W^BorcE*6Rz5 zl&1<+w&rjoYLqyX{V-_#&ORo{opb9~M8v4acrpGFd7ErDwMRX8Rl&N|$HT@5pR@a* ztyjs!MfNL+rA8{ZI^^UiRtauX9XWP5YI{&R+YZy8UZizpUAqn=L9kABNIu zdCnTF8?;yzvy5#^9{@cF_;8Fsw#$b}K>aF+11UY#n{0iE#{J0z)v)ldXH%WeY)vp* z$y;kl%~Uv}nV|COjI$Yzd^yEM^&JAIcRu;D%K-b@K7HtH^=jnal&ur%p)6{66lZp*8aDrc7#CB@6ba0ihR9dCp4d5 zCC*SQYi%4cvS|BZ+(k+%@ta+m=41cmGIFo^-Kx04K)+|sZYNrHYk#<`DJA_tFL`&r zl-PWUg;Wu_*d~kU@j<892=dvJ`w;SU{SatpKWhC^qNgZNE2-FC8|~5{nhf;HXlN+T z6k(_IqVPqb=-ra7z1#c?=Iv0UZ1R6Ot)*Ouy@S)A|H`NiWJAn|u;`GtLiN#qY*m$d zUhNuECa)X+^j~ zw4wkFo-gf@JK;y$C5&$skAKh#I!6E@l{bFr6pbq_wJw;And46f34TtkZ@_(|hH!HZ zB=C(-Y=A;Z?MHZCpvXd1NtZypX95@}lZH}w-R@P{(66%qWQqdX+jzzLv&O3VSbolv zah@f0=i)a)J=(7;2fUoqZ1Dw54>evK98@d1C}oO_uvNcI#ImqeQ|q3J3UzS;Uf+kd zWDtAjx9(G0KAcy5%rSQLC;0ucn%P60Q*tV0)D6oByClFWK&I{XR;C$}Y+$Czb)dx} zc$$>SRJTzmH*MF3!Tx5r9Sf;yUzCKoDvRY;%P&$R0mAc5EtE41K4pq)AP0Vl~{p%}6v(5Dr_?)U++hShEE`?5>1Z*6**pd{YUX>=-accr%ttj%ykd$}L& zls)kKV~yu|vz3>6V?R}r34k1kd7vFi#R$EwE?qJ)ZtFO=sCDqXNJ6uf;gTP7SU3E8 z4{r0$VM^TH3upoKIPOKeRp+9-7kMzPmV`Jobe4YShceCR8yvC3;}Ozp?0mM5^BNSQ zJ~b@-WYKtD(Op#VIiz$k&%&8X5i@|I%rnigiLU=-(>PC*#5sJmE*!+F=*m7JOT>sM zL?X=W_|f5aXC#lW>B5GTOx-(s2Ip|Th~eSxHr zuOpjWX=5epIqtB78i2>8G>wL$ZYN3*-9Gw0j_tA|?h=V*Dp|JJ)V!#*cTAutKRn7-a?Rz(Icb7XUC^`t}To) z=!xN{V<={^I%#KNtX1na$#)Rh-Nh9%Uw85j(D!B)i|s(B0XvG`Is3|sGx6##lUaMC zj)g2{X9tc#klk2Htl+djhBl;ZZM>>}hxW+@g@Q*~r?&h?*{LRMs{Dm8_&0v5_EZ&e z(C&jIjRSTMH`t~nl(=7cZI`?}D4#9_YiO|V_kJpMYOAsVlE@idfKB7rmFPF{g<=gjGHbs}V`EyUSrjXK&%#=}Ud-s!R{_0HM@iX0j z!)X6VmCW~wW?74*S^u@0nMKc*Djt_HQIBku|CdnO;S^CP{r@dLa9Ta)cZ}`~Im+(I zU$1exTH_>Fa+50qTj7NRypR$7E$dvXT%L%%JlgMW%sYmIa$Fu@sQ64x{qG%@|Ca~uXSoi0aeTItWh!>LSO}~W2M_0bGFlUb<+bBDUJnrvQODFbBL7i zF5|DI!QE2b5`=r$Jb$kw%dci~N~hc8GgZG&`Z*JWgH#stfU(zZPY$x{3A5hxC%$2jE)&G2hVr2}LO1V&zUz^+I%ZHhV1F!hm5hd^S1 zSe0(b30~!U%FGvp)5FTsX4;)wY_GTejut#GI6uyjdYR~8!NU${a6BPQd4md=!ujdx-P*z0e5C1fLt)a6a zkfA7c9-rCfb)0;-t?cCG46JE5$#>lpDTI{Nj9W1l2Xr*r6t(f~5nvnk$(PJ6-rtfd zQu~>vUjrO1OWzP3_e*QC*qmzN^X}naN10+shjJn84VJOyE1d2vw8s(E_mPCM$mO4= zZ~o{T===HxTb0NsWcvHzDvD!0NAzq{Orm%F5oPTmAMaLf$4WQsL}qA+R)5`}>3VxW zM5xUGrp}2#3H^hgN^dmOo$)2%g^nr~sCw8SptYFcL_!qkjd)@P&+0ZuP{4FJm-<2u z_9JRuE&rFD>_k2MjtVxh3cf@25@R+A`*x`X9171rViudhZG- z{wvTB7(mhxJC{aFY6IY_?o1z}6y(QV6on|dyPqEw6b8WWBLd#6#iQi!+_y9Xuwjdc z1dx0X=@bX}0*`Za5k*1?(2!`C5%I3ix86xUwS+omdI8Ezf8;B ziig8UMqq92_+Ca9dYpx^@pn|jUWq@zY!pD!8;U}BpNjrceIBz5yHY7MPYJsLh;XXJ zKPPn{xS7_Tl1<+XuQ=$e-K#c>SxT!;;6ER}4Z5OWvN0PjR^WMsYgXZcs4kgyUgdu0 z`BMmH=B_OUEv+7-0i|sprZaI-Oy5_;eQ*+d*n(n^IO|9|#VrDuB@lu|jUjMzp`%HcDmXa3Zml^>TvWi)>s@ccAhP6UDn=D_Wr-Yci z*aZO{pEi3U>{y>>0bt|~L)UIjD$31IiyJ;Pp9AL57f}}idfe3^g+85*tND^bub;=@`BAAW zcWy8ab>~9pS0{5Ma-iQfje5C?snN#ZLMNMrKg!PhXG^~2Ut;Ie!=9_0(94tVLZci} zC=5Z9!+Zu_EqhNs^+E-@5lF%%jMABE-CQVjx-Tb9o1?;cIK#gpAJZ@E-0#Iw{D<%O zmC8wswexM~a)DgU-W;w>v*&?_XnD)QDX^x zfK=cgV&S3uc(X$NRo}goZag9c09K}#O6dz$ zwPi&nKMt9y1b9>uzPjiIC{c9HVGf=mi8%z>zF;nI)oT{E2>=BU-EufFG}C2=`V6(_ z28=%?_6K@xsbsRIyl0YyZ*9mHYSjQur$xfM^KT{~Px~?EXM-g4f0B6)>PSvY9X@`^ zoI+gHIrrCVee*{C$FlmR!W>l(IIo8+u`HubxPTTh4VHAgsS4?dVb;NAO%RXYnQTs_0BlyLhhESF4 zqiUkSdi(cHYz&&+aJgPET8o<+r|BX~`0q4r^4IWgMB#e3Bj4t&98HdtC@RZqYh1EM zN5G%>Wj#;ye?3S0m==Kpw_pu`Gc?fU>7;-o|I01(YQFJS&0fJ(u2#>xT~ap&ZElq= z9sjkQWpuK&_~lRSYx-XjV*Ldz4@C6+(_$-La3gQv@&O*FwsoL-zz0GMG*Zp87lQ1E ze4TR7L~iYaUR!Z5C}g;r0QrDk$9s(%q&M`_Qs(t(1=^RE-`C><>_+*?lfl(>xm)Zk zcmWe#+uNMx1OX{lyX*<$=8LG&#YNE94PhjCAFIk(WjhH+d%Bj9C*W~O(HIeMBlEUJ ze)3848gUi`kpa-CbUHodU!+N6&4GWjFg1S*uJ$DF&55Q9OU7tlR)?G%mKNDD4!*WP ziAeREwLW!7o6a2sE|ooMTw}?B{{UHB@itGjPbIj`1p8c-Q3xM@mEaOFcc3}Q3y(YS z^uGyz7cOCHYQ_2aadRW3VxC#GrKNE-a^drd-#IFy5WB& z`TK9DNCp|nOJYk#o9p4U33mMn=?!&0w1@KRNs(1zNqY7PH&^-Cgi_b5iNQdR8aTgi zV%Z{cDY&g0c!M|rC^`>l{KM5U9$n$YQ$Kg}7}+`0QfYf*nCqQn+m6j28)TVm-1)o= z?C~{~ZF7^G7*ej3_+E0$HW8Kp9?*W*!Y7nODIJ%7SB;>fCIGB--xkLP5K5G3v&kT1 z*KHO#*>AsFiMoaW+IyWWpbcOs&3?Sw#!Gmr7P0mF5jX`9fsvduz`&Zf&Jp9i(U9}; z?u&7I6QH3VqTT3!h@3{uVd z2%onayK261QoJg|RzuB=)c~+gEmJ`bw%t;6mTRp8RU}H6Wly&YL@jAPaA$;R?tl-< z64920mN{4f`F@MhSF1{I!$cFFpu5U9?&4w^?KKvYOakN3k@zi{hPIw?Vl=(6ImnU) z*)yfapL$R3Y`t{NOM%0HNesF=_+j)9V~p0emq~H1MEngiIX@?#Pn;%wKJMAhNDQM4 zjfFFw`5BW=!zyD6P;f+UE|6+}F16F<448#{&g42@w?(+(>h~f=roa`N%RRPR(k_}i zheAOkZmi<={L2rw*bgP92$#1h1pWB^ejBR}L%R-E^KSWh$c$eg4+e%UF87#LpSM?CXQ@QlQ~ zU#_jdbB>zuk=xeAyCsQr-!?xh%c*O~CxXe>A327cWT-`zUavp8Y2Cgjd$|L-bo;Jz zvD%dX6eGd!uq9G0V&~x5}m0D^)X}nR6_v?biCy6$ActrnKx@LYhUKl z3gx5M#mdM5W?S={6wL+o3k~W{3jbV5{zJ&W?6KtiiGuTG@i)#w1ibvkS2T{){J#_Q|M?x!kYG29qmfS36>WoW-WO1Z!m8~Yh%=-i z-(eG4(&t6CyMV6%rNC1OILQyQ>swU^D+YcGLys*^+6-PXe!@0-=G_NUlH4U(X!QE! zb;Mc8_=^4-9aft|ti-Spr352WDga-I>yI87ArE`fN~#4-w|_Tl-Z4)O+ygz00xsi4 za>OVfu%&4&zVZQj1BE1R&nbGKR6zp`l!6OVpJDPC($&T5)z^Juw)VxQ^J$MM3~vIs zCt;{;=z>E=MwG($Ro@opITKpBC`dAXU;bzuezf{t6m=UHM>3UucWECi1~amugYAu! zc9?eNJ4?YM6kn!MNaQlTArSkwIRLf&ytIa%>*nj&sO~5Mev{~K3jF&y~7ADN2^8qFj98oOm03KF}LXjMA8%Fe;JB2nnfDsO}YDN&>g_IF&H< zd-R9E^jQru=>Ei-MzE$pc(!KY-EM`_Pu$rTxsVYl=b9Fk0WYC09lzc91H?Wta~Bvb zMWTOF;a3DkK8ChrJ?YwWn0pF|G=VW!*RvBTzbhGXGXmkX_UY^_!`e!95}qgFe(A%( zY0ID@Y8+WdNq405q;C5RuL(7-H6)#FBiWzC5pHVaTwMgq3hTzXkElU}fICE|=C_8M zuM>S%v0BNFEJhVJS080Nb?~8{ArFj{Qid)zB{X*uGRbrHWtWDhhQIa$KCbxZn`qvb zhOQa(OGTC6B;fyi8vV$BsSfnmw<@^jC8hS7MYly~?x=ImW}58^OkS;79>zM|#%C7V z5V^HjCy`Grbq^E6|GNdb4Kzt-AbmWAJFBFtev@I!mbU2TSk6;!ea-eKL28!&A&iP zon>X6Cmk;O{uj`hT}s7&^P2q69^r-cx+cgqEFOdqI5m`5V;dDm?kH=<0|ygXWGU#5Zv zPS&f?un53=Kpgh1glk!D{Qxy)fWE^^19q_EX{y^K4|_O0NsFBRv?me2O$4OXEgdFS zGuTT#4Ww{!`&t;-Bjp;%Ph=Bb>W;asX&8*20Wp3LE9$Z>M$0JlwB=Fsfb_YxD~#J> zZ}^AL*Qb!$)zotn2R;^Fo9tlKSn3|~Yt_r?;jes0bs@vegXW`QBHPbZdQ>iz*K_>? z3sHsvcU}%W!$7Y5JYzq1JS*$hX8W5nDQ8(4rUv{Zvw8AKp&?$j0S(QbIxeF2CrOWu zOvT%z#J+ba%Z@zGmm8&74$Q6?jzFBQDU1vZ>1^SoM%-IJ+>)M-b4lU8dp?&?Gk+iG z0nmjC`Hs?S(MhOw3H0jk{;PRBGXK=RzgnO22o~KCe8xZ z>_obZDzZD9E&9bA1}UY7?KGSyccj8*ofD@oFB}*}G;r6T?`P-d7Sw!i+mI?>Oy5}W zOpteBBQG53Lo{!O+^AK=ZZ{U#sJjSCI15+K{V{Ilh>6C4#RAR{v5oO&knMqNrjJg& zM5%AKcM(L`7&Qa@iu>mEJMAQF!bPz1SRY!G)lanD!l}cl+%srpv&B~8yB)RWz41@F zITY7{-D|&3H7?ywCwC>NM$**~QwkqYH*hX{0<&us%R=W=k_}=~Ow^nTs ziCjDO*>8pG*O2(AL(`!SS&6Xtmw{sPy_AU&^fg%ex(y=B!A48fpYbH5B0xN6MY^F~ z%Ep!HI+q;W*BL%>DACoazyC!CpYkYcIFmDF$Icv67UCsQJsYkC(7>#KGffR8o$W>L z81QFoK3UKP4R&5TF9rJs6_!U~xZZy4j*$(%{Mzll_>-cch#kqCO-NUBcj9>9a(^X| zB?xU7&f0!+srC0`QP2A&tNa0HACEZerJ_$##5t!vXVUHon^jej8fE8+9KH&-C)%AT z2LrCLD3~N%a<5^_&HZCNh*oyuXq3TG>-P6#hy9p~{cOjPg^L$UMzD!G@yUHfroa`Q z_{D>7MlQRh)!mQ$7E6ya8;qxVZ<*~1S^re{CURrSv2EQOUiW!!B#k-(G8e0}BY&Pu zOl`lqR8nJU-&@U!k_ABg;)=OTd&jHdY@#-<4j^|avm>O?Gn%4uJFNB#l0Bxr$! zYj<{j>EYU<>j*M`8@6Gha0FU1$h0lKKibr>jY!KUW!b)AsSZIw14F$gWyxd-pBZ(T z#{0X7x11hkDeE$@Wb^=R5~G$JIO$H8HpKG-x5iLH}bC9XHa{LkBZ1q zU&iY|ecUfjmJEE#`9I&n0{43>&<)UBN1g0r;knw&Vna_S6WV5rrQWXWYJV?a3$CtHX-R0ko`U zm-%bCDIoPN|I0H+B|I1Q5%g_FONo5$o6|0fo!(%$Ryxx>hb2H009`JeF2`D)E+ARI zX?RVxvOP`9UuN^K;ig6QuoxYG$0p&#k*}2N2VS!IH7O;yuA2J*HEXzY{Z_dZZ|73O zL9Z>3HpO+9s>B6iXpgn-Xr^Y)MynDh8dbL3^W3RkTpJn`&!;Vx<|r0`Jl4P171lx= zfP1npZEo2GerNIWwg=w zCsd*2`v~0Cz1+PtiqP?rE`oIjTe6K_0ridpoUBpGA2f-7d9heoO`5$mXwj_?4>z7` zNwLi*?F0rxcPk8B=>VxDYOPM9E!wyR=4*Ax+}NTp^8Bmop8X`V#aG%r(#CtDD?t&>Ler(xoqHNJOLL==oE4wKtw1#<@p;lHQAZlt zPJZ`b&_JR=hgn-yCy$@d{XJBTk+lNiMC9aJ{d>j(frYI4OaH^odmSa;>zIx=W4{0s z?dslJM=;-9J-8((awRZKQ{tUO(uZesogv4HCowHNi#wrjp1>a73Z&A0@$|lJr0L8m zgWdoimP^8mTg%Jf$gI)hbYt@Q_uQjV{cNY2!PTXGS-Y+BNuT`swR4P@Gko%(Uoolb zXhe>*tdFncWy+F_~LI<)1l<^D%GBaOYfAV&P=SXXbiTKhKXrWEw_E3KG=mWNG%FNEM`5K#+p1(8p`!9sgHHEpXf#KE3c2z3^q%E5 zPXd?GLLKuoyi-=LZ-n{$7cDNvI!cxg>=Bj7MAsAd)14aGa|N@;-L)KS(DO4~i}&mp zXDF`D*LoMgGP;;5PM1ztW={@oYy$hyeR? z(j>j})A6XSCfy%zSn2`DVrRLISue4NZ1uM=8@MHqzj`?IvZ-{-N_$rCQoiA`p6WEQ zeK{_m>vX5stAf=G`T;(bPr9s8lQ=|Rc*{~~R7$vddAe5EeaKa7IODt5>GcQUZpXiq z?L+p(`-QU9FR>(RGgd|XP`Ss7PS?utY2Uawf7$Trb!>XCMT8Ni34P+dkYHfjD7)p# z*qtLZLHvbl?EonCa+BAxJ#ZlQSG43Pb&u6Xw4F@#WW-mG+km@DLDM=YZlzoo3SCFx zR4H9MsOl!@ffWbnlvJ18JGwf8#y^=JAfe{ChdTx1@A8ki4J^t}+O_&fMcLu18-UDs zt9(#F@%yUY;WpxCq6Tm|nh#T`-rNM|^kee#ofjEQl9v|k%0erc2U=J)f~9ns0Jr2# zhJbFYqgG7{9?>s09TpqBYc^}vc8@|Yl2x+-A3&(Pb}b+e`{<1&LsTfRAeN$t1(ph( zMdjy(&vGCg)qCI*p68Vp?4H9fSU#6`CGw-{iz^<%OAcZ0HUOJ1TwCrHzw_$g6}R^* zw}zr>4#znn%r7t3lIGS*Lq3-@hXFg0@s9b-VUoVcasDt3LjDGUH*4Zol|_Wl`ech_ zFcpGXWc{UR6=wyoc=>MPks-W!ufJx|I~j6vTq81c>i#MkawdzC+nH(jVf-4m3Nbh? z$Z!AD1>DV3DHfF*bXiLhv+6ld^k|iPMYDr$)EGy5g+>>{%(gcq28}njc;LRDJ3WXL zgLn;9uLB+QS(a4(q2zGNYM;8#$3uSQmCt<_NFQeDKS#y(k26A~G&%cc;Bp^Nzm{EU zF5SP3lc8utckDgo%!H;m)fr%;LgdPz!JG7VL=PEq)}~`dGmWu-R}Y8|+--pEg4EKX zU5t5fyzK$E_u=uko^ZL@uR&U6T3s7^jzUUEvVLbh%$|=U3I3Y)wg0=( zyHx@I&lwyEo&{RowFM{dIHQLHd&TeZlx^=DJ)p&-<2Q1toMWL5lWv(OTg#b;%g0QwYDj zs%W2v|E~Sc=3OYa0I-9GI3`ElrSaXf&iJ@!hbv0c-wK1?Z&`K1Yf*P&x24GZ>$DXQ z22wgaph><{@rKb4km5q?=EDnGW6K)ZbQJU`DrQJ~uvyb8y z`!vKlms*7=+R4|WD%^~Z1^ij|FmQ9L(85T`C`?m=FNQ%g39AlkZ8hFY@E3~;<@RxW(KrP=DbVx$OS(HHRWcZlSpbeB6WM)1{d zTh2t-tJs1^&;-E4$4s?u#4N7YG+EKtB`cIkkvEig2hq~P99j>#JXQ(4C>@dh`{si$ zP@sT@T~Y5=>wZ)e#(6C&DaA#*tn+E(yZIJdXyY}>IS{&JFL};K8SYuVpQKx{iWF{6 z+FHi4iPabu?w20$p6#$TypXP-ygXHSqU?pdaE{*U!*pkZa~$94!$fxGnc1pcic-s; z))o2qny3}`Gv&;&>FXM!DDTUo>?HTD>jn z4(<|K$rj!3!8N8rlYH*QY7br<=ns5Rs=!#Uzv2jemA*_5OZ9dugz+C9fI*I^~la5-2Jss4}D5mq}N1mUS(A7p|CUYocUp=;9CSS z`W5AzR)8T6ql=C{@-cH;Io(LIoZKNDtMq@(Wj-NY!+GrX@#IUPZ9yn-==IWx)Z&@9 z#79o}gz?ZI8o>-O^^L0Zi7=y_9e*hI2(vQ@^jH*)c^)nkCTWSRpu&m{4oO9a65lxZ z@?Yl|LqOhMqVI#fd<{ed`M`U^TDS--^^9Rhs$)^kETCovd*sw0~~#?$v!%`9{mnw#AS$ z_k|`u`pX$fM0h=$m0Hy3chY}WRu_m)k9g8(Ke*{)$YV+fGvB=ra^e9};yAEF=_D1Z zIkgw6yWk2Q23|Sm71Eq|c74g4MyP^CR{k$T9p(x2jKr3L&V`2rXMu)!*IEd4G*-8z zy`A{Vc{5MK3jEDO8Trz;(Uf0<{q7`W-TU~R$x|5|RUJFpKGyVW$b8xwcMPaAURzFp z{{sF}PhGHIsG!z8PWV8>r!i$nPhPbS*u?{Dz0tVuWgW6O{MbUGL?{to*Wv=cqqSv6 zf8`5pYQ3-8ASmZA9>59QxZG8tbzZM=<*)SJrnaEUJ`-8-kP5Rr$DwE~mD;FQF{Mna zG@uY4)&K10JB!Fat~^cm0Ulp8@R~|UyucUUZz2wJ^75r$L`Z?G4I$CZqrZ-@8>KQa z*T@lS-ZMFAbk74RMe(OHI$0Ix67hrn%WRGXfc)P%7xOnTXPP_I9DAlz56d4XA3nr%a*H$Q!v?tuiy1r$jAm-FDz!w+F{=R5%c zub+e}n3s6wZO)p!*VBvo9BwVNnr98%4N|b48i`OS$k^CmZaH-Hha{)C^6!lB!X)4> zPGBxjDj4uAlJ9Wkg(7_8SrgA@zyT$bC_7UQn;0|@eZnH~TYL)!aLkj8h5QbdWpul4 z3G>xNchj%fXvGCFp*J}K4cI>ak57YaZhtBxD_xBG zCw>KUbV%g>>R=&=`z zW8@w5965)$=l7|RB9O-~qTRAnL5f%q4b|DZO|eZ49T3Z#GGe-oSQi~Fyf6(#YAp2q zQwF&&XZVIX+sQ@u{l^0ZiGcpCf~@Ol^1FZb{VjrobccT2EY~Q9{as&3d8*Qg@bd2h zL*&vvaa0%Eq;l0#YH5A#VvW3lJmH`!xMJ+>*p9fEZK3C_=g+idGf#+y^^}&3n?Gig z7JS_45Q02BqCCF=sUdl|u^(S&G9|M6k7$@DHI{BE!%^i{}i=W{pt_Oj_bF;kR$=Us4A4gEmD2;XN zh_bSJ0Y1F37JH*Z^ETZswHs-E3+L`2N{df)^;0fg#F<@Al&vz>Bd~-p znR&LY(zxCEdD>9!ZvI*DVaBs#0}P-T#U3|C1UuUe4VNkgYg;GpxRVS3vHLr>z{%=G z#kt40cAQ%m8*riZ_2lIVP$L>~Xn@L8!M_Gi_96JK)i6a;87(boenaY1=ur8rKM zEf9nUet*6Pbio%px^T@LUI;NDKNxUledkjpd(8S^so*#=55<_*iG36Et>bM%{iOWPp zP+s-z00mB6avLU)sFQ3{C+yv&IC_V4i$0J`cEHs*x|hZ12}|%LPR_Xssj& zI5vU=n5UJJQWXt`@wenLIjxp@{8qSLTOd2vieZU7alM7rUI$MxW;zN2TG{R7<$Bq2 zq~i*nSxp_ZjMI%3%m6hL#TFCQhX}ty{)|ZnGp~iwE{(Jslf~?f-z8QmX(il^CTKjC zMcH;u)^{iW47AsmVs4SF%5Tj(W2Sr@T)4sl;}|(6D?AQ}JJIoX6wnRfIEhpm;TBxQ zcX)0J}1WHa`8?n(W6tw*{eo0ur~V#kvqwISf%fC8iAe7aH^VzxSyKvOl)A$jk& z2I~2y*twwqD;M5Sih-XuUre{9i`BB%4qL#NHkAErvnuKmlw%D!8XF`R-xMJDqg}Dl)P(yYPeP;>TU90*+CMG%&3`2RAyuD?ah*V&ThHi*CHo-<_M|$Y5^A7U z9sl)^d|m^mrA)yHMV^aR`ip(h>q>EPXc)s1&pHoO&rbDek-lm6h^SKs&8cHt6Wvd` zuV2>M>2ch>A9InM913ij7E1>S^Dl+;`Qo||^pU2sTf`PwJIrkOBYT$`RcWG4n689+Q}PwbtPxe25lTp2-vXpZzX_=&q& zm2Zt4@xVkgOxlv>)LlwxxwQ**t0AUm07JdQE2j8Usk1FWWIGmtzLzd$)^Q!V;wX&m z@?y9-yH1>x)-A!zb{N$Sb}TsezXLsyZxXdA$*2zJtnawF6^pW=JnZLhj!W#CjD)9| z&*~z+%W&7u!I-CjRHqR4o`BBxOy-{tB({DB`I!TBBw{(t&QFvRBIj?Pb02oFF;J}k zetewdANSh{6=h8qvg{K|5!x4{WhH@d*1E1?h;Mm z0W9~!y(s+0q>`-Z7HsIeteW0Z<@BTUVGH(y)Do*2{Bx4&k%l|B@?cko7@!C(M@ z33N~5=pLNxj)Qr)hh@-bK3aK0daH)wgmP6%$m}nJ-a!Tk3FHftY)-hd2#0<4Zt8P?{l zIjv8=BUE_p(|k5Gc*Nm1OM?~Zy5~lH?Y^VLAuN20c&MZ}o>7P$y)AgxYnt7e425y9 z&UNk_jQkoGN1NKEhZ?x`mFEkIo|sc@H=Yz$e@b*+4EXG>4d-|*wmA9N5$w^B+-;R! zKS=fWfQSNrI?kD}$~VVoZ-`qfwU`z^eq>t1bQOoVWs<&d0ni;PFr?w6??e-GVrH|- z5sA@*OcmkPLobDWn`u=aOuneAJ^Ie@j~Ela_Nrq|)H?5d@9Zec|L|jn@Iy$A7q}d) zpk`9onz!}vcD2CmYPE1SkOU~U?kq#UL?uwO?}s?S%+*v0aTI5HKwd@?tkit&Cfa-J z3GWx)Co|ET%dT}KKeCct<5o_8nLX%q+dqguj;~`?3w2fN1dtCueQE|`%DL4mXmmx_ zaxJsbUy7eDz|HSmM;k>u+QJUkBpc(YT)rKPoe4od%*-DIh{XBs-|6!F7`ICY6=Wia zM~R-zvRU(<@o4nM?;oi6Eq{lw^+yw8xdx?K6M5s$)8*E;w6K;2_N+O-V&W|rEpWR;i5&T45pWn zDK2a|hP1ngLN02j_!S8C;bEP%RahFL#bRCyoP0wqkxcGI{6enK5W-HyTIHz%wk2&{ zi_endKloxMq4|1@RyT? z^l;HOC@<|)k@9b<(Tzo!hDGpH4dkBK_LmIV$6j^!E_mV%BBNN!tM8P)csaPK-vY}`*qsS^ckm) zgzv?XvJ(Z@GUX>_IiEp7)!i*V&R4B%*6zAp(6u1c%?}TMk(97Fo`VmK!P~DjGaw@) zGLU4TiG^*G?*;$hNrY?mceUBDCluEEV@e;F+umWC%zi%`a$8&Dw{7}xeBa**-ceUs z;8UJljxq&umUU|#mKwek%BNN*GkdcF)_kfsSzvmL-nT`L-8yTI!_^Uzs9|k?D|I%B z^@y6cCMKk?xs+S(di>l;BPFKCr>-grj$9YN?ke|1k+VCrnfi=fshA&`EpgGa@Qaut zR%k+Cj+ra8PW!ep;@4cAjMgXJ>#9sJB18OJHjC{xv(^&U#H)U2Z*ctT05x&`AMFtB z&{9DsA)4>`e~}~-hAZ_%&qF$`HlxXV%{B$oOsFRs}I4n|bN)tt~gW)^jQ> zOuV$48bBT#>`!a|>8so@hNT~#Pz_Z7h&Rm&v7zb_GUh3*t36bGt8q^~>@1G_%c==s?Qpt_&=zuB#u}E1 zrBYj>eunz&C5#4@&Qf~>E$kXZx+*g#%LO381vtlVOFyUUWF~BXP_Lb) z_yBlaO|H8Elah!7>tM-bTj#14P4{;=FfxqpsoAB)6+H@@RdY$nbhwk;NAJR<6k4M& zJHWJ<t6GNeB6tm+s*Fd>PvC)f)gyr>E~vJ!f>8zwZ(Vwp|N_f5U@ zCELlqwSo8ztYBjAVL`OB%+}e7SQ0se8KC*S3Z=Xl#$3Nv0Ff$r^@J8-NoxZF2>NAY=9cWM9BQN_^soA&%&LiPFK7+v@Mbg%4GPg80rby|MQru%-x zgFT&cPPWkdazXyb8hd8HEUYQj#3Z75%H%!dYXuq9eir)J@os=D8T(* zzU*S?Frazlr=(-DhqidiMQqE-b~*FxTF;*vWhF}|y_wnTYd5e%bzd>nwrL-zVPq2DfOCi{689u z+trY@x0w6+&?8o&^ma~>)QkU09sjq*=z9C;jg4#NQ$_W&Ieodu{?4DFDKvk@f6rCx zDY~&Pcg}sWVuR!QHDfuBVi_Z1X-!YcVGL0|qG0y_Xn-wvr~C^2D&X&WK&d(kC2}WP z?LwVG-9jC4p+V=vi?q-oPLq^xHL)MauADr|Ut>N`jW@k)D%@^1B80O&~M{=1TIvxa}|Du z{S@`+6y)oq@n`Tz>#R{6{K!vMn<+uuCf;3|(-j-e15JYQny~mhX2b%KEs|Ie3}!V| zToeKaG6s#iXVcfNI;MDu{jslz%%GjMl{qEEV19s2}aW#`WQ3^LDo9M1fjI3{I<{SWUvSrA~C zeaR7tXE+ZKMBO|rQcT{v$ut3!M#+h9$XJHu1Ldt4aNmKW05i8z8U(3nEP5h>H+pYU zzh&YC)FeK!OpF12#MyTi=O{3A+mndQ zNlNr)AiKQw!Y8cGVc~^{O6?v>0NFC=Rp`q-8^CB+*Pb0uK(I}(mwQtmyV$y*t;8jd z^0206F}YG0!&u3ee7S=(oA{UQL(Q)l70yF~4Ti5PtudUmzJiAO>&I10fT6P?Azpv- zY%2LawCB9m`?Dfb^Fj>8&qlMa(IH(DR#W7FEM(02&ox{mtQ%1C2K$bDZn7d*dgAC2 zd}=H+VfXfiPH>-i=K0y~oi5~?q343=i_tqinjzgQJt{|Z^>%W!r|4lJg1JPuhR^=a ziH)}&HtK-bnxfRepkke3EMuI$<^NMv8C$LjbA2Nq$X9P&7n`9@VJ)mS_mO(%EXsQZ zG{uSP>%^^+bGYl038W!6k4}u~hXiqqxSMHgJjGjlYP;-OTTd9cjcBVVbS*K+LkGW$ zQjD~T@UR5`d?Y0oz~4l1RQ*}_+PB{|j+|WJYnd1~a~O4~&yaGNB80Dk?(T(|3j3!O zpr{l2%Dr3907if-II5x#o$N=#d@zn{q>(u_Pck1FL`KC8A7bQ$F#8 z3noeM9DUJZ`XoDS$AH3J+>dAFLqQw2iAx{9caX?3_3KAMPB&e)_h{_Fi0KzpTqJks zyZ3HJH*|%nS&BEtc8iNI-8~0BuDDCW=+hM;Vmv})(Jctv4wbK%Kf;DrhBa>?&Vp@Q zXL(012{VZ=5mB_*P?w6!hv*c5fFNxVd#rvu&zEJgwq|67fOq(&wsh{(9b&GjqsCykiKO1y5*m}reTp;rWm~Tm$R^! z8M2exSJ~coa;){?ab#vD=!@Bc=K~()_8SHwy8m89GbUJ&#{!JJ(6ie0mG9KKO_|bS zy(#|MR_5D}hb`Ie#0hwMQ!TdXxtGcRI!IUdi(UU}l>g0E-BIx&U6qsh>iO+oU&QUQ z|3%z;M#KGnZQoOrh?Wp7%1E?Cjh<0vr059}1W|)1L4;AGjYuMTi|A%Tgdl2+=#%IP zhUk6t(c573XZ*@_UH|(j>waF{%UZm#Sc~uZJ@?+nXCDW0c5j;{FT(aazf^Zq1&APL zf#@oqR8rS|Wqy0)12TSysh8suY00p2%s0gTb92RcJun53Ax|sr)8N>(X4xA|!?bdf zS;Nk~KL%1)&U+*vsjmUE+AiSFTdDmq_q_PH%Ml~%A&U9h6cXs8(Z?w<#i&%;&kfz- zFo%wCc^{RUz)k%}EFL0OBR|!Bf~9G$WD98q;e)B?wYcyUu(;Skd6o9qPN)=FVxdLe zhz3q}Q&;i6`(;)gyL-6BCvK=y&oR0hDP^uH85c-_r z-P+d@JBW@NH6dhNsfwr@!7M#jK328x<41{V+gTwuc2lc-v@~qF^x5uZJvvC>?9BJ; z>aE)|B0~5O;K|p{CalmbXaam`dAwwVsGX+O`xz3`6hLUiT#*kj0L4Q#?$~XC z-XS~viy8t+U-Axr8P&%hb0b*BH>&De2eL*3^%=dZwP!#nl|VtTU1Cf&2OcRDo_v4VUGW+YNxhH0zB-u{>L#!&mZ*LDWILGw)%!7KO#qXzsH8Q+|3BWW9hW&c zOb!QSwJPqXP+oPr0{m0Kp&wjbG?0J%chymCs`84Pm#=5#_H!3;6VzzBb%1xFM3h`z z7%ZFdMPu)M(8ist$FBmMBks!FSbNL)+_-n4(=`wg*p)W>O^g?Kjutbf#2CYAALeG2 zmd}Qcw5@t8!SMe@w!{RlMXWU9^j&;o603LMH{}HRfSRERsV0yd-#i-OvkLNa0M)u4`{z9*Y2J80C36lS-ut@wSt2mYs!KvG=|jz zdHw+4M!coY7ve)U>mF^QQ&3S32nGQzwRZnuGybC0{wO9t8pL}JmDdC+BP=JE{)iCG z{76kYXC>IRNc%!X|0w=GZNscY!71(j%=pbCB!}&&*Ro6M8(KCw_&vG9c4c_`!8WsE z$qtK=*(SC7oBPC%@)K^Nwj105UOUhuY5>Ir;6v^~!oBD?3R~Zal+O_C-9iGc1*zb6 zu8u)@D_1FZj)Gpq4{iTw5k}qW_AMUtIF#<9OesYlyDYB3{ zTu`Ru{8M7zc;s^2ig05$@NG}8Z=fsKbER%?!q5K2(pjI0i4x<@psn^;fJojKC-%%L z2DGUK;S1-v@KP$dB{_&$^tQ$y%cIy~Uj>fP%&OuTgimS$38a_-pNW)CCFeOw#N1)z zRa@KNrnZ78CUpAyD=6DATzdwijFlI;&+SoY=sX9y=vN?I-e%oVGo<7@hKr$)M8EK#~iwk?*me z8CP17xBE)%s$!aXCEU5%_z|oh^xq$MzG21SN@B;x?j-{Cev$C`fR+pWN7)GzdTVnh zgty7JKn5rruYIKfeS_;gC&#aOPEen$n0UZr{xrcQ&INvjZ|SpPAW`s!lX+7u14&YRbg89B8b8=aJO$)A4f{!*Ay4oa|O1s~qy9V_vV2 zrNHl5OZ0hD$0vtuvLfoevezYFxP;H1e>n#)by09LwPtr1* zsn?7t+d)x2b%iny91S~M`7=8y_UBQCko+0@ZiIpuEC6X1Iygv4&Mm3Z4MDqmzR}~v z@wBpIBLR~(8}X?|@09|Hi2(?j#}~1}EB6@+^YaQ{y`-zn95q-wU%~Mjm0-<3J@!~u zq57)8_xYzch|!8`ZHN#HqCFofxX$@`jgC9;(P)%QkAbJUoeKA9FV5{-7IYwIDq*Hp zd!a8^J4o(}sil{U!|J2|Dp59+N>sk)EqgJ_3?!PbrH$Cgz4xoa+=C@8Js4?_V4V4U z0AuZRAa=iP|7+Iq5cPf+wWvg}WIAI>8-~e5*ujgkO^aX!o~7;s_G(=$DckI7V*%#x zlkqJ0OF8oO_w(sqWV>G~vxBh<>_+bTdO!J|lTFV)M#tC)W%^i8WQi9^+P?c-d|on9 zUO31gQp2KPqiScs6ya_mW!axZQQ;IlUp|Ww&W)qcsSwfIXfg$v1sOU6ZhB0cm7a4}F>j9C~ayG%uDgub;!21V>&duRK zpSBPA;L5RQ5q5jZUN}?sC27D#NC!UM{_~d)bg`OT{qw~plB+GNb&qP;xN$J-8-Pyp!zHyofXR7lB9`=d-6f=uXelI3D{ z%*{TD$JPnLFz>EXH8#XdN#n$DI-<*d>*W)FgVa=S+n)*Cq~LV_r}x94uf5tRKhdM3 zkDcv>Cy1Q~IoBmIA02Dwm0bgT2gmmjT#$4wt9r~87RbDqDItW4WB-kAAv$KV#pz{$0A%j+}u+ z$Mka+MPm98Wv!jH-;LkD)W@hwUsnG1Wb3c0rB5j5_^&FvNt0AJ>x%im!-^-@lIY@N z3;st(h|a%V_W0GKhl=qH2_}=8XV0;F??riv+4l}|j~;TMZM5rRg9_j9=NgIusR8~T zl!6*~ZL~HXtaw#2I>r`;Ze-_u+Z5P#x!rY8CO}{u$U(}}E1yHxuPk$I=-js0g4D@z zOJ##afpoq)>_LPXGty6cY%7O-=CJ>v;-tl~(sy9;mG+`CjcL@Xjdn|1+z(7p3y)jV zMPH{oD%|_P2PB`*iQB2(yM0I&=S#TL^S(o>S@5C-hYn3cWx$0*i>UMHz9Hg!eVulk ze!@{JW82RYhp%Szddj3_>NIFOWL1p;Ib1^q1m^P#ihki~P>!U0FR<55Di2yejAP{9 zFgrH=*HsVy%44Av614+OL?upHgypE*}pxt?4|K-|3)2kVaCwJCKlpF7;xg+^FC&eC{-)e_gq1n{QDg|cd^EF!ZxID@)L3AA0 z+~?CDx&v7Tzu*M?s-M4J-4bgqJz3~Y?0qC)Mz$qEtD_vEJso{0j=wDF&Y$n|EVWzJ z|L-^SQHcuW(yw5KOtCuL2)R^gQG5D@%*P!Loo95(U$>F&=|8k*b%NXbczbKS<|Mav zLAi6z$SiZtvdUfc15gDi2e_Y=k%{E&f24B#q~hu4RprIV=!FAds531)v94Da99t5+ zd7#+(yer|&@f{e>7m?AWdD7qSHVfaMO_1)UTG3w(VXIN3&f}|Gm0G|}^7sB^gSafa zSjGm}ENjk0{Yd*dl*Dt?)O7{HbMr?K@x})(Si&1~B&P@X@yN-GUVg@5boAH;FcHg3&JO6|3&)3~AAN_^IWfOIe=Bk{C4{3bKA*J@my6|J7 zSsc{{C59rF$uP@$Wm6qu%3Mq$9CqJn=tTDe7pojHo7*Z?^bl&!4a?^1kGGFx(2!9F z+sZd0HSE%uFbS1!;R**;tDBoHc z(&Oe19&ZD1E%414jsx@CwY}xeWgY;skro6(f{kRm76Xh;cV1bqAFA>d;eS_XAv-IY z%jYG~D}&9{mN|F&plad6TeTk_jllMXlq>{!Fuvx6%itL_ONmv5G<@mQ@XNc{>3;UDBZW}luO3Ncb3abh&1dp-~?mP?XB$p zswLV@Ri;g+2dbBzW+c}33zpY&TAsax6Ijn)!UTENVS%PMKv@1Jfvn&w zNJS5W0H7#9x9EWb2x+jSQ9U!G@X6IIhQN+$w>?xo?%orXG{t{84>|!*8LR_X{2!?@ z`$q~$bLeWAJ|4j^;Ls4I%|HBOZ1rRH*B#va2yVbilNnV5viG^AC?~rD6`CmM% zEIiy9v_!ekpeX>;tNV`AtmCR*ti>*;fjC9(qWv9$yUSNm+ZHd!L?9b`kLq~dQmO6tIlxotQDNU37Y`P)R= z)8P+tB*nKAWY4_h*_YyA>w!09XlsFnf(uYVek+iyl-Ujblu5u=8eUBObiSj)^KxWm z7@X2X%iR_XE9ttqRT2Wd^`VqrFO>QvM!Djv;OKr4JQe1**-$?pzD^WKvdJ_Ii`kj5 z-|Z<(>#-c;1Yg40Bt;bgUu{~CI*_~^XR!@V%YRVg&s5EgA_fBgyJh68rxeyRV({2_ zMqY!!?8*OC90w4u_1FCWuZ>-?ccoP4nta+L8Kwus|NR{WV!XpN=u$!O1%5l5jQ*!m z%Qc$<@{|Jd+-`SN9?>Ayu^>EKKzEjD4bZ0R-l*!x!#~h42bv&c^6ai-ZpMKB$u~w$JYg=sm|bQgrd7bv#Gw_D(#;zDigUvy{{1>ldRs*&0aA9cfCo zGCUXZtIs(AFI+wKiR%1zQ+FbcVzy})>HqsQ$!u%RHffFqJ1)EY&E}75D7V)=>>^{D zdcwM%?hQ+6Z=L*n?c;91?b7xY=xK(0y$@z`n9k?AIMRm5%V@b#zCJR+F5b^q5U<@+ijD&J<`GY)1fHT;sLsL*9JqZ2dkm3Ghm0Z0S~J3Q`;k`Juh zcN}^45N^|b1t)xX`!lOjGZ4*v?mX!{N-(jk5YX5hku>|PHV2n;{zw0E-y@o9rq#q@ z(S%i-gj-VMGS?c4wP04XZj6APS~V})-*hx za!Jl~_~BO$8I1c^p*hnJ{|kLPAo)uv3G21K>DnR};Lk7z#CsL488hs+S$Cl;fV0 z%_VSiZUETmj^+mVn!!O+)%OAXlbU;`OTbqIzA)}ua(YRdOA0mbhN$E*Ko~Z<_Mn2% z#IPT5X~+VF`Py?#YK2euZzZ5QH2o$Qsd&5Df@pk@Tvmisr{Z?rY#UoZbty2Aq(DV{ z(McJeXNOoJr*S(D09W~9l*+31=hLLwnFi-$H77geM{9lEK!eVsQ16pkQEKI27GZF+ zZW|?*(|}g&xBL=;YYTHnnp{am@Bl!(dasJzJL0&Jo4pjt9ho(|F{-tTr}lnz!r%n9 z)5B)RCT#JvYVDua-M0X}+S*9Y(P?8MPzAu>_N&N&+iPgbNyQ8x&THRlpj=^^uL6#A zE*t(_@I%E-8SrYqy_~0s7W&pC-acHEgLyIOEe9rP5p+jsc4gg zrug~++67>owU@{KFWF6Ih51{Ha4AnmTl$pG`EZlmnylvog+!%}`w(rXVi)6tAp5WP zJv@5~cK?=Z&ScD?60z7d6ZPJh7Pa1JMiEw-?BAG_M{Xi#_sk2u#effoKOKTP{HkKF zOla?1TaD3OWIwJTH?W;|jZWpc&o+Ad7XL$Ux6Mr2BFt>JZ{(?PFMB!!uzqN#h=g}- zzPGxZc4LY6`Rc=enu%CZ-jAI9dhsLTc&5@gW4lje&Z{M9?9%%&k0yGci9nseI3xUM zgU+`5x9sPy5hvIShWe<3zT7Q(hFC4ni{0n36vV2tT}Wsd`bmd{-)dq3>eXkb3nLB~ z7lA5?Cq>n*(s=%(fO<)nT*AIJW=w`k!cZ+A3$mge4+aY_ot&(n21c!hp!OVEdHkFa zlM-uAC)?DMIJsyrR!xydG2zfEQj`{T{*>Tt=(<2l6vN2=avZU8n~+0MlMcZ2iFbkrFe8&yj%lDxw?= zQl@lcHp1Lg(3Oyb-T8w{F|!xbtZC2r5fmpf7sO74uaw^tL+eyb@^y>JzZV%%Ey*kID5eK7o zj|BK@fJ^hAeD+dKhjk`znJNx4U%upA=Gx(6YN=+qKFdP=B&mB8idyV^bkrm?Pdgs< zk=YMlyiX@XA){avT>W|2_D4vkpy^TmuXb@XD4+b^ShHsqBfaKIXfnQZG22fXHXw&udw`$RR71l@>B}Qw}{q!uAxJEKs|f*GuoCrh7+^}g4dp{W6e8R9zNE| zZ1I&M%%pt-uouI8r8q;VtZqU2ZEZ~X8$+mhDSh6k11^$h z&B6Jyh9=JR>_Bm!satZ@*}186kUU<8s)B~w@^%m+3YeRKNVQOAwJzHUxD?}K98Bh%;o&KX!*{N3`G zw6K6pK1PfB0#=IKCrd_O9*Ym-v=t8};IYA!Tj&K60w;Fgo{IOp6~(pq)~`hd(mHVB zWE?=`n``}?9d-HFA-We$^T_I0<(5(r3&cXlZ-6$}UQuU?q9O_ca4k=bi;J^8G-vwm zYr5MQOkFQKyx3(o=+Ob~N0K$VtIfmZjzqkPEonQ&_Y%ySxeTiF7Ftdv=M|Z$3){bo zSSf84czGIki|OD~SLd3_&2 z!;Z_pomYtvWgg$z%EhE^nnInE@V8xMv%QP~8+Uw{HRUJ)({CntU_c(tG4^}=bWSas&3HTWb2Rd7Kv7(Ne)aR`L)3Y)5ze-tNTFjrjvC;}Z zabq3FBsy#ejgaM)6f;b3?R2<^)XlZ@K<6S3YIObF2h%NY7)Wh1E%3o=C@aU})m>7O zf93=4F6hE+y{&YvOGIv`E4QGx=nDK1Il4;^?H^h`}&}JbkL6zP$WeeDD6MBGgCp-*)4P? z{H~?cV95RZ;6GXbnR_HCpDkiGS^T2~{0CO^+ZNmcAy^Q6k}hp63DyVcSI)yEIcre?DY- z?0LxoQ->J0Vx)0y_Xd1G6p7dlT2dN2FRJq>^{5-&8I_zgl#By2A}JJ9$|~ztT{!3( z8QH0MAGU`W4YAXYa>natO%C}$a~C68)L~n3^FJlbhLpByDBAeB1(w^Z*6R=Ll=-I( zMI14rX74jAC~Y4o+m9-_|B2}!@7Z;*JR)wWLtk_-S`FPsnKPrU54FiePOzv?{J5gt zo9O6XdWi*p>dWbYOB_|!jD+9`06#nOl1Q&y(CG6@m!(SIqHAE$H(dv1yTkZoumUfPC9|kCxxR-8vOFew5F$!j*mAK1tVobpMp9KlT7x^ojwWeV`4t7_ob( z%Kbu9V04;Tc+;zw1Prng;rJQquVUwQYZMbpP-MhUAxv+B+=opeyaSj~mtN88pa+-+ z8xmJ$rm9zeqS4dImutiH@?)_9K3je|j^cI1KX$gZ{6?v&Ty{VH1REy=Iq-(H#w}PW&+O%FishhG-)DpHK83g>@b}~Do`;;8uH)~Vfux-BHCPU7c zffR;`)PwPV?(d+JWz`DbT{La4c8w60T4-}jpP3g-X(IRL!Cn9XFI&^&pGDU6vHLs4 zLCUS1z-I2CrI~UlQiz+Id6H~nXGzFv6jD(lM%l!?aSS{!AZ}mdlE&qYInF_IKUi`wKBa@oz7{*jIY62^Or4S}31i!E@^uGoJLC0n3Y>A(u#8t@1$YuD>5 zP%*FcLzlL!yHEDQs0?4Bx?#5YbGM7(Mu z{GyJ$Sxgw|{zGo0h~#gJCo^yI20RyqW|ynKzh8oJ!^Vt#?ir=Oo(!GaUi>q&&lTa{ z9ayF3rzztXvvX}?SmyDU)5wUO@dfgzw@C7pcok8oJe4gkRX^^F&iE9A6;P7>L}EuhoBYu}@sKUm$vGqX?_94sST zO!y3>3y$@GlL_Fms8E8NdrxSmt;tE=P{`L^)yF=RTQErg2 zHLd!BON!6zl={>0{dP$JzL4mzY(QVXtsOm`s z>pg_eki_%9M{b5wl_V>ATWpiEgU-zcFWTiaRCJ@IIU)WVKRAfz@q}cX==T1Uvxyzm z5`p-eXjb6y!o?4d(+W*aggid{8P9w)T-*g>)rmX>!QEQ~tW2>h<-WXiawbn zw6LJ(!-)M>08-Wo7e2QLeZOc{_?y^KEVJIWxbH!HC#z1^Q*6${j>~M+w_%iNW5_Fa z5ggyVkr{&|5tc=Y_EBOx%#9w5DL>a76v>KojMtfncl?&J&!w!nuJe)N5kI(T-r429 zhX~T+pf%c)72NJ~%#i=#{GvL84tl)rRD;aYJDs+Og;kPoD3_Q2%MGO;0Ew`ZdFjwN zOWvo;z4Jv^>kxNFC5N4%`IFA%mAZhN!#-q3BSvzYM5k;BWDYyGKD)66t=E3*;c~0M z)407A;B{OpQ0$a zfP={U!VYaQn5G@Fmr`6q!3}pMXFDaU^Rct#GZTgetK~RY)#cxcFSOk)EKR{$Tie05 z3Q+!a@a!ga$=B<_0`ZH4Ma6e@KV)?v?gf#G3uNnXIQagjUltII13r> zOkCoXb7Me%%u=(S@CG28;GCcbLs2{}`NCXnQh7XPi7%L>6pFRZp{1M#(#@h+>TMfN z_YVeTfxFFO3L%a;G)2RCbo^zdg=nWBX!)c4#>xiV(_b9`%Hp%#ya+M@43G z(ipRf9E3C1XVEGXWz`ULu~cUI*FV2G27FHS1ZLD$JiE+hC4<+3d~5PuBs83UuJZ(l7BhnV%0r-Vg6kRw z%I5m9*SI(CxLoe0oQMl^1jhJEf(?;kmiqgwaR<%I)s*}@E&*YzLEY`Olu8HWwTLM; zjM>Q;UY*8`r}IoVoV{CcHoRVG1T4+Fp6G4A%6RT-@UHC6|2RzjASbbne51PR;go zNrV+M-7ho0J>IEJn49Nk>LBl1JO-lyCmQ+MLtt>EzKN|ilm-#S@cb%22HbI{S2E1i z24Gie_<6i)?kxd17G;|RQu%Z~lb9=Sk zL9Do*?z*N09S;U|+K@y;U^K6-mt}D~TGdmI{I)io;5Mnl zU|;{3RoUV9K|j@y24(Le9Iy#V0`N)qZ84Jp?;MvKIOV-Dy1>#eBv4+7fI=pB9CG=V5CxM>+1jKyJNKn_|N$WF@A>UDNxtixeL+`_G_^tJJ%GCrY8V*h* z+IamsXLS3&?;OrBO0&Z=Y)*dLetlTfmv~=4zyB{}(4}|w(82#Cd5=Rse~3!0L)qZl zvzd~nmSc;6dbdMw^N}}`@}GSzM3x5TRwY{n&VAFMii9e!8PQO7LQc#d8}VFx=Wtp7 zs=g7Ai!XWoAhFdMsg9^mxA&4LT`@xqS<8k%%|n%>KLA> z?I$=-C$KWW5%U`C1)${;s!ZN4ioubcPhOslY2;AU=bA>QYnzntDnFH4e2wU-vEXZj z^~*Eg@7CpWVl$g=zV!Jb-m7j%kN#O+5v{bIRIWM_`-JL2&mUO51>s%01~@HoPRK9c-PKw@9*2SWUs0| z$FlIgrU#hqO$G%GaKwIjMXUFt-l4G66!Z!yfZ3twD`CMiS-mMLrRI8}vOR-3(zs^J z8Rzl`19gs$$%Y%TMv68<%4_zG7 zegl&)U_Pz4wP{2rcFJ)$kJ>2y5-F;^3cg0JuTZud8)X!)>z_^qbMQ`C;;#eRe0Bvx zsSKXf*e9L9Mj0-Y?F@|4spOf2z+VSLrhl*lF5u5`d$`p6s&~HF+SK~N)OmPpr?I9? z6q`=YAmTSt7dI~PrMlQetJ2Jlj(W>DOybRvXKJ|B!NgL079i5u?`ZnyM1Z!=r9Hgz zm)h;T zO@gwOvNz|`TrI#1arEcz3G$}i>@jkVy_HjVf_(uKlt?9gRFAei*-G-w=$?eW1bzkh zt6Y=W@$Mp#b&dICsxoljoj{u=ALQ~Ezt2z8ld1a5eWn(uVVY&J%o6J=_p6Py4F;ZP z*Hnjy(HnOZ(k^vvN?sVZ74hWTi;oF7fdLqs&IzqqDkA$c4O0=8|$ic#uy{ ztZAtdS{u=t`(w!|_%9idwRdJE$K?0sZ;a(XS1LJeupT!I*Zv5_Y76oSa$b$ufbMIt zhBJ*HHd#YVdp;TzojEE52SUcRiCDfPm?%m&i6_8W6~pA`BC7Orfe869+4v~FJ-!3; z9&DyDF+&bA`?$=g)o)8q?mD@g!nFWF1F^T<6#$X3ESFoGg3QC| zdnrfcn^O%z9zxjyf|Z0n^5~jUf!+heQcpyT7?4ym!SvWcQ`Z{V;FRrh9C1dm^rP_R zgx|W0+bG7cFLaw&QOA#-52jwj z;nD2iwo-iqBOsEb*;qN=O-gGxST;*(9k~1=X@ba`U3C`)1SlxtIHjI>Ea(R`QUO%) zjJ$LupBN#)nx@p76t<~C1pG%!WH7ja9_z6cP7NpsSCFYC*zmm(ws3&XD63;&f4mU*^hY8yM2E2Q_faU zdcP%H!eclc7QMV+&dI^iUhf8r(cLPIOa25tETLEMXO}T5GENNOT4;laIiKz9^OO}X z9}UfzAC#{ffIJcM0iT9nE~J$=*aSu^Knn1i7*D#LS{sp_Y;Y{oCBQWq1YtB;1hGgsy zX*@ufY22f74ke5syT=O$Rhsj`e6-x-DdBPnTx7nwJk8aAhLb~vHWqZ;(=%rR=Z#!l zSF&I7b{wrYkV)iBVKAoeD+SkIz5z_8%A;@x$bggEx&H*U{9!g$;bB1zntPjnXsybQ zfhmNrx-=~1{-L_LAk7OVZKX{rCA-}5LNoaJLj_)vClE=tDWqGL3q5MR+jwLG(f-bX z-N7PPH=&I$rVE#cxCgAX$R?lX5FUTJjqvlGg(?Rz$}%i=`C2=kbnwk~s%d(k3kN;RGmulC?U++i3{m*c1+zFS{M^;mgj`xU~yz~Znt~2z@FL~omzJ2yR zS@5C9+VPxj!%w$UJ+B|6=m&P=O;YA@cRRVtGD)Rc|J5OJ#!!y+R>Mz-BY_Kcb8`hv6U!#NuYW!tQm&My7R>>hwLW+K0X_&2dk3;jA1Bo z<%6McXMx=jW1rW!MYw1~=vV$+plAHNv)FK?J^y(7^i4d49wq;#`PC6<*t33ci#Ar< z$8T|ltKrH*HVPos zrkyF>bu*islv5wioX13nhE^&W_PNxI<5M1=*>Zfgk5CjNZWey8S+7@IZeh60jWnMy zgll#z-J#MvMKgAQ+ng1G%FS4a0$gG7TPb`TaY|5S2s2Ze4`<0<^fmr19s4Sj%B)0o{%Mjqre&8S&(EQxGi%df zYEhbl!0`Gb1hvI!F>!}XybLS;qs%!Tn;`uSgZ9*4!MA;R|#rd*wR3W{r5lALY6HFqe}B>O2D znw9D*?cGcKonu)gIy&n&d1%3da!DciP*VY$HzHZ9!8r`@qjv@m_J-4u-aI9IJYK_3 zbGZsy!rBG2S%v(>aih=kKiFs!jSAV3u#XMD?jDVl=ApJ%Tx!VwbLeGvv?^=;lX8MK z&#nw)(_<`sT7T2AXsVU1>!T1xmuxjQZ+S9jDFttBX5g9rp~Rf6V*E0$z1H1AG>bY` zAQX|>l#om<3K$N~Lw-Bkrb_o&u<;_Yi@>!b={!%Gg2O?6~zX?kL-ANrI!~YBtu(vr?g8i07b== z#-qng-zp+-*%iSGZuspT^6-@vz1GZQrh%+nKwL33X~5xGxs}V+k7IA<^S^#yyAC{bLFGAJcQ^NMP>|gDP#5ig-$7vhzD~2{HE(FUYde!YIxeYA zLz$2VBO~24VjHBUD#C)F0Vy`4V?sdPFpP|t%Z4Vg@whR34=IxDIs;O=Mx92cb#G6) z@zU$5O7;CV4)YK5={Jf~qAUYYISU9rc_uoN;(EX-oPT2Q1^9SDl&103nC#B`cc z1u;#Zo;{0-iBVX}JIY4-^B&t5fs&hFw=4wuSh;i``P>}~GgZl8zW^EV?c}N1zJf9> zQ4Q4jAjY?vB`*QI=(mDVr$QKT^l%PQ*_LzLBN>VIgL7Y|wU~yWlMA_n@skoJHkRn% z^S4>l@}-B~-zNZuQphq@e1I2%Jouhp_&k?!^v5fL*gv>DWD|4044#aA53x-d4#{lr z^;tz=eyXi#7^(29sL%0SMlj!~RLbCkSeAda=6@Lr#)9rmGqdQp`ZU&)BX7;p4q$_| zJNQbwSi`OK=$5-<_*^(rHxgR!zaReo^`ubn(@e*t{GX{n-mB16Xkg1bBN!hos-V8+ z*ss!lq}(1Hi41pK*7DMjgPj?i(29TOJtPs{e}}^ZFwN7em6IQwL7y}?(@!Q?ErDvA zu5Dp#X%S+j4rveSJ-GB5)%Y9>Q~}Apyg$SRNouk-HRnAC3W2JX4yy?4)UpGRx zk=M}nP31PoymyBL5sQk!x;0Oz8>0p~r0Sg2rCx{FQL`-__^!7F-5>gZ*181sqhYT; zuUI700vWDfQ(QNRBi+me&H%cRdWP;Q(>dCx`%b?5-n2lXD3n| zOKrM;QS=7Ym(#;6FiDg;019BR^_9ybL>7HvCPTJA8K+1-C;#+mit&vK+{!J~J42a} zz2D^N4A;y6sCDR_C^<^*K{pL_IzSLWMlh6noNEs0$u#an@`3|lVsBibskI0y%+-AD z6!KMTz5vKdMA`&haB-jmWr1tlBCJ&-GXQepT{?uYYD z){VyR8JN>;yG_1B-7vksOW|6lTEFTdv9-Y+@AaPlv|A}^swZE@aOb~r0Ej(xO&IA6 zbw{!Qtv&C1Jq89t(Z!taE42t6uzxbl4*neS#XSiYTq`MRF@;dO_U}D>bnAcj9zLh# z4k94M1LGKP#=YK+CsMupqV>=bJ<_)608231vXH$6V2jRv!`Q8Ypo7z!S935E4H`7M z@_7@iDAzQI;Fh*)?ZQ_Wu<@eutgbUXS3~%PZbZR=cxXeXm#O`*0A65EV84AnJ*nx1 zL37hUe3$kHxZT-Y(6Qh#2#X);%x8V56g0JSyG8Xou1ksHeQ$Fq?ZjBwad3X>dWG1eMry)hW2dA}`sZXbIK;JRnBzQ+3=pC3G+h(3Z8( z`do0M_*O%Pq!W~tPFREh;FD@z<)y86TI z?F(gwF1`BtK9Wn{pIwSx+ce6U4C=(XCmJqi{K$1Is=1w=AHiQjCe$!~IaNi|di@T= zy;H|19UT+Tb&0)JC65YP`nM3aOPA>{gem(UX?>Hte;xbVrg4a*KWL4tSrqYgXtv)bxXj+UmOgd439Y*80sL zguXTCc>rD&s`zR6xqobhJ?V?_2j8yM*!H~qD5$q{DeS=;m!vEzmSLkG`mK2dFEbJSVQ@s3nrErA>8opI& z{Jdu|;J(K-V`w=kAPGcNAz^N~y3AC1V3(x7}@;dri67h-;O)=Qc0 z=VkMcR?U2-GJXS6T*QVvl}XVq@%+ zr1j~SPmNr0(wF1cGr=}?nO-BGgl}E;9C>WX3?)nT>bjLuIKDAZzk`u^?qg*V4SOWc z(o-+(Q%FJFu5LJ7X}`IDJmQk3J2+c2&!OO)KYn!zsXbV;7A*TX=4d_7 z0L;HA!E;t7zD+iIZ5Qd()$1Fc1Z3R$;nOR-7@hHENZ;yd>r)A{eUVZQ9k0OXE6Lw0 zcjY|ySoH%Bj+KC{#8!X!%caLMW67>gr|jp#*?1sGH-bX> zia9E!_>K3&k4kY$=SDLF4Ar^ropKVsI_@OmYsD`qMLQcvH;Ni?wJV4uz3z{W9)sez z?b=OezjWfs0gCC zB`B$KRrlh2Yx`WprS1rEJZC~ zw*&m@mY@N*$I=O0lKK_I%Aa)qd_VA9akBSC(mnaHhwbkj@-EObO%&7K&%IhNL=?OLo{gg`#5cT6ebzQ$6|qN_>NxR_G_u4TML%aa8$K zp!NEbHS(bpT%O^jy1C_UfqtNSVM;q=8YId(n2!7neY|?ZI9K*C?}8}@!)}2TKRHRp zngw<|B12R5r&EroC_E&7n$ir7c>hxEYg&8wjTon2^CxlVh?pU7YCi1*MlcU)H_83B zt9NsR19`(Kl-BT?1CiS%vpCyy@w?}B)7YVrIAGI6Y~;`KH%{Abaa;hq6kyOv66iE( z*LQjr*Pnk5lRarmmQ4ukeR`~TR;c-UB51RE)~z6x!LIj;XV0^c^kq|ybk9tr7L> zVB#q7$tNNyy)-IA#2Ka7an(_JX$eHgzZjx4t%(=aeTm~RW;*qX{t?(I#CvQh9<}{W z6!Hp%-NRJaG}w>`S8~OEmqdMRvQ!-0+-rdPJNZu*)Jf_5mkeLe363Qv)X3th~y%D9n8%(2KMg0;BFU1CL7cGyw z21;m@NtfXu$jYvbGl8^x_vgnDmu2XOD4FigX zs{!;Bh94}|^+G@L?JqrTk*))6sbq3(JBbBaG01}RC+#7$$ z`V$qxn1R=?QtLqoLNq3sG=!rT#+ia4?Wku6m~V|z4@5h z9iACW|7BS|lDoUh3182ShG!j$_Og{oFOuuT->~bhOF^~FL(n*BIQ7bL?Wmm7=a&>& z)?bx4yc5z9?h&2YuK1ITdMecw)vTExE#HXam$0nZyYA>d?VLm&sv^jLi}2&%*Bj=debuC4%szfQS=Y47v|voy%p1Zq|2uS{++5WE&lbR%t7vAE|HgN?6av#j zEOq^nvvreko^2=L=Pupd@+y8C<|QvR{iQ!b zw3;FE+6pyIzx=2$F_u`q+Tu3u8ES?c6uyML% z+}V^Ja5hVToV1$dMjl07^FW<3Tk?H1FgIQ?ck8z()V|v7!m32hlLpV%L!Zc?_46>{ zH8=U!o({>jwGb*!`H87XBn7;h$JL>iaB_Qnm)uheaR>4B)DKt%G`@4e%xv8X3obb5)oCSC@()ARY1NLh`zatNTEhC>_IQm^=+WK9w-+`s=~_tnf+ zaU-K)yxD&QKR&BD%FM{4SV9p~%aI;EphZ{gW)<$WVBnJkX z7gUn_K$Xf{NO{KNdH6FcA&_T-ZyW{qW66n+!cF*(OvnSUE4<`{BklRW&pJOurSSPMks?&h4RzxfG>E zw0fLo+Z%R=U_ zTvk#$j8#F&?LH^S2xFa+h?o?`R=HkLlw34WI`lgL${d6#n+MFEze!hNEj?~L>nT0p ze?pTGhmqJc7O^-gOL0mt-e~0#MJCjK0PugpW@!m}*67W=yuS6x@l(Cmi+bF67W zJ{dm~LU*SWP)&2$F^DNE)5_c_$qoMjHw#r>%24}w zY?hQf&JkH}*lQQzKgt5j@OZOTzd3uUo{EetlDPSF3_jib)rWKsBEh{eZ7D0!I+sH* z7qN<$+no*~&D7=z&BH}kuhCDI@5fU59>KGxv!<=@s)XH0>{kAv@(e-ps!jP~?`>nC z_MK2dGSxmcd`D;YsIGdUm?eP^8MiY$_kGoel|BzTeas}8cjB}oZ9B((ZNbkTrc`g+Y3 zE~~m*w_W5*nubHLwqe|M^z4++#ot@dWCm?aPl5%rl|ps0i1sYHs*Eo9IaBM37-q7n zxZUdWRQDZ2shvE*II4%8#vy#HytMpD?6Je+IEV9?%HgnYqM>*V1Y6%|T(Ae}Vk3ZB z{3*Esg%;ys#D`Fgx%o`r(I)n^tG1e)btR!`rYv`4w4Ljmc4P4sN@8Wxf+deVCZ{K}t~!UEC{U`7Z+LE>13Ub*3-2yM;yb;y&`OjojG}ZoIX4y;z zKzuT>Db}7Wh`kB9C7wE2C^ECgvynl;5r(uYjZ2%KvZktxN9h=zh%8)dyl1DtC!~!MoVbjA|SK~f8Ubx-0xTw%+nRV$RwkW zt1wfjq%L=eG8JQCJ4;{%^ITm^y-Xy-ZS7gaVlD@g)=cn>GktBfl1^q}0NA!fUQr=6 zGzwe70u7W zerkPJmh796HDI=)1}z7ghDndHQAZFXXCd|L8=wPy7Q5c{Np8hf^3t+n#BR+i>*>@- zyn0_L2&Kkt@kPeMV4e-jWq8nhB+{U*k}q*MA1mtLA2mS@ki4-xCiH~Tfo@(ew8Sx^mn9_gu8L*Is}U%^%{RRDFx6HP)q5~wWSpr zTf1FCO;lP72c%s1=8>8(;q!KCja5=z@E*3jE^`9hiawT&9iq&627Ki@x8jz(l{J}U zx3CBwe}S}eL%G1LO?wn()_;Q-3{k`3^j-n6b#AhUowMRr=cmHFieeMJbrS}&<~+o4 z5I0=x+$rBZJT$M~@Y{mEfMOF_XFciW&+m4gvbbE&rBmgj0C0FC*UNYK&HNN|EEPLx zGo9OBUucp|^>@4YBJM5Grp9@=_Uhso>QKF9!C7uid&8j0`ti&wEmTuO(cyy;uHfIN zxYZL^2F;n#b=l%?qI4 zI3rnF%p0+3W&NC3!LkKcf4Kr@TjZnUm%*{S-!n?woEX>^WBpJd%X7hXnq@T-_Feo%2+Ptc>DI;D5dkjJ+(pgA z5Y9w$6?@my(zu523|`qRcA+eHfI$a<5t(QLaJ2?)FDbu8oNQRn#v~Ip>A-MU;{{=p zE!Y#snokD}?5dmG-<;C?WD|z0_Uksz&FKi509Wo(SuOtLy9>8NJkrx=*=_JEB$ZGd zEm7a%##t6Jn;XnnJtWUa^amEBC*vc{)-anCLPSbU@MQDgnk&w7SKZ7$YtdObt^ z*-m>`iKI2}Lj21eD}f1|Gpj-v+}myD8V4LQBxeOfc*CRC!+LGqTh>RtB2?@hA3C)-BSf>(7$li#yf@eCc=HTL z@_k079eQ0~u^_>f(h$4kqw-rAsms#(g3Dbsr{lzX@X=Y7?GDdphN&j8h2tvd*_RQJ zkTYwX8v){HO8e9;+Z$&egC9IEAM60Ju`J4-en{$UWNK{F!Ox!dHr-F(AQkCp4ArRZ zI5z1#IoeWkizeU`gc=JE1;ddA;~~LaV>vySLIa0F?e4W+s!U+^=if1hDC{+%q}*Ts z;=-im(7`hUG^bmSGWAa}uB%VaofSb%P0M=}oLEf0O%82~$rH+dfiLX3ltwBGh43R9 zLyJSf#dk#MH^jU3;w4T3^n&vE?&u@bsaq!VUR!-KaetW-KR&#LUwuC8Nmy9tgt@cqp?I$E_yBO&Y>77j^6I>_MJPg=yb0ucxYh)fPW%<)QTyT7a#g(Sm4JjLnfLSZ2q02jtn4u`BW2 zx#I&C$pg|E2oIMA=M1+_d-KumW6cl+}MUJ!WH5H7a| zEC|CE6)Mol_8uAjw<%+<4hC0esuHf__OF>48PWC>@=S_W@9@OHR4fZ3cFe%cW}f{! z#Hik1r!A`yz@^q-t8dmri;T@Y+uOCiqI#-CvbL)-1jcyT*Y<+ZXUDVmF-k!yiah-E z0I?C~tAz}re?rbaap5el*Bth^h$gepoK5iXb>4H()%i59i6|id6U6Xjx znwn{@VNW=O=Vf=b$|Vsh33?UV~ z%8<||yA_(>A4yO9YMV3O!7Prdu=Wb(Sa2)Fpvo~Yi~Q{xsS#kso??%VZocX1I`T$wiO;AkO*%{zAO&`a( z)>hAb>D(e%EeCm3t>E7cUFyxtqYsHrnbS6(^Y!_*U_kGbfr-Y@a;F_XchP*_?Y4?n zFvr!qi4_UMt7?^xUNnt{dlx0-KOkb0ul4>Jtq=|C(unL9!M!ZGUbwWsdm{%xV@Sm% z5_&d1fkS@tj@B zXjeFNv~~=Z5d|%(r+7hLN`q({2Q%wR^9qBHCFn1H61}ZXc>t0*OK}zs;3pdEJW|#6 zODAQ0e4YuddSKhC$*~Z5r<05kCn|lslLAYf z+$o9d4!dqmjhM8vWe8Al-q8xEwAf2bq5fkApX{#H6>TV|+2LEDzn^`M$*eYAA>Lhp!n(#3FFnmY_*c=D7ZRUB}UCa10 z&4Jn6^%WoVAfiwCQ~Mrtg4-zm5g(zs8;b}EOULhXXv)N>PwNQG6r9osAauJq7mB6H zUNBqWyEQGjO&3@_kkM;V`ZP%7A66wJpI)5N31taK@IMvB zj2Dr!3z$=8KdQ=Tt zia=w*nN5x=2*$hXXqQ~*uNA`Qf2ytt=rF8nU<^Gv?VHkYt3 z+fn|?bF%}Ub1|OJLVG2%ir=x^$dzBny()l&X_;%D;O(mJsp+i8ZuesEk;PGqX#n99&o$9NQxB{ZV?zo2 zfYwA(epq)1c@A)%_#y5Mri=7lJWH54EonZ|W~-V7YH(>PDCHLUmD*jnRt1<#K#nJh zW7Ib~*@CK$iyCkKjo05GNsoN%m_-5HS&i5%3Yv3mJKlmXa^EmW;mS@3`%^NyCWJ@b zQNTk)LQEa;QYZv+{6y2c#s3ZeAy@c+HvPF21%DuWBK*gf-i93sVDOT-uj2pK{NIp$ zcMB5fT+Sf3YO$i85ZRE=6i~vbHd0)8J|%rHdp+Pbtu*hp$1>!(+ks_!6}9=M6`#Av zdCeZD5v#29V<&F*b?Zy@H12VeueRZM!JGbteL5>%aPfFxLzns(ebw9hM4yaD&_ZzfR-591b|<8Ca3$0>Gp>TXD6>$a_sujc;2sF3pirnPw-`Ugpa{*a*f3K z59LloKX}c-wf-He`QT;kfi#}MYr#6D`HBt;9Kk6K?4)6R!>Y$GOU-BZ#{mTxagd*g zxWLinq?o~1Pb^tYE3m#dnFE0e(2|-r+o`5Yrb2F}qR6SJNg>(S)&bWzWnZ`H@-ARg{?`C_jm9OvApR{)Zit0)m2ImC`@yp(&Sl4X_ZihA3 zGrAdR4GU8^y;rVeKx~tn>@sIcjP9tp5(Klz<-o#)u?`gdyQ177lfD`pFuggm$VHe6 zs6H~GV{xuNnle@u%@F|s`52xSr6*snG$~q64%~?31NaovV7+njFS2goNogf5xNkNaFHI zec>a^Tj7Nk#)KNDwI+e1hwNbWnbqH?KNi+n-n+2YkF;wpnc|6aQi+6X^jqav)}hKU zi|z@Dc*hm$g{~(aDSFv67f32NZXpP=$Sy)4U)F zh1?-Am!+}iUU|l?$<<6BbH1;Q1ku?EUho+GU}FO1{m*gW0d!82+nhgt%9#2MU!K)? zHSGw|pxr1ZE-;BlX&cF1OU-GoQH#-J%riRkQ48qe&eSTf>Q&4QZh>gYjUWdMdLU~- zot$T#{;|XFCpnb2X0>K^=vf);)y>)*4?c>5cayf0zY(>wc$6k&>^Ss<$)EV@o54xT_UWn$EpDd8=>{&r|YFGGM|aXa5fe%J-f@EXvxt^x^BVlrwz- z!78n9$ISfnr*mWmcR2!z-vz;hF~2FEgu~=8-}R;Jy4ss_?@k}lL5a5_rRShrh4z!N zPV(l1*|QFL16@~MhN$|p!rSxTXUDXPm5yBy(ak-(k@W*073u<3qg@W2aP9lKeG<81 zeX&LZM>HIaDgF?<@}E>FTr-Agi5qBWJhg)M@?;sA_xOK z?b3Ia(^72%Fd=<_?>!QZuW$l?z5>p!0*^TfCqZp$BBx)oLNJS@W^NYHw!>WgDAuIj zTQGU_`-5Kchnb7)bR|z`@qL|{dWr?@ud?^UuqDd=j`?~SNkhyzz0xec?=EbI&Obldu-K!6f$Ii z+ee>VfS%RsxPV?JZw9Z^UDhtwo|Tu*KdOP$ZUou?f2iOoF-3RXz9LrwNjuIL%7V zC{MeXGBWa5eztHjYE78l-|{g}FBpWyx*biOyNMB|+zR9+VQg7dQxgks^JQsz_xtTo z4`1S*K!2h8XRAv!tMP{x7hWc}`{2FwWXwQJ>%3(4dG`)+AE;B%dISw(rcDH5WRf>P ztzKGzYj7&ia{F}I<}*}l^VEI z@C}`$S3AhE|H#Q$Po0YKU6T)|&L=opzK%f)CSUqnnCrwYnK=Z0`mV6-d?_*dgYKDa zQ>9oUl{o6%t;ap|RH{*rzILZBS6;}WPY;uy>Uy?*d;}-H#H~CuhwF7g`drz7Bcive zVSI>LwG%9Mm}~oqPG1Um{iik2D31sVWAhfh~&v(<-UCY@RL3q@;_ zz149SK`)N0?<8k?6}v0Ig(ez2F1lM!I%p2JYkZu*UY^2fZ0e0 zsVfhYhAS#f_V4BjbFD>Q-d!}JD!X?3s0$FtpJ&75#5Z#|UlX7$nw{|2Rh{!)))6kz zhkzK!K#J*F@@AhD5sLA@i|_OHua@kRQin_P^|^f)4PyzxWb7*L{z;y!h_lX6V)XiQ zJ16TfaI5Cno<$DW-P_=<=-uNSmdngV2!3mX?2&0RIM;vkdg7yDP{D8qvDU^U(;byx zkDB10z*&=$jh~Z7v4zS+&tdT`7QohP>uZY4s}!}kl7nv(DnsL1hLfpgYj9%-&eLd9 zzX=kO>9e%%u1Cbi#o@F}IBP-vlDKUxe`c3C2!G}>_UXZ?!f14@jm6Q->1JD8hJSm> z@z?FR)hz;_{qaZdAlKMAI~}6t;;-qyM31t%*PX`ucUOMg=RnZ`7zIzOclp7ULVR#ho4CPVUnicHcqcS zs;B)$bM(S*Yt!{@8i`&1>~K%%U4|SBD-k>3UB#m^?nsm#4_VQ@utMTK4rfn>p9ff> z5iOcafkhd`_hLB=Sk?+8gEY1qzcY^R&`C6p6BvGBz z5|XY5E;_oE3=G%^?V&*u#>8#WXu1xaXJfN2Y@b#LEe93Ot|b*gVHXHSu$1(c(h7>(L)v{r#gVi zpa8A$IEC{_kly9yBnw+zZNS)wI)=_n@PZiV#T~CjGTvr@go_m z3xRioUcZt;bLU#((p7!mCv9hei;S5^lLF2p0CkSp1hM=WG<7I|%ZVs9HtASRA-Frb zNPnv|IBVKhXp*eocwX#K3z?MEiz9xw_b4@CFJ{|(#>^nQ#WDPwb%6f7Ud!0;gDxl7 zX(1`B)2i-4i%Z21&IH|s@@yDYtajcq-d=EZPiWS{p7hxplFoS#?HJIDKqPbKQZ?rC0QzjSn5Ic$Q@jXwby2jbKJ6Inbc}1W2-xC|NK>PzQV5=bVJJy#z~eauodk4Q3HVyFB^>(CX!QWj)$xLWz;B5O?2t%TuU*fxb= zqs`7sW7|xK>F=doOkDRz#t9Zx=Qx25hn}*1c{P^}r9rvLDM?m`c&c|Oo|iU_A@xxQ z{ez-8^M2@nnH`IZO{h~Kyv@Sz{VmFQ=JPJnfg8K-{6a6a7C}96yP2807yaAql4MGt zEi^G#4Z~U`N-0Z#J4I^nCmPXvRl@mfL&UB@TpCZCSr!*+UaNSQ`R%r&9ndoB@g={6 z2iiPHEQrzf_xCii1+uDBuSP_R?^El9yuLl5-W>VAF2~)58<@uwoHZF zxKZ+>g|gYo=2>xSib;B;#RYD(!;T!-IQ)J>v+tqn$ z;N+(txTn@MPsb>}PmzG zAN`%2EsA3j*06k28R6rqziPpr91#=#3;BxrFOjbrJJf%r%lqFL@-=CF!*7PPD_5jR zBgMuhW1DlgZ-!1l_{akqPB5p>Z9RA#sR#C_=W4cbdjlZeYpm8K?5AI`@T|kad0`hn z-EsVIP&$L5|zG^$hEoEvJ=kN zD)jFmdE3(u6-Y0vPPzg?{aL&3rj)f?UhhuHku8Z;*3>AabW7qCJB4le$$P=O`>j-> zV8RJx#MrKqRZsjZZ(i=`CTgo+B}|b}fPRC1V{)5)N!#L&TFZobM{@@OmggsL4Gy$2 z*7?epxD@NKVHu6^#_x7Y<@6Nl>gqT&*+Gz*jq?#i$i9Weykx#^8^4!kPA>y%BBBHt zFPIHBVNI)wt2Hr{H}a*;VZSXd4lP_HH`suDvH2P9qtfXQAhtz3v-H~P(21^9Vv=Px z!zLXy>^Z!7=!yj&Gk%q?jLz*wbzf8p+ml?dh62Gc3R2!Z|4|o?Jzy3WzW#P%Bk9fd zsTb1Js_v6o7*B6^CA^*=aP%%4=iS}RlDrzNUXH6&+GD~sYAH4y=r#={tG!ETJP{B% zyrkfiJb4z4q-sr7LL_~Y=xJX330!Mo%~Nq$M*%w{ohU_f2p-vI0Brq2HEk32=}#4m zeLg4zc|3jE=7*F#Q1B}A+wX;N9K=^*Bf?D+_n;v}jWAIf>~dA`-ccWj54 zPU_}(#8StDq(s+CqJAF*%u}v1DN!dzs zcg>8;wjzy(-}yw7w!CI7CyGrx?1o~Z`Yh_qrQv3p7liN5TyUZ6mTXv?)m6PQzS5vY znIP-xz2BnJIbzzsVVO`!STVEUEZm)f;%1SQB>1ORH)r< z>GGH?;ovEtr2w?_#a{*AQKKsSV-?^s1!Ao_=F(0z=~$o4!e`w``3DVMoKOnh4lmk1}%S ztf2=~0%zSw4|A2zjtT>>+oCM+IWLOwS|e9_C-y#yx)&uMz6$@2hKP~&yAkCyOiACb zW7paaYd1T;J=3~4jJOY1(w6j}kj-6RWv4!kKJP|Lhv)$gN8BYj z0k~Yg*;wJTQ(dr~#|4edO@mST0_eZgoWvhXJ+i+vW5|fjnre~EM6S^oo+7#bm#Q(| zjn6VF{(3_H?)B?w1&Wb!^b!K^A7Yd$#**m7UlV?BpqQ+U2+g%hiKjdvjT;wIDl+p(t^F*wU-_JB$2U~ zB%=hi=}TGf9P6Q@=(MkWO-hqYCQ}a~^UK-3z4(yz^&C-SKO&qS5N9DI7&*0&&z#+z zJYP4iT>5odqKJW%{e&yb3L;Y-$FF+N$a!a}Zn{D^P=MH?v#JI-pSMuoeN8sIeew2; zuIXaKu*xH}G5!k9s*SsmRW2Ai(-386-|`;q%F@A7K_s4Sg_IWNeRU@UcPfo z!T${_>f1sUPK@@b+ zX;|1jtFFgk?<;o;W&Co`$y173ZgGI!Q@l13lCQ)}TWaQJOS1Uvs`Cmot5LsrBk^^C%O8a zZ>0}7ip{kx;B^?femaiH`h7q_l&_ZU4-NTbS5MO)6>qKw5>pj_s2H_|$1dA12di&& zW1^S&NENmnIA&CmcNd9Fc-4d??L4DYYo~7)X}Z;6Y+s69sk}geSE*6R3&^|=;$A+! z*535xuw5tgpmX)R8p^IU#s!JmnJkU*jNYC(4V=p(ZJXArKlwtQd*sX+Dc`t1>T!ZM zc)K4`r`6xcSE~Iq6NhrcL)c z#0Dqi)D@B1WerlWJz@E-CEI=_1`FoN?_P?Ex*L{?)+R?#x<5*9o9}`yQ7-T7$5n8B9tQ0GC3_hlc!oI3egA3UZQ3~3K7U}V@jBVQVV>0t3Tx4;&K`cKW{93fq_r^NWJroNlUVlrh4=c z(y!M9t0k(%LwmBOcneNGlM~lJB$!|k{v|uJ;0Kc54|GMr+;5jOVt$um8K^82pFUF3 znto?-FjULl`Xs$s15iN+AWW{_;*>{ zt@p5!Ry2AgvGOR&|cT*nVwpR z1F`f~f%sh^?=>37n{4=hYrb`6j+LdXhi&gN3W)DZ+4BCN3iNB2%fHKU5SK9#SN%aD zuxx%Bh~7_fsn~!BWR>^~#!$SRE@Lp#I{tEf*6_6VSW-XWx9bS2zS+0&vgiK@EpCuV z^0=OMn%~bT@!9RvDH8u929$hPEm-SCbMpxc1>+{cT+U(}&v~~Nc_z=XDwVsXJq~;m zK%IeTZdIwHI~(S{$tjsjoeAmyAlpMIQGcscPXy+i2y519 zUn3Ve`$J^mg_)OqNYBV?8N!gv>eGMrsY<_zdp)Rkf#F8Qv%=&F0pmqVd!dcn>g?ph zGzhMk?~9?Ay%AwYII|84o)EAY>3fc_%N!M&v#8ZSTMAe82&G$cP@{a38Z0$*QgZBrr zk70v8>eM8?LMnmplVFj)wmD9on26wQZDzCxJjQplc=Z-h5w-2I^xoJ5$#ZzCqhu34 z#oL%{*Ip6Z0bSd*=pEZLyMSmdU;!SXcLry?3H@qiX&e!zVZkZ5UA<1Q6qyCRF+++C zf6wh0qcNU|F8dieQ*ZbrzQPh*L0I6i zJv4J`ze#g_vOR}u+m&ab?`Ss;3Qng1s2fho2|1`zBbC*sdt^kjwpUoZA9n2Cg<2Uz z&;agoIdSMETg&-2v3hMp_8-u0(hr`DrN|)1nLcf&wDd&Qecr)ShWFws$j;UQk{N z>Kk6MoF|nK#Pq)+esHMc?;&r7F*08FD-lB8L-}k7QkL%M)1JP0F~LmC1|Pw=2B|~m z1-QEJ4KM}Y>?C0qmim(|R>mM*36IlO?${Z{+y!o+yelt=fz`HD+il}SLMOq2#2c3k zLOJ{vZsjTIuNsRlWVV2~?Q1!o=8JB--=?#Ic{Aku_#*`>a#wP;TA9(G)uMSHpIGH_ zS*Zhdr-=)D9nmk!^#P*5bvg!WkQ=fo6+=hd(g*Szot+P(Icv=>c?B?Kc)Rd=unyn0 znUlam+iWZ^qfvDQuw73O3EsTm-XV7-A zMtvtxJ(JZ6|5hf1ef?L^`VSfL7SUvP8t_79@x(rVM%;Ctoe_+yrTMdT{cBXO%K&qchI;!`p?u(uhjmtE}TYo zx4rdEIc7DY;ivj9blF#9MzYgyL{q=F$~qS&zxF6T>pDuFshjNkrw95xcC?zB-nlVI zxr=|A&d`tlJs|C^d%S%~<6H>UL~}sA52Tt;{B4f~>G1^M!?E+E+~SjPq;RE`tGNX^ zJV8YTs1e)aJkXJtiYP3wQIYQ>5Vw1rRi;uqa+z$%eVOw*yVUUq=-GGse(h# zw)PWG^~2XZ&BLa1%%`SX7E`W1=5nr<(DXoNqcBnM*zMbgx{x>zoi(|mu?T~CEKId#Fs$?5nbem3n(tCI} zlKTtM|1!rAf5ezc{)TH?y(%5+3Knn*2&v5*T@%QSeV)nNKW81)>Zluu_B6E9zg{#} zu*|e(r5^8g+M?orWlkHNU%Dwrq56+BWsm2-N3VZoCwoqBPDy)~e+{~9@7F<>*j#uU zwYrY7tYTJrO=o5Acl1G);UW1ZO*qBX77D^-T)DU)^1N9aijxVTOJf3ZkJ8gDsI8HG zSvYI4+A+tdJRCz4z36+sSBkr`$Lo`QoZWbK(k286%rLMo@z6ItsinaQ)(d)De#OYoig~X^_?%#@=|wK3T6t+z&SmrvTyl<0{$1M9wJV|NITVY=_85 zL^hstbVYpntXuC$7XSo0LtbREerklbRrS4^q<$pzqh~(Mxja&FV&x`$HD?7QuyIwz zJ}=FwUk_w%%Pn%<-1P(B5=VB9_kl)s*!DbCy48Z#nA3aRi!o@wHc`UM4hWu1eBj6x z7%ptYO`FgbYYkMw+Uq->4(GG&=uy}+b(Ug1D^{7a1DR&6IrrCgYg{eBWMT^DM-zRyV(V6dm076yd#joa`3ABn?Tn-ZP%%2d_tbXI>38x;+|n-Y$`DF!;!CoeRt0 zCH_(K)C_JgGs+WP+fn=J$Kr0BGfrM@M5ci5$SWjoyv4u>gls3c>&8XuW836w{FSuacjs(kx^OCrb$J zUDg=FQWp*D{=*GEreuGw{1^Ftrz3Fp3yd=eb#Hr^Zo6f^%61XC0srKrmd(CtE&mfK zm+_y_FV>|04EFB5{NGn}-87(B{`<(@oWv*U%{jPH`X7~qHtz3(Y7-ASZ=mG4`RAY& zK}*8pvSm0SyU9L*PF!j)@#*GsLjEsLw_~a7Kj|^+|3A=U5~ZCrf6tzoTEy~}*;(!{ z^dA6v8{gktYNDG3#P=E9bnWkeL$zOAe!9}Jg+SD}^g&lCFc1Ddqpg5qmbxH@pjS@{o*-}O!hrv{mq^N}CFdc+aDT8S+W=l~CAvv2!ImSkErkdnz za?Wvb8Vp7mj4@{B`+5&*w|n>AcJICKU;F#mKibFI-J18jU$5ukdS2J{)SO(E3xd$L ztY43e{)S^8Og&I>_h$9 zZT{Y1!e#%QANV8q_5msHCF)Bh_rVz{uhjwBUq#Cj+y7k3Yq&?^p6+w67X|DL?sIj# z%mlMOBVTc{gfOYYnz*U0c1oE$NpD7HC+CedwMz_LDf$3*yjovrqeqHTGhFcOeiS*f z-!aGg7QA3sreJ$GFs>S$oa~0z@R7x6m!1Z zcVizvURxr&k_O1tg2v{KbsxZ=?btur`~#J+d+jZ7=yYD}&-;81v%xnBXk7CLGU1Wm zPl7`jJ5ejFy@Lh>&=S0xf`#W#r4|v%skb_Cc^@9)%G-XBU=!9nXn115v*9dl!G%UP@^996`ZMQCMv5#XFc5Z0fFhNLdwos}a!sVZ{0p>FCU=XZ6 z;^MA!2oscBxEuzIQ-){4FOcJ7Bb$n|G5PceVxcHXZJcx4I5&Dw^Mg9{S_j95$mHjB zKm{xUzOK}pfo`8;_sIIGNK=0qrM7}$*p{e28ZYg0z9nzRGemungOMNIf)@(C&u`t^ zCV$%AWOZZbU5?ZFfmM9k7cZ#SA`w0>o@B^AP%J*4x@ys$N-a|?`A)dkc1VPn8}4-l zsC{8NM~*BSS^v}9?Oub_#FRB-v{u9rsUP;Y%2gkU5|pq2 znrZ$qVMUw1a>$*Z2t>9pSjU@2Yl6BOSZFQL2A&&iZg*q;6r))T%$XdCLtM@fS&yp? z__BPjo4_tVg%;o#C>}Xc8@r=&H^pTMA_w#&i0q3p9bq`morLQUI3$4Vt6-YA1FH_Fyuc}n-jK{C7wz17n7;AoTu*>(bKc0ck|sIqVIq`~^%f%2+@?RvcJuUF`?W=a+fHu_d}CnRoV>$|pZP(O4u?DKWpxAwi;he(3(zdshJ`qXg?!&?;MMr9p>VIhK-#gV)3gT3)vWAV9er^>bXJJWke{Ha z1lRx}X0YMLPSJT*@$ofa5y|s(rPH)+zS#2m^UokaiinP+hmSSnfsmH7dfoH$y%@J1 zOcS~t@B%pJvGjEWbtM`!f9-1GP5@rPO(}B)HD*_UCsUekF#8HBCNAa6h&`=BnTSE3SiN#RNPuelvPC%LbzZ3Ic+{v`V^_von z^M?cLE1;w{*_6U=dY|QR|G~4aE<rlQeFT;l*s9=KZT&xc5*MH2IxPS zfbZ)E{BG$PNttD(c=9W#2LAU|+TWp?fvPl1#3J4}h6X$fGaku6KL0N<3tD9?KHhF` z0Q;^y0HCGA-zr;cx>He;zZX)O;mrl7pwM2y{Phh zj;C7JI^t8r3jJtO#J!jAC{4ynMZ%Qo8Xm^jRNy9dHv>|JxDHdkZCt@ z*whYNX4;h2s>b3!i}`siEgvi(5#R;pMd?bp?fiU+=W&c&)ZV?1$w|N3y!Wny9f4!pM)pPxz5!K*w7O>E4?2!MBd}u1%xA zS#2k7!KND9ZS83kgPbvzg9GRP)8O6g9{p^mali-1?DOSZdcSX&#GNE%u-van_SKEe z9MBUN!SK_x#oz_D^5YzK5$-9;z%r0QHJDr+0q{?pQ|blaU4zbqX8phJcGjF;(nR)4 ziWbSReRwk)QTo0*pI64+UzZcxhq=-vL}>impm*tU1ZM;4tI1yB6k z>jcV$l@PE&e%1UQ zTuWW^;U~VOpyI(jcT3~~d%%mfB|4-;s3uSfw=dnq-;$V;@0>Z1TJ}8IR?Ti0!o`|< zl+K2rU>n|?z}2~9cQTpm?8w5{q2};!cEm5 zgQlp?^hHUC!=6hukK*3XhphxzGUZv%(a@J7^0h*aZnkZ#HpX*usWNYc1z` zDSH}7Z^tDE)J!YsTT3+84Bu@}N~=5v=r>#z83ygStrvaetp-)%QV|0!W_dy z3!DOOu9cU-=eFC~gw<;S4$V>RfWl%lU-&Qsn$3INK>)bJ6VR(7y?4qBlTzM=;4g-v~bg$x86Ndg~j+c_szUp5G{L1zOzEUbMm>FeaVIk^q2C~HDE)UV6m)a z4ytJFE^v zjgJ+8cC2|qEkFh~{Ys7JBRCWF$rWJ)0wq8cbNb6s>@+DK$GTXztE5u$y=T}K__j2< zQ9@Dcb>N?+AINCE7lOq>{#iYRSf$Z5Dm^tV*aq$@>+q*xuiz+N2YPJDg7VC4N~mqq zd3mKPl^Ka@1>|KnCza{XVwYM+e5^$rL0FQd^FR1Mxo|%~t^1zALS4h`zR{(sX|oA@9Xe_c zE9HSy&+-22Jw9WVaWz9#18?L9gznt$;B^i!>C`Tj*UJeP2bgbSGfRBgqZTvN266tm z1vNbc*6_pl){ES3m`l~AS8Y*jksL}eOJmsSjZ$wJ@B?gKTa53GGOEP)ZW@nL7Q&)p z(Pt~-!jA1%$Ilf~!u7u%(7SGXnp?USv;e@=1;6dBfmb4D$xoXcQ*SGeR{_N@?DtfQ z_EqgB8lYF?0U!vk7uh7>;dJ%hZSq;tJ85^aO;&$Z{lL<@V8dIt)N)H*-GRUSD>`iXI+dxC_mmIcyRKuIoOp%gm`;b9h@SS3SHrQCkomiPeSvbWPG&mz{J3EIq7fm- zA@;bJXPz|eEW?-f@o}5>undhqc4B1#_AvZu8O$@$n0%+U6;`rSxBBaTfj3<=4=b2($GR|?2G*|sk4UtD#^DD587!(ZE|u|(Inw+KI9v|E z;TbD!=T>}s#j##(1fIhrg8n`|{Xkcxq?x+NCsiecP^|Iw?W6ARen}XbKwg_D0;Bb=N5M3R0X4z-1DvAL^Fl%m*d8R zQzf~V8A)Z$18ydK40}6i*aCMO85IDH8}-1ral5sE@kv0=@H7zQP0)bG6k-8EbBigr zQh;aXfnw{EvK5$$Yb+3QgjxU$;dJ+5-cc)3o@b20jedZpVak0m0ZlM-Wim}<+ng&r z_&=Xjb3_)`u>`Ku7i2$kHV-Z8S_bSX+vruI0@4E#9(gVdfn*h@8b|FlSI-@umeJNg z=eOpj5&jc^AOPkstpe9f%z60A&(}d1(LGW7=^TL(*B$VqfT+!d(-73HMFWjMzISeK z1ngls3THXWjJOa`HdTfReO9MYH@qzhw!foUt#*|(=xp>>G1H1jdgY-u z@*bgxnUHQgma1{X`wl8G^<{<%yYy7Em!ZCR)7|)w*68IE6Ufdx@*;1jai+9HRm33{_&0rOK?juQxy6!@jP7_hIQN}b)17Q# zJ>@9#)0X$Ic)1Yc7j`;ZQPc0ZVIF!9jz1c#9d|iJXi`EJUrc|QabS!3<)qTRZ}fHu z;H;Y=jqu)$_^XDGyhe3XeKYZDQTMJ zP+wf}XFS8qeh3GB;(@>!hxxVhM(<=xEJ(}VJOiZeSTuKjzDYDK4~GBvGvl?oY1sw+ zJl_SjEvxlz1Z$|&57iak^~M1Za58K&1c8AeMwGtKsH%xp<*#vz_@3(1QEgsv2Hy$C zNQX=-AEuzcb${QjNr{u{)++CWo)n+lPIv?Y0X?@%j>na zC01*NR75XyXcBa5EQ1)Hf)qhCDP$7?E&E#uW8mq7YmDjnf)g!OPq zPxJV}o>whB48->VFzd*%d+kZ`kMJ?=$pMOroKg>gT{Y37glW^FCnlj{A zbo=!@B9OSWIeC91=2q@gal5l==)P^%>7~z4H?@{Bw?*V%?2&}{2~Soz3YSIoz~|Ka zHAXCIc*6!YZki+)SmXwfc%A<36w3=e~Kk3j}?aolEk8r7Yr%6+^aYVMHGaP4%S z-j|al95rj?SRAmnI{I=!pAKb;;9dGSGIxE?&SGF3A{`ADLVTr3!mk?r|I?N7Kj&`! zjV_u0j+HrEto${T#eZnA(!Z}3HwojkR?av4Tw33FF(`D&ckBgglGJjxl-dkMd2CEqQcQf|Lcr+LLvPC&ec zPws&}quU}3yK+T&bYe+UNUQ~oS;v%P3Lqa^#c>~wKF^v-Tl-v8l|ga;B|urwg!&d< zx5X6tD#OixcNTtJFiX$=(=7d8(X-zTf`M`yv&REX;vk(gKKzpUZgl$vrhvh0zfIzD zJp%Mp<6Dv0MPbgclB!IlaH;~}X_FJZ)~#j%E(cS|5JJNYo2m?8*>?pd!N^=SnRWr9URjGbW-|SG-)eg1m*47toxHCs zax*)JFnqmzAcsq>3s_hrb?0doR5M;CQD}4~0$L+6$_0LP0FLSJk@&%N|tzBA?YOL2+#8+-NFP0g2X{3r7zpYNh8_fH^4JGl)X9%9-u z=yQ&KLNI}D3o(ztsV?)h!}S0w!$APOJzquFsy*ll1-j?Qczny=Gk{eBRszzF!D;|B z8m*btrjzPAL`}u3{ue!F(P8>H>Qj!ewfh+ex)(RukI!I=2Z_9 z99}gNNiF@{HQagJ%m}`yU+O&?g~sbK8mg{TFYcM0Z$l3Dv{m6Oz_-8d+xYgK5Qn8t zk>csuJ!eG)ts^YF5|Dkg>xDf7A~t5k4K6CW09_Hdn6XK(Yk7LZ!aV zFDY(Ib-oQQ-GfHBBCQc~l4e+*<0@qmujJn#D`q9jHEfBf%Z)QAMIW3O@Ivat#DdD< zXuV26b0Xs>QaD{@v0M(4tqhGs?Pfji+iVJ8s5o@9<3A0#&<-F-}T5c-ZnJsXZfgYpGA&MaMq;pWsDI$T5l6caq$80 zVEw|%L@(8>dU$VN$R!r5fL#^K9U)Kp5;!?9j%V{wDIT{OT{QD#CzkIM9`C_3@kq8E z7pxrYi^Wfn?YI$fgyBO&I#24RRRqV^2d`XS@J{F@BRBNQ==A+tD{P z1-`cz+K?9f;Vxg3=#!NCw`}2|*PaUHdAG4azEU!ydxx8}h~?b{w{y}$MIHBJlX)N7 zg7Ct`qP8R}65-rNZG3>Q*MG;Z>LIh+SB;?X6P?J3K`vaJdl9Fu>0@zRv)|D!+oRst zwwF_C*ibce*2XAX$y~GFxc-pcJ;ak(vBl_wr^1@AG*u1{J=3U?LqB=a)IS{M)uok( zu_@N97X8@z2s%gIon#Ij$!*V?)W?srkhlqU0lUV#fU~*^-kUV&YNKEMR*bAoKxR8t z-PNb&(F^Kem#=V#;suWrEYr)v9pv=s8(3q%c=hfyqBWy7H%>TezVY%ApZVyu38p&R zi!J5%TWayk8{@kktZfT0IgslAhhI%K{w8ZN#7S0sX2E!9%eyBjTO1|Wksel$Txt}bxt-x3-J4b8oB$jr#Sq)1 z)b0t7>h%lr%QrM755#bXak z@8(OE>XqQ5>^z#`Z+W-G>R$0}F{@-w@vdFD(rLk#8w8)hkE5PMv83B>37!phSwWYD z=@?PHyVAWpLdx(fFxHQ_abe(qI8PstuosOMwSCxr)C0%moEAKzVRUJgW1;mk0->^_ zn9MdyaekZ#eXS@H&AcZ&ycW~X!DQs6CXGhHol7~FGGsrNTq>s`T9J2~$x3P~xWnot zn5Ps3;I#5kSdj{|RmPWN)oPc3Qv_}}g0;m7db!{NxK~DJ1>p1)do_--<;CdHG!b&A zpw3%_KzV0O+h+e=ZSCODKiVnqeTRBT;dM{7w|_2HjYrdP-;?vhUARLdGtV^ zozYWu{ZXm3wLJa#ZN%WFk5!MN+KN}{vyR}>_wu2!`*H)$rzG#{dEHW?0d5K1T0sNP z9PTD_@BGkuHaTd+d+rs^BfgQc*Oa}wQYR?qtTN$OV;(I=!zf!X!`GdnoO>LaL*o(! z!8$jWP+kl@5xc+*7~JUt^<7QuP(F(`wnRnM4nbl>q^jkJqEp-+6VziPCSVjql^Uh6 z+)&+xeas4RG=wEbzDn69Xq8NDciWPdX3S4d6E2@nVnmEFC-=0zG}-6I_rk}{N$`zh zBl*k;O6jfKD(M2^`jA2zdF~}k@RV`BuMzF*_|Yk++PWo6_UHNKI)RJMOzEH{jT|hR ztP1+&!NEt;sB&}T9MK?i5Xgqa$iC`_xT=Xj#oFd`X~A+SV^6nhzOplf zfn%C5HX&<0l&~}aUDc8p9BXn`qS3gP6=+>m9(Z{Lrc^WUt>QC{y0_VBq*Hu!1(ZLy z0=-*85sf`Z-D#S2$cNkD)Qcb0Id>Q2b-qy3qdr-`s!KuuE^qw(bO^XoJb%!O7r{XG z(1b2tZke`!ptB@)F#05A7**J6QsJfgNUcFi4#fWy{Sy|ot=80@O13eQb6_;Pl7st6 zZ9L0j^gz&Fe|U)#bjfq2Ob&ZrSE+lT;eZFx5oJOw58PE}Au4E|SiuSe?>sTsOQ`|_ zF6{@uE?dfR)53`D`mPRV<1*3+CKBbwR{O@E417NBu4885qK@kw-tWKGHj~7#p6-R^ zE9R;Ec#~l%BE05LX0TvUM@Gm*7Mfe9 z6Ko|UM~xcS%c0L4N^dCCY&b`E>sHyu*i7j-NNl|MO4+dadifqHbTX0Y6of5o>G14pb~RTXl5M@#EX{ zrd$+O4bf|kN^RgPQF!gx?#&E`fKeV4`&1`r0%6FbjM3IJ{=~aHL37lqA5oC zSh?A{yYAPn=v!@TU-yThR1r?SH*5yVBe})78dtH0F@$&mf`MX>%h&a*vKVuR-}gAz z$(xJm`NniMQ-NvE%qNAbBk`bTL)Xyg=$G5vkEWivO0l%R%-{K}E^ww3hwVA>}0(4=bOSB`J ze3n4cuaywL+2!5KE8SMGeWE4Y_hMxqL55RnBIYSo$5R9zoo8 z8kd-3l^kBY8V5mxUx!;U$ar{s7MM*yBMOV)7XS;x1<%3_vv316LYhV2X3@7<^lcW5 z{xs>Hy$-Y2;h%gRX3MwPY0>Po=;H_-3dzz{I>P zDCL}ea)b1T(SFls6I%6I$$meDlnq`gScuM2V4QSQr`VfSm@~NTp0H$LnsNk0S$(kS zDgdrN0^o{0(w8%opTpkmQ)!BWoKPMB2<{n*rwnG>94zus=- z7U22h;Q3zo0n$*E#`2--zfI(lq=%885=Hn6GG~zNHW7qp2I-S=jMl+Bb#`}p)yOc+ z_|OWsjgu^6HzolvEpL--LIdr$GZL(`6>LyETKn^+EgQ=daY^NOKbY2eh9njwW*nJECG=vkxV+G8t5-MUQ_&}YmFBZd#b9r&NiDrqj+eP zWK-^yZR+Zal-f0b4z&}BFbv_KtIoW^(T~Zx3L)}+gJXwcg*GcDv z*LbO_mjToc|Ayq?r~C`zrCV}8!Pg8>_+tQtKOxF7u|nrnZj*K>ykx8tu;!O0jAf7A zlYMoaMik)3?weSjpTiSWP&NDaSuFOIQ1ExHFtbg}G+1-XSC)U&Y0PBcL_Wl2J_B2pUw{V|qN5ZE%sDLpU`zHg`X0E*L%a+?T1G6R}X&i5<4vayGaM-Ma< zPh`0{xSnN~icv454~eq##D7I)Uq*YKGxkJwTF)`EGsfzLG>v~QEf&n zw<>bkGD@9>5yYgX63gpg?RvSkWNP%3EJL5P_BffRJ28MA*UqY$`1IORREHonQFI#g z-Kz$dX#z?&l`7_-R}Q^8KRNu~PI?d=l}}xW&eNF7?np>x-l%J^&Y?m&?A6>%h#FUXO zgWJ30GkN2pLz=__BHBRzOd4;?Xo#pKjY zS+Ka*Hy7w7V0K8YSW!n+qT}-k%qb_rkoMMG{6=w;htB54u6t{e?geB)@{e6#CI8S* zt5!`-iDSr+qC;dlH`DHUI!8@~5oBHcE8h_A^vpHPKM8Nb6BV`8OH=s%F|fGe~fTb0)qwN6k6^%@fd zY31~BHWDQ=?N8nJ&hXDAr}*a@UjHg(_&wzg5CVL?a;Ko86u;nczAPK8{ZYz5eov3f zcaE3}@iH4fK$hVI4hQVK89Sl}@0kq3->$?P?d*kW{n?Vyp5l)=HcY@-oR!Ge0` zMYb=8gC!DspsDcyf@fTi?*g z4R4y()SJv_e}};hKJ*%U6poXKz$QdFn+Iw*aAV-rHF{zcz2GwB)S)d34|cbBdn-x< zPpalx6l9)AvTi#U3~vd|+Me8@hm8{ji8WU2I0h;SfL1Rx zFMDBx7FwDWe(o(UZo*mtR3lsSi(ou~Op#8Wp_F?rvHc8X|J5m(>S96c10az)$KQ(l zsOS1ylwD+LDcrHvonwMOTR~#KN;~I9bB_6VTM>wI((OfZf{j^k*_(uq7X)|!9i2tR zAvLGBy}`l}o~o-IcjO{hlezS*P8R;wL2c_YUc66dX31W`{8Bzs7kvYg@Mzr$BkgJtsps8)BsQ=W+^Q9uuL}kHWfsnflx|;O1LLe z@AMdu_%w7ALDEdIio@l&?-kW_t_;bVkZdWLtd6WsdX}7;5@E&D&VjQUsAv>Eoug@T zAPt8nj!o$Gtj8HuO(bKLKv57c2%TGs%m1)ek2Q&h?gmsqY_@*tHC;fMYk-=Ie$JyQ z17YK^Ev6?tBoX;4q8vWB36v3=Sxsj}z^lTRg2QBTy3phRINirW+6B^VD5Y6IW9lGV zZN1{jP$&inq#`HYf~;(lZyc#5Z~O*`yaa)|niuXXp&V7?s`K2q;j>iDkPC^%a|#*b znvimst{k6n+wv|(Ik((w(^m_ma9eW3ZE9A z`35T+L^5`uLmK-Yyql*N1&La3tb;q*${U*!aod!&2A9&KPly&g$s%c>#A}x{%cEQE zGYjP2722Jl5nV4If}ghwE|4n^XelkPqYaD(>~z@`20l1Sh@x}xB;_0?ldzyE;DP{M zdcInpJ+Cr`;jouh2Efc)K5EMezDXbObui`@KZVo~4>Mv?AYk<FG%%pP7E)Uoo+20nR1|#OI&r1OnXpOcsCLa+Y6q>g6N+(U>j=! zb-$aS?$3LL^|WpnQ4VUu9?&4yWbGpuKFhalgU&JNA3*${-sm>blN^wZwTxv3KYD(aY3K9hADK|7~Y*0YVd}*JGHSkQhBu&?K*`HROU7GI{ zss-Jy?LgXHf9$e|Fz;K*B!YxzpWM`si0~RQ(dy5kv_i67jb}asGND8NL)q>>=9SI9 zrhmlEnte^PuW2^u{atx#_BMTEw~4^*fO9(f2L)TXuj?ddVSC|VBZ+)D2glQ{EbWnFR z`(|aS*y|;uQIL@jhbnfRkhb3TwR^3pJIxn#?!NiC>zpUoF{=tC@C)cXpwica_M!8I zRq_wTzHQ6D3end~I|7YGAlIDVYG3Uzpncs(QUT^g*AXG8CWFwxdc(2wnk`f9Ik0(n zb9>r4g(zVK+)>bV7UVv&7}DnBWW^x}eg!zbC92Bxe+j=T$naV%fE<{1Z*kf-W@s$nx8=-Dj+KzeaJz?Hc5HfKd9v-um(~w9vqFR z)S5^FqY3&&;2Qcz~IlDKFY zfR?T3OUCNU8)JyLgL_kG=Yk7VtI#c^7Ha~*y+I~h0o`hwS+E}bhzLMBl`DDCWhXhe ze;_#u${RPNHINEvAs2ys78%fyRUev_y@u9vD#!^@Uei^XSJ{GT>Y+y`U)l&vx?W{I z&rA;~E7#*I6uI>MK`?uUFU3AJ4a;g0qj|mDbj~_h^t+t#3l+FAX2%1Icab6e_lfKq zFJ;}JkLcy@eA0zDdE;bcmyuPnlXVKfHbWgDtpbs|e!^opVb$=o!L9FBM73s$P zzhQ?~lf-i*hHOOx)7}+MGe2Zuz*iHis5#gyp^&|@8ePd_8d8GB?pZx@48#p8@Mv#m z00}YaX~#50_L3)H!FHPgW}K>MU)t?@OhwK#i>lFBf&BH%F&+`Ijdm%g!u86Td5go1 zsieG#<#PQRg@>oLA5*r#zmMjnNkfKich}-{6PqjbYwNgsB$yG4N493Jyv?doq7Q}i z6G{kvx(fa#F&a))LY|P#ueW82fwutcmdB(pe99f2=IH;#S!cLaOOta;G}I8HU1TGH zu{EZ8YB+kkNI)#H@)k6`&l{f9`O3*53;B1VR^00LQ8e=DUQ}*XWY_iNZRjT(_zL0J zhP*aZ3BVO|Y<|r69S`Gw1lrU8VIoV^9(K0UD?6KT>;Ogmr0nyqC@n>v`>?KLV?Utk z2~y1giW$Un_bXBQF3==CND5V519&9fSE5WDzkud01*K(pwI{gboo=%h34HNXrm-Ia zQ-!|kxIt^~GK1I_kej?zvy5$U*7mg|M}NERUW?Iyq2%Y>itMx1g6yCp!6lGNxeng{ zjJvMyw7V|w^#0PB_P1Ey%Bsa~+q6;HI^A&|E{{iV0sEh=DnAxSg_f@$&G*{->aNv> zDcfmxXYv`np8)kaSV zYa`D$dgxOi)z>6F^Qjd11=U;6dPo3W{ZcKYFoJSD9C_Ag21{L~!MX$1GW^n%8jCDO zGEUK&S-C0PF*0sM1*D5dx(&fu_5SYH#II0wM8OX*Z}0Mz-mTZ23b7A(T;R`d4f#87 z4I&Xo2=kEdM#+({4kCXS{a}A7yt`Mwxay@b4ALzCgG}3!UAqKmmLl;Cb3hhTkeRm4 zuVu-i{m13dPvZgMFG)?h>y9p9$5ur#A?Vu=aQ<3#rifa>;U*4k2nC~04|PwQ2bt7u zla>%GEdh)PU3dG~-!q)|kx$e-ZRk;wWi$QG24tvtr}b37Mtsno*3T^fdZo<`AJ|0IYyyuPv^TY3ae*wXHizoCY%1ml*nPhl3@dc< zV`6!nz};!oFDN7JvetH@L_>yiQ7&oA=BuZTQyUN~Y0>Mxf4!tNqa+J*c!%~40OA$o zE50+bUy2ND%qhUeeEn!PzPjNysvUrP=B_R5#f#P`^%%t(+sf;zFQFD4I4MKS zm20_ScY&5h67?AAs4q9mkf6Z@FzwA?H3Vv9wU_B?3S3}hL54g!UDbuX;DtqPbe14p z^gHKk&B0m6C1}!f#;$=6w`8|k`_^*Ee-A&>{c_ga(67BI30OhA22Qr zfdM}o0`rjHN0hIxz=(P$^A-u1Yb2{mm*j?FM=hkSiKP(fm~%@Yf&nG(WDRM{z4rpM z0_b_6C+)4OutRT;If79jdl}90`H#LlqFo{s`yiplwxEUGdc5T`i534s&*tU1FZM{d z6oor{4T=Akdi}Je<=XIG@g)-bpMW(l?1brEDgt$uB4_h+Y#b_Xfe$h?e7R0VhtgV} z$WT>TZ4?QtmWTBndUG)#5nLWsStlQzR2~sNRJU}dAOQnRh+LPZg^l42K_$@DQBmR0 ziUNfnF+Ad->4j;E-L$3&RcA4zoTjQ^^o6_z8m&)DwGiEY>{=h6QUMijh@O^fss!s_VI4elvAD#y;Oz{y^mx)geF!uZ*7J>xy*y@p>UgP$qc* z)!=4I^@Ema3EDJk7py2q0N6C%&?T?4oci`y;7NN~XsA6+q5msH^5GYEkp+PQk2-*g z@BbHXC`C;UY`mE>g1q;ZAE>_&GiC5oFArs@w#C1>x98jAAb*l|rYOj9BxTtQ>|sW5 z*5+Oh1*jwYP9+l@InZkETUnhnyffy*bjDHz)a_@%+fok^2TV529%|6P1HRI zHZiUPLO5-K?@OnakO+tk@3i*%TmT!Uc!7!=br^^gO=s5G@HRzRd(}e00$POgaGEf| z>&n)t_e?#Z+gW|y6E^69Eh}K$1Z^u3lc}7JdzfHAcCR#a!NsEeG!kua4Ltb@BwWI2 z(ewU-Dg{4yl{vN{!fc~P@1f(K;(KS}M8$sIa+QDXb3M7r%o25Q3Lbx;xoIn;Lr9p~ z4cGOab|TYjZ$tRhN-PH$ZM*a>!GA^oWZNz+hv&rvRJ`Vs*x!HG{S?r68ZU%N{6OAb z-P6Tg)jJAR_I%S)U!8og7OpoxTHTTP0A~(S(9iosI_l&*h@>Q~6On>{L#Phl_bAMW zZkVsdJJ-Ze8yoM1)$Sh#)eG2@tGw-oMs*1}DX0W2cgQBMzFP5Fn^@POKo2;O5%H%z zwzbJ~1*@WXVo?FZe+q(0C~##CJ9#!=pb%w*_r1^EP0miqY-n-c@Iiy+E6~YM9H1Gf z^Y#+*)>H8o3qe~7f8(DJ8+dTvMhNaR;_ivC81GH-wOGUsPX}~6aU9~pL2w*&dmbvn z@)kWbVf%aF+*la-hK3UTBmS=4rqkWKr!Qp>m)0YDJjDgv3-noN%Nmf$J3O~xLtEwA z5;8GhwOv;bP_KjaZITu?D0AQp5CgQmGl1YZCk!azX2SGay7d20&*RYjV*JbxIOaWY z+2a+!LM1!?VSj(CGyL{(V22gJDQq0%TC^lj2A4w=w4vc$c|-r4OK+|y=cW_;JZEat zUrdTNUzrPec@(@2tWSJk%L6Sw7U$4{ZpypP&m!oAD{l(xrbp&4R{$ z=red02@oNWWB*4PNM<3WImobeN|6)ABbI)I&N6ieF^4Q&>*#oacjQ> zJ)aovP@ZGIf6SSWXs$4&oCEvNB2AugcxDjA=!gL#4~>cCH8POV1xW5g52n|;;bPM; z0D?OaS>Bco7H6gIEh(`&UrP2G1lW4o5n(CwFLRVX#?+#$Fc4ifkv8gsC7;w&rI@R1aLIFT zmz^&9JZbu*Ez=v~y0Y}fP8NmKMLn(Il`o)`dI&r%Ff;XReobQzINNgiR+nQ{*7fLz zu9(*29`Yb*Je=9ohuQ{S+>w4<4!Cm`tRN1vIp1PXvx$6e@(5A~m-?nW{l54QT`zR4 mww3JvBO``y@5POC=NJX0*_Undemw{LrK6>{CwcdYYyS@<#cJyS 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

    V5yz&=(NsuAZ~jDZo+vl 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�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