name: fal
description: FAL (fal.ai) is Nebula's all-purpose generation gateway — one API key fronts 52 ready-to-use nodes for image, video, 3D, and audio generation (FLUX, GPT Image 1.5/2, Seedream, Ideogram 4 (gen + edit/remix/reframe/replace-background/character/upscale), Recraft, Sora 2, Kling, Wan, Luma Ray 2, PixVerse, LTX, Seedance, Hunyuan3D, Meshy, Stable Audio 2.5, ACE-Step, MMAudio V2, Demucs, Clarity Upscaler, SeedVR2 Video Upscale) plus the catch-all fal-universal slug node. Activate when the user configures any FAL node — flux-1-1-ultra, flux-2-pro, flux-schnell, fast-sdxl, flux-kontext, flux-fill-inpaint, gpt-image-1-5, gpt-image-1-5-edit, gpt-image-2-fal-generate, gpt-image-2-fal-edit, seedream-4-5, ideogram-v4, ideogram-edit, ideogram-remix, ideogram-reframe, ideogram-replace-background, ideogram-character, ideogram-upscale, recraft-v4-raster, recraft-v4-svg, sora-2, kling-v2-1, kling-v3, kling-o3, wan-2-6-t2v, wan-2-6-i2v, wan-2-6-r2v, luma-ray2-t2v, luma-ray2-i2v, luma-ray2-flash-modify, pixverse-v4-5, ltx-video-2, ltx-2-3, seedance-2-t2v, seedance-2-i2v, seedance-2-r2v, seedance-2-fast-t2v, seedance-2-fast-i2v, seedance-v1-5, meshy-text-to-3d, meshy-image-to-3d, hunyuan3d-text-to-3d, hunyuan3d-image-to-3d, remove-background, seedvr2-upscale, clarity-upscaler, seedvr-video-upscale, stable-audio-25, ace-step, mmaudio-v2, demucs, fal-universal — or asks about FAL in Nebula, which fal-ai/* model to use, or how a FAL node is wired. Sourced from the Nebula audit guide docs/api-guides/fal.md, the live node roster in backend/data/node_definitions.json, the handler backend/handlers/fal_universal.py, and FAL's official docs (https://fal.ai/docs) on 2026-06-04 (updated 2026-06-10).
FAL Skill
When to use
- The user configures or builds with any of the 52 FAL-backed Nebula nodes (full list in Pick the right node).
- The user asks "which FAL model for X" or mentions a specific
fal-ai/*,bytedance/*,wan/*, oropenai/gpt-image-2slug. - The user wants to reach a FAL catalog model Nebula has no dedicated node for (use the
fal-universalescape-hatch node). - Claude is building a graph with a FAL node and needs exact input ports, param names, valid ranges, and output ports.
- The user asks whether Nebula can do something with FAL that it actually cannot (audio/TTS, LLM/vision, LoRA training) — see Capability boundaries.
Universal rules
These describe how Nebula's single shared handler (backend/handlers/fal_universal.py) talks to FAL. Every one of the 52 nodes routes through it.
Auth header + env var.
Authorization: Key <FAL_KEY>. The backend reads a singleFAL_KEY(set in the repo-root.env, then restart the backend). Missing key →ValueError("FAL_KEY is required")at run time. Two nodes have a fallback preference:meshy-text-to-3dandmeshy-image-to-3duse the direct Meshy API whenMESHY_API_KEYis set, and only fall back to FAL when it is not. No other FAL node accepts a native-provider key in this handler.Base URL. Always
https://queue.fal.run/{endpoint_id}(the queue transport). The handler never uses the synchronoushttps://fal.run/...host, even for "fast" models.{endpoint_id}is the slug from the Pick the right node table, injected per-node bysync_runner.pyvianode.params.setdefault("endpoint_id", ...).Execution pattern (confirmed from the handler): queue submit → poll → fetch result for 50 of 52 nodes. The two exceptions are the GPT Image 2 nodes (
gpt-image-2-fal-generateandgpt-image-2-fal-edit), which use SSE streaming (POST {endpoint}/stream,Accept: text/event-stream) for progressive image preview. Queue flow:POST https://queue.fal.run/{endpoint_id}with the JSON body →{"request_id", "status_url", "response_url"}.- Poll
GET {status_url}every 2s, up to 300 times (~10 min cap) until"status": "COMPLETED". States:IN_QUEUE,IN_PROGRESS,COMPLETED,FAILED,CANCELLED. GET {response_url}to fetch the result, then parse (_parse_fal_output).
- If the submit response has no
request_id, the handler treats the body as the final result directly (some endpoints answer synchronously). - Metadata caveat: the node definitions declare
executionPattern: "sync"forfast-sdxl/flux-schnelland"stream"for the two GPT Image 2 nodes, but at runtime only the GPT Image 2 pair actually streams —fast-sdxlandflux-schnellstill go through the queue path like everything else.
Status / error codes. Submit accepts
200/201; anything else →RuntimeError("FAL submit failed (<code>): ..."). Status poll accepts200/202. AFAILEDorCANCELLEDstatus raises with FAL'serrorfield. Timeout after 300 polls raises"FAL job timed out". Typical HTTP meanings:401bad key ·402insufficient credit ·422invalid params ·429rate limit.Input-URI rules. You may paste a local file path or a public http(s) URL into any image/video/audio input port. The handler's
_to_fal_urlpasseshttp://,https://, anddata:values through unchanged, and base64-inlines local files asdata:URIs before sending. There is no separate upload step. Caveat: large local files bloat the JSON request body (Nebula does not use FAL'supload_filestorage API). Prefer URLs for big videos.Input port → FAL payload-key mapping (this is the Nebula-specific wiring an agent must get right — the port id on the canvas is not the FAL key):
Nebula input port FAL request key Used by promptpromptall text-driven nodes imageimage_urlsingle-image nodes (i2v, edit, transforms) imagesimage_urls(list)gpt-image-1-5-edit,gpt-image-2-fal-edit,seedance-2-r2v; style refs on theideogram-edit/remix/reframe/replace-background/characternodesmaskmask_urlflux-fill-inpaint(white = region to edit),ideogram-edit(black = region to edit — inverted!)reference_imagesreference_image_urls(list)ideogram-charactervideovideo_urlluma-ray2-flash-modifyaudioaudio_urlltx-2-3end_imageend_image_urlkling-v3, kling-o3, luma-ray2-i2v, seedance-2-i2v/-fast-i2v/-v1-5 tail_imagetail_image_urlkling-v2-1(end frame)front_imageinput_image_urlhunyuan3d-image-to-3d(primary view)back_image/left_image/right_imageback_image_url/left_image_url/right_image_urlhunyuan3d-image-to-3dtexture_imagetexture_image_url(handler-supported; no current node exposes it) video1/video2/video3collated into video_urls(list)wan-2-6-r2v(special-cased insync_runner.py, not the universal handler)All other node params are forwarded to the request body as-is, except
endpoint_id(internal) and any param whose value isNoneor""(silently dropped — empty optionals are omitted, which is correct since FAL rejects empty typed values).Output parsing (port your downstream node expects).
_parse_fal_outputdetects type in priority order: mesh (model_urls.glb/glb/model_glb/model_mesh) → image/SVG (images[];content_typecontainingsvgroutes to ansvgport) → single image → audio → video → text fallback. Output URLs are signed and expire — downstream nodes download promptly.Key gotchas.
gpt-image-1-5-editandgpt-image-2-fal-editrequire at least one reference image on theimagesport, or the handler raises before submitting.sora-2selects the Pro endpoint (fal-ai/sora-2/text-to-video/pro) when itsmodelparam ispro; the param is popped before send (FAL doesn't receivemodel).fast-sdxl(loras,embeddings) andkling-v3(multi_prompt) accept JSON-string params; the wrapper parses them to arrays/objects and drops them if empty or unparseable.recraft-v4-raster/-svgpost-processcolors/background_color(comma-separated hex) in the wrapper before send.- Local-file inlining means a tiny PNG is fine but a 200 MB mp4 base64-encoded into JSON can fail the request — use a URL.
Pick the right node
All 52 nodes below carry apiProvider: "fal" in backend/data/node_definitions.json. Endpoint = the slug injected as endpoint_id. The right-most column links the matching per-model spec file under skills/ where one exists (use it for pricing + deep param notes).
| Nebula node id | Display name | Category | FAL endpoint | Key inputs → ports | Per-model file |
|---|---|---|---|---|---|
flux-1-1-ultra |
FLUX 1.1 Ultra | image | fal-ai/flux-pro/v1.1-ultra |
prompt, image | skills/fal-ai__flux-pro__v1.1-ultra.md |
flux-2-pro |
FLUX 2 Pro | image | fal-ai/flux-2-pro |
prompt | skills/fal-ai__flux-2-pro.md |
flux-schnell |
FLUX Schnell | image | fal-ai/flux/schnell |
prompt | skills/fal-ai__flux__schnell.md |
fast-sdxl |
Fast SDXL | image | fal-ai/fast-sdxl |
prompt | skills/fal-ai__fast-sdxl.md |
flux-kontext |
FLUX Kontext | image (edit) | fal-ai/flux-pro/kontext |
prompt, image | skills/fal-ai__flux-pro__kontext.md |
flux-fill-inpaint |
FLUX Fill (Inpaint) | image (inpaint) | fal-ai/flux-pro/v1/fill |
prompt + image + mask → image out | skills/fal-ai__flux-pro__v1__fill.md |
gpt-image-1-5 |
GPT Image 1.5 | image | fal-ai/gpt-image-1.5 |
prompt | skills/fal-ai__gpt-image-1.5.md |
gpt-image-1-5-edit |
GPT Image 1.5 Edit | image (edit) | fal-ai/gpt-image-1.5/edit |
prompt, images | skills/fal-ai__gpt-image-1.5__edit.md |
gpt-image-2-fal-generate |
GPT Image 2 (FAL) | image (stream) | openai/gpt-image-2 |
prompt | — |
gpt-image-2-fal-edit |
GPT Image 2 Edit (FAL) | image (stream, edit) | openai/gpt-image-2/edit |
images, prompt | — |
seedream-4-5 |
Seedream 4.5 | image | fal-ai/bytedance/seedream/v4.5/text-to-image |
prompt | skills/fal-ai__bytedance__seedream__v4.5__text-to-image.md |
ideogram-v4 |
Ideogram 4 | image | ideogram/v4 |
prompt | — |
ideogram-edit |
Ideogram Edit (Inpaint) | image | fal-ai/ideogram/v3/edit |
prompt, image, mask, images (style refs) | — |
ideogram-remix |
Ideogram Remix | image | fal-ai/ideogram/v3/remix |
prompt, image, images (style refs) | — |
ideogram-reframe |
Ideogram Reframe (Outpaint) | image | fal-ai/ideogram/v3/reframe |
image, images (style refs) | — |
ideogram-replace-background |
Ideogram Replace Background | image | fal-ai/ideogram/v3/replace-background |
prompt, image, images (style refs) | — |
ideogram-character |
Ideogram Character | image | fal-ai/ideogram/character |
prompt, reference_images, images (style refs) | — |
ideogram-upscale |
Ideogram Upscale | image | fal-ai/ideogram/upscale |
image, prompt (optional) | — |
recraft-v4-raster |
Recraft V4 | image | fal-ai/recraft/v4/text-to-image |
prompt | skills/fal-ai__recraft__v4__text-to-image.md |
recraft-v4-svg |
Recraft V4 SVG | image (vector) | fal-ai/recraft/v4/text-to-vector |
prompt → svg out | — |
sora-2 |
Sora 2 (sunsets Sep '26) | video (t2v) | fal-ai/sora-2/text-to-video (/pro when model=pro) |
prompt | skills/fal-ai__sora-2__text-to-video.md |
kling-v2-1 |
Kling v2.1 | video (i2v) | fal-ai/kling-video/v2.1/pro/image-to-video |
image, prompt, tail_image | skills/fal-ai__kling-video__v2.1__pro__image-to-video.md |
kling-v3 |
Kling V3 | video (t2v/i2v) | fal-ai/kling-video/v3/standard/text-to-video |
prompt, image, end_image | skills/fal-ai__kling-video__v3__standard__text-to-video.md |
kling-o3 |
Kling Omni 3 | video (i2v) | fal-ai/kling-video/o3/standard/image-to-video |
image, prompt, end_image | skills/fal-ai__kling-video__o3__standard__image-to-video.md |
wan-2-6-t2v |
Wan 2.6 T2V | video (t2v) | wan/v2.6/text-to-video |
prompt | skills/wan__v2.6__text-to-video.md |
wan-2-6-i2v |
Wan 2.6 I2V | video (i2v) | wan/v2.6/image-to-video |
image, prompt | skills/wan__v2.6__image-to-video.md |
wan-2-6-r2v |
Wan 2.6 R2V | video (r2v) | wan/v2.6/reference-to-video |
prompt, video1–3 → video_urls |
skills/wan__v2.6__reference-to-video.md |
luma-ray2-t2v |
Luma Ray 2 | video (t2v) | fal-ai/luma-dream-machine/ray-2 |
prompt | skills/fal-ai__luma-dream-machine__ray-2.md |
luma-ray2-i2v |
Luma Ray 2 I2V | video (i2v) | fal-ai/luma-dream-machine/ray-2/image-to-video |
image, end_image, prompt | skills/fal-ai__luma-dream-machine__ray-2__image-to-video.md |
luma-ray2-flash-modify |
Luma Ray 2 Flash Modify | video (v2v) | fal-ai/luma-dream-machine/ray-2-flash/modify |
video, prompt, image | — |
pixverse-v4-5 |
PixVerse V4.5 | video (t2v/i2v) | fal-ai/pixverse/v4.5/text-to-video |
prompt, image | skills/fal-ai__pixverse__v4.5__text-to-video.md |
ltx-video-2 |
LTX Video 2 | video (i2v) | fal-ai/ltx-2/image-to-video |
image, prompt | skills/fal-ai__ltx-2__image-to-video.md |
ltx-2-3 |
LTX 2.3 | video (i2v) | fal-ai/ltx-2.3/image-to-video |
image, prompt, end_image, audio | skills/fal-ai__ltx-2.3__image-to-video.md |
seedance-2-t2v |
Seedance 2.0 T2V | video (t2v) | bytedance/seedance-2.0/text-to-video |
prompt | skills/bytedance__seedance-2.0__text-to-video.md |
seedance-2-i2v |
Seedance 2.0 I2V | video (i2v) | bytedance/seedance-2.0/image-to-video |
image, prompt, end_image | skills/bytedance__seedance-2.0__image-to-video.md |
seedance-2-r2v |
Seedance 2.0 R2V | video (r2v) | bytedance/seedance-2.0/reference-to-video |
prompt, images → image_urls |
skills/bytedance__seedance-2.0__reference-to-video.md |
seedance-2-fast-t2v |
Seedance 2.0 Fast T2V | video (t2v) | bytedance/seedance-2.0/fast/text-to-video |
prompt | skills/bytedance__seedance-2.0__fast__text-to-video.md |
seedance-2-fast-i2v |
Seedance 2.0 Fast I2V | video (i2v) | bytedance/seedance-2.0/fast/image-to-video |
image, prompt, end_image | skills/bytedance__seedance-2.0__fast__image-to-video.md |
seedance-v1-5 |
Seedance V1.5 Pro (I2V) | video (i2v) | fal-ai/bytedance/seedance/v1.5/pro/image-to-video |
prompt, image, end_image | skills/fal-ai__bytedance__seedance__v1.5__pro__image-to-video.md |
meshy-text-to-3d |
Meshy 6 Text-to-3D | 3d | fal-ai/meshy/v6/text-to-3d (or direct Meshy if MESHY_API_KEY) |
prompt → mesh out | skills/fal-ai__meshy__v6__text-to-3d.md |
meshy-image-to-3d |
Meshy 6 Image-to-3D | 3d | fal-ai/meshy/v6/image-to-3d (or direct Meshy if MESHY_API_KEY) |
image → mesh out | skills/fal-ai__meshy__v6__image-to-3d.md |
hunyuan3d-text-to-3d |
Hunyuan3D V3 Text-to-3D | 3d | fal-ai/hunyuan3d-v3/text-to-3d |
prompt → mesh out | skills/fal-ai__hunyuan3d-v3__text-to-3d.md |
hunyuan3d-image-to-3d |
Hunyuan3D V3 Image-to-3D | 3d | fal-ai/hunyuan3d-v3/image-to-3d |
front/back/left/right_image → mesh out | skills/fal-ai__hunyuan3d-v3__image-to-3d.md |
remove-background |
Remove Background | transform | fal-ai/imageutils/rembg |
image | skills/fal-ai__imageutils__rembg.md |
seedvr2-upscale |
SeedVR2 Upscale | transform | fal-ai/seedvr/upscale/image |
image | skills/fal-ai__seedvr__upscale__image.md |
clarity-upscaler |
Clarity Upscaler | transform | fal-ai/clarity-upscaler |
image → image out | skills/fal-ai__clarity-upscaler.md |
seedvr-video-upscale |
SeedVR2 Video Upscale | transform | fal-ai/seedvr/upscale/video |
video → video out | skills/fal-ai__seedvr__upscale__video.md |
stable-audio-25 |
Stable Audio 2.5 | audio | fal-ai/stable-audio-25/text-to-audio |
prompt → audio out | skills/fal-ai__stable-audio-25__text-to-audio.md |
ace-step |
ACE-Step | audio | fal-ai/ace-step |
(param-only) → audio out | skills/fal-ai__ace-step.md |
mmaudio-v2 |
MMAudio V2 | audio | fal-ai/mmaudio-v2 |
video + prompt → video out | skills/fal-ai__mmaudio-v2.md |
demucs |
Demucs | audio | fal-ai/demucs |
audio → vocals/drums/bass/other | skills/fal-ai__demucs.md |
fal-universal |
FAL | universal | user-set endpoint_id (default fal-ai/flux-pro/v1.1-ultra) |
prompt, image | route to matching file under skills/ |
The bundle ships 169 per-model spec files under
skills/and 16 category overviews undercategories/covering the full FAL catalog (including audio, LLM, vision, and training models that Nebula does not wrap). Those extra files are reference material for thefal-universalescape hatch, not 169 Nebula nodes. The authoritative Nebula roster is the 52 ids above.
Param reference
Types, defaults, ranges, and enums below come straight from backend/data/node_definitions.json. Inputs marked * are required ports. Where a node lists no params, only defaults apply (just wire the inputs).
Image — text-to-image
flux-1-1-ultra— in:prompt*,image. out:image. Params: (none — defaults only).flux-2-pro— in:prompt*. out:image. Params:image_sizeenum [square_hd, square, portrait_4_3, portrait_16_9, landscape_4_3 (default), landscape_16_9];output_formatenum [jpeg (default), png];safety_toleranceenum 1–5 (default 2);enable_safety_checkerbool (default true);seedint.flux-schnell— in:prompt*. out:image. Params:image_sizeenum (default landscape_4_3);num_inference_stepsint 1–4 (default 4);guidance_scalefloat 1–5 (default 3.5);num_imagesint 1–4 (default 1);output_formatenum [jpeg (default), png, webp];accelerationenum [none (default), regular, high];enable_safety_checkerbool (default true);seedint 0–2147483647.fast-sdxl— in:prompt*. out:image. Params:image_sizeenum (default square_hd);num_imagesint 1–4 (default 1);num_inference_stepsint 1–50 (default 25);guidance_scalefloat 1–20 (default 7.5);negative_promptstr;expand_promptbool (default false);lorastextarea (JSON array string);embeddingstextarea (JSON array string);formatenum [jpeg (default), png];enable_safety_checkerbool (default true);safety_checker_versionenum [v1 (default), v2];seedint 0–4294967295.gpt-image-1-5— in:prompt*. out:image. Params:image_sizeenum [1024x1024 (default), 1536x1024, 1024x1536];qualityenum [low, medium, high (default)];backgroundenum [auto (default), transparent, opaque];num_imagesint 1–4 (default 1);output_formatenum [png (default), jpeg, webp].gpt-image-2-fal-generate— streams. in:prompt*. out:image. Params:image_sizeenum (default landscape_4_3);qualityenum [auto, low, medium, high (default)];num_imagesint 1–4 (default 1);output_formatenum [png (default), jpeg, webp];partial_imagesint 0–3 (default 2, controls preview frames).seedream-4-5— in:prompt*. out:image. Params:image_sizeenum [square_hd (default), square, portrait_4_3, portrait_16_9, landscape_4_3, landscape_16_9, auto_2K, auto_4K];num_imagesint 1–6 (default 1);max_imagesint 1–6 (default 1);enable_safety_checkerbool (default true);seedint.ideogram-v4— new 2026-06-10, dual-route (direct api.ideogram.ai preferred when IDEOGRAM_API_KEY is set — see docs/api-guides/ideogram.md; the params below are the FAL dialect). in:prompt*. out:image. Params:rendering_speedenum [TURBO, BALANCED (default), QUALITY];image_sizeenum [square_hd (default), square, portrait_4_3, portrait_16_9, landscape_4_3, landscape_16_9];expansion_modelenum [Medium (default), Large] (magic-prompt expansion);num_imagesint 1–4 (default 1);output_formatenum [png (default), jpeg];seedint;enable_safety_checkerbool (default true). Ideogram 4.0 (released 2026-06-03, open weights + hosted) — frontier text rendering/typography; pick it when legible in-image text matters.ideogram-edit— new 2026-06-10, dual-route (direct = /v1/ideogram-v3/inpaint). in:prompt*,image*,mask*,images(style refs, multi). out:image. Params:rendering_speedenum [TURBO, BALANCED (default), QUALITY];expand_promptbool (default true);num_imagesint 1–4;seedint. Mask polarity: BLACK = edit (inverse of FLUX Fill's white = edit); the mask MUST match the base image's exact dimensions or the API 422s. v3 endpoint — swap to a v4 edit slug when FAL hosts one. Canvas inpaint wiring + mask painting: see.claude/skills/ideogram/SKILL.md(four wires; mask-painter does not pass the base photo).ideogram-remix— new 2026-06-10, dual-route (direct rides the V4 model: /v1/ideogram-v4/remix with image_weight 1-100). in:prompt*,image*,images(style refs). out:image. Params:strengthfloat 0–1 (default 0.8 — higher = more source structure kept);image_sizeenum (square_hd default);styleenum [AUTO (default), GENERAL, REALISTIC, DESIGN];negative_promptstr;rendering_speed;expand_promptbool (true);num_images1–4;seed.ideogram-reframe— new 2026-06-10, dual-route (direct needs theresolutionpixel enum; unset → router stays on FAL). in:image*,images(style refs). No prompt port (the schema takes none). out:image. Params:image_sizeenum required (target canvas — this is the outpaint size);style;rendering_speed;num_images;seed.ideogram-replace-background— new 2026-06-10, dual-route. in:prompt*(describes the NEW background),image*(subject is auto-preserved),images(style refs). out:image. Params:style;rendering_speed;expand_prompt(true);num_images;seed.ideogram-character— new 2026-06-10, dual-route (direct = v3 generate + character_reference_images). Accepts an optionalcharacterport: a Character node bundle expands to trait-prefixed prompt + reference views (identity.py contract). in:prompt*,reference_images*(multi →reference_image_urls),images(style refs →image_urls). out:image. Params:styleenum [AUTO (default), REALISTIC, FICTION];image_size;negative_prompt;rendering_speed;expand_prompt(true);num_images;seed. Consistent identity from 1+ reference photos — pairs with Character Studio refs.ideogram-upscale— new 2026-06-10, dual-route (direct = legacy /upscale with an image_request JSON blob). in:image*,prompt(optional guidance). out:image. Params:resemblanceint 1–100 (default 50);detailint 1–100 (default 50);expand_promptbool (default false here);seed.recraft-v4-raster— in:prompt*. out:image. Params:image_sizeenum (default square_hd);style_idstr;colorsstr (comma-sep hex);background_colorstr;enable_safety_checkerbool (default true).recraft-v4-svg— in:prompt*. out:svg(vector). Params: same asrecraft-v4-raster.
Image — editing
flux-kontext— in:prompt*,image*. out:image. Params:aspect_ratioenum [1:1 (default), 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 21:9, 9:21];num_imagesint 1–4 (default 1);guidance_scalefloat 1–20 (default 3.5);enhance_promptbool (default false);output_formatenum [jpeg (default), png];safety_toleranceenum 1–6 (default 2);seedint.gpt-image-1-5-edit— in:prompt*,images*(→image_urls, ≥1 required). out:image. Params:image_sizeenum [auto (default), 1024x1024, 1536x1024, 1024x1536];qualityenum [low, medium, high (default)];input_fidelityenum [low, high (default)];backgroundenum [auto (default), transparent, opaque];num_imagesint 1–4 (default 1);output_formatenum [png (default), jpeg, webp].gpt-image-2-fal-edit— streams. in:images*(→image_urls, ≥1 required),prompt*. out:image. Params:image_sizeenum [auto (default), square_hd, square, portrait_4_3, portrait_16_9, landscape_4_3, landscape_16_9];qualityenum [auto, low, medium, high (default)];num_imagesint 1–4 (default 1);output_formatenum [png (default), jpeg, webp];partial_imagesint 0–3 (default 2).
Video — text-to-video
sora-2— display name now "Sora 2 (sunsets Sep '26)". in:prompt*. out:video. Params:resolutionenum [720p (default), 1080p];aspect_ratioenum [16:9 (default), 9:16];durationenum [4 (default), 8, 12, 16, 20]. (A UImodeltoggle picks Standard vs Pro endpoint; it is consumed by the wrapper, not sent to FAL.) Sunset: OpenAI announced (2026-03-24) the Videos API + sora-2/sora-2-pro shut down on 2026-09-24 — the FAL endpoints proxy OpenAI, so this node dies then too; plan migrations to another t2v node.wan-2-6-t2v— in:prompt*. out:video. Params:durationenum [5 (default), 10, 15];resolutionenum [720p (default), 1080p];aspect_ratioenum [16:9 (default), 9:16, 1:1, 4:3, 3:4];negative_promptstr;seedint;generate_audiobool (default true);enable_prompt_expansionbool (default true);multi_shotsbool (default true);enable_safety_checkerbool (default true).luma-ray2-t2v— in:prompt*. out:video. Params:aspect_ratioenum [16:9 (default), 9:16, 4:3, 3:4, 21:9, 9:21];durationenum [5s (default), 9s];loopbool (default false);resolutionenum [540p (default), 720p, 1080p].seedance-2-t2v/seedance-2-fast-t2v— in:prompt*. out:video. Params:aspect_ratioenum [auto (default), 21:9, 16:9, 4:3, 1:1, 3:4, 9:16];durationenum [auto (default), 4, 5, 6, 8, 10, 12, 15];resolutionenum (t2v: [480p, 720p (default), 1080p]; fast: [480p, 720p (default)]);generate_audiobool (default true);seedint.
Video — image-to-video
kling-v2-1— in:image*,prompt,tail_image(end frame →tail_image_url). out:video. Params:durationenum [5 (default), 10];negative_promptstr (default "blur, distort, and low quality");cfg_scalefloat 0–1 (default 0.5).kling-v3— in:prompt*,image,end_image. out:video. Params:durationenum [3, 5 (default), 10, 15];aspect_ratioenum [16:9 (default), 9:16, 1:1];negative_promptstr;shot_typeenum [customize (default), intelligent];multi_prompttextarea (JSON array string of{prompt,duration}shots);generate_audiobool (default true);cfg_scalefloat 0–1 (default 0.5).kling-o3— in:image*,prompt,end_image. out:video. Params:durationenum [3, 5 (default), 10, 15];aspect_ratioenum [16:9 (default), 9:16, 1:1];generate_audiobool (default false);negative_promptstr;cfg_scalefloat 0–1 (default 0.5);shot_typeenum [customize (default), intelligent].wan-2-6-i2v— in:image*,prompt*. out:video. Params:durationenum [5 (default), 10, 15];resolutionenum [720p (default), 1080p];aspect_ratioenum [16:9 (default), 9:16, 1:1, 4:3, 3:4];negative_promptstr;seedint;generate_audiobool (default true);enable_prompt_expansionbool (default true);multi_shotsbool (default false);enable_safety_checkerbool (default true).luma-ray2-i2v— in:image*,end_image,prompt. out:video. Params:aspect_ratioenum [16:9 (default), 9:16, 4:3, 3:4, 21:9, 9:21];resolutionenum [540p (default), 720p, 1080p];durationenum [5s (default), 9s];loopbool (default false).pixverse-v4-5— in:prompt*,image. out:video. Params:durationenum [5 (default), 8];aspect_ratioenum [16:9 (default), 4:3, 1:1, 3:4, 9:16];resolutionenum [360p, 540p, 720p (default), 1080p];styleenum [(default), anime, 3d_animation, clay, comic, cyberpunk]; negative_promptstr;seedint.ltx-video-2— in:image*,prompt*. out:video. Params:durationenum [6 (default), 8, 10];resolutionenum [1080p (default), 1440p, 2160p];fpsenum [25 (default), 50];generate_audiobool (default true).ltx-2-3— in:image,prompt*,end_image,audio(→audio_url). out:video. Params:durationenum [6 (default), 8, 10];resolutionenum [1080p (default), 1440p, 2160p];aspect_ratioenum [auto (default), 16:9, 9:16];fpsenum [24, 25 (default), 48, 50];generate_audiobool (default true).seedance-2-i2v/seedance-2-fast-i2v— in:image*,prompt*,end_image. out:video. Params:aspect_ratioenum [auto (default), 21:9, 16:9, 4:3, 1:1, 3:4, 9:16];durationenum [auto (default), 4, 5, 6, 8, 10, 12, 15];resolutionenum (i2v: [480p, 720p (default), 1080p]; fast: [480p, 720p (default)]);generate_audiobool (default true);seedint.seedance-v1-5— in:prompt*,image*,end_image. out:video. Params:durationenum [4–12 (default 5)];aspect_ratioenum [16:9 (default), 9:16, 1:1, 21:9, 4:3, 3:4, auto];resolutionenum [480p, 720p (default), 1080p];generate_audiobool (default true);camera_fixedbool (default false);seedint.
Video — reference-to-video
wan-2-6-r2v— in:prompt*,video1*,video2,video3(the wrapper collates wired ports intovideo_urls; up to 3 reference clips). out:video. Params:durationenum [5 (default), 10];resolutionenum [720p, 1080p (default)];aspect_ratioenum [16:9 (default), 9:16, 1:1, 4:3, 3:4];negative_promptstr;seedint;enable_prompt_expansionbool (default true);multi_shotsbool (default true);enable_safety_checkerbool (default true).seedance-2-r2v— in:prompt*,images*(→image_urls, reference image set). out:video. Params:aspect_ratioenum [auto (default), 21:9, 16:9, 9:16, 4:3, 1:1, 3:4];durationenum [auto (default), 4, 6, 8, 10, 15];resolutionenum [480p, 720p (default), 1080p];generate_audiobool (default true);seedint.
Video — modify
luma-ray2-flash-modify— in:video*(→video_url),prompt,image. out:video. Params:modeenum [adhere_1/2/3, flex_1 (default)/2/3, reimagine_1/2/3] (higher = more creative deviation).
3D
meshy-text-to-3d— in:prompt*. out:mesh. Params: (none — defaults only). Uses direct Meshy API whenMESHY_API_KEYset.meshy-image-to-3d— in:image*. out:mesh. Params: (none). Uses direct Meshy API whenMESHY_API_KEYset.hunyuan3d-text-to-3d— in:prompt*. out:mesh. Params:generate_typeenum [Normal (default), LowPoly, Geometry];face_countint 40000–1500000 (default 500000);enable_pbrbool (default false);polygon_typeenum [triangle (default), quadrilateral].hunyuan3d-image-to-3d— in:front_image*(→input_image_url),back_image,left_image,right_image. out:mesh. Params: same ashunyuan3d-text-to-3d.
Transform
remove-background— in:image*. out:image(transparent PNG cutout). Params:crop_to_bboxbool (default false).seedvr2-upscale— in:image*. out:image. Params:upscale_modeenum [factor (default), target];upscale_factorfloat 1–4 (default 2);target_resolutionenum [720p, 1080p (default), 1440p, 2160p];noise_scalefloat 0–1 (default 0.1);output_formatenum [jpg (default), png, webp];seedint.clarity-upscaler— in:image*. out:image. Params:promptstr (default "masterpiece, best quality, highres");upscale_factorfloat 1–4 (default 2);creativityfloat 0–1 (default 0.35, added detail);resemblancefloat 0–1 (default 0.6, fidelity to source);num_inference_steps("Steps") int 10–50 (default 18);seedint. Diffusion-based (SD1.5 + ControlNet Tile + ESRGAN) — reconstructs realistic detail/texture; pairs withseedvr2-upscale(faithful) when you want creative/added detail instead.seedvr-video-upscale— in:video*. out:video. Params:upscale_modeenum [factor (default), target];upscale_factorfloat 1–4 (default 2);target_resolutionenum [720p, 1080p (default), 1440p, 2160p];noise_scalefloat 0–1 (default 0.1);output_qualityenum [low, medium, high (default), maximum];seedint. ByteDance SeedVR2 — one-step, temporally-consistent video upscaling/restoration to up to 4K (the video counterpart ofseedvr2-upscale); chains from any video node'svideooutput.
Universal
fal-universal— in:prompt*,image. out:image|video|audio|mesh(whichever the response yields). Params:endpoint_idstr (defaultfal-ai/flux-pro/v1.1-ultra) — paste any catalog slug. Onlypromptandimageports exist, so endpoints needing other inputs (end frames, multi-image, audio) can't be fully driven from this node — wire those through the dedicated wrapper node instead.
Recipes
Concept still → cinematic shot.
flux-1-1-ultra(hero still from a prompt) → wire itsimageoutput intokling-v3'simageinput, add a motionprompt→ moving shot onkling-v3'svideooutput. Swap inseedance-2-i2vorluma-ray2-i2vif you want a start and end frame (end_imageport). For a tail-only end frame on Kling 2.1, usekling-v2-1withtail_image.Product cutout → spinnable 3D.
remove-background(clean a product photo → transparent PNG on itsimageoutput) → feed that intomeshy-image-to-3d→ download the.glbfrom itsmeshoutput. For a sharper mesh, shoot four angles and usehunyuan3d-image-to-3d(front_image/back_image/left_image/right_imageports) withenable_pbron.Logo + asset factory.
recraft-v4-svgwith a brand prompt and acolorspalette → editable SVG on itssvgoutput. Thenrecraft-v4-rasterfor matching raster art, andseedvr2-upscale(upscale_factorup to 4) to push any raster to 4K.Photo → looping clip with sound, no audio node.
flux-2-pro(still) →wan-2-6-i2vwithgenerate_audio: true→ a short audio-bearing clip on thevideooutput. (FAL bakes audio into the video here; Nebula has no separate FAL audio node — see Capability boundaries.)Reach an un-wrapped model. Drop the FAL node (
fal-universal), setendpoint_idto any catalog slug (e.g.fal-ai/recraft/v4/text-to-image), wire aprompt(andimageif the model takes one), and run. Output type (image/video/audio/mesh) is auto-detected from FAL's response. Use this only for text/image-driven endpoints — multi-input endpoints need a dedicated wrapper node.
In the nebula_nodes context
- Node ids: the 52 ids in Pick the right node (all carry
apiProvider: "fal",envKeyName: "FAL_KEY"— except the twomeshy-*nodes whoseenvKeyNameis["MESHY_API_KEY", "FAL_KEY"], preferring direct Meshy). - Handler files:
backend/handlers/fal_universal.py(the single shared handler — submit/poll/parse, port→key mapping, base64 inlining, output detection). Dispatch +endpoint_idinjection + per-node param pre-processing (sora-2tier select,fast-sdxlJSON arrays,kling-v3multi_prompt,wan-2-6-r2vvideo_urlscollation,recraftcolor params,meshydirect-API preference) live inbackend/execution/sync_runner.py. SSE streaming for the two GPT Image 2 nodes goes throughbackend/execution/stream_runner.py. Deeper infra notes:docs/model-providers/fal/fal-universal.md. - Input/output ports: image nodes output an
imageport (Recraft SVG outputssvg); video nodes outputvideo; 3D nodes outputmesh;fal-universalexposes all four output ports and the runtime picks one. Input ports use canvas-friendly names (image,images,end_image,front_image, …) that the handler remaps to FAL keys (image_url,image_urls,end_image_url,input_image_url, …) — see the mapping table in Universal rules. - Chaining rules: connect an upstream
imageoutput to a downstreamimageinput for i2v / edit / 3D / upscale chains;meshoutputs feed 3D-consuming nodes;videooutputs feedluma-ray2-flash-modify/wan-2-6-r2v(itsvideo1/video2/video3ports). Multi-image ports (gpt-image-1-5-edit,gpt-image-2-fal-edit,seedance-2-r2vimages) accept a list; the two edit nodes error if no image is provided. - How outputs render: the handler returns a signed FAL URL per output port. Nebula downloads it locally and serves it via
/api/outputs/…; images render in the canvas image preview, videos in the video player, meshes via the GLB/model-viewerpreview, SVG inline. URLs are time-limited, so render/download promptly.
Capability boundaries (what FAL's API can do that these 52 Nebula nodes CANNOT)
State these plainly when a user asks — do not over-promise.
- Audio is only partly wired (music — instrumental + vocals — video-to-audio Foley, and stem separation). Music is now wired both ways:
stable-audio-25(fal-ai/stable-audio-25/text-to-audio) reaches text-to-instrumental-music + sound effects (up to 3 min, 44.1kHz, instrumental only — no lyrics/vocals), andace-step(fal-ai/ace-step) generates full songs with synthesized vocals/lyrics from genre/styletags+lyrics(up to 60s). Video-to-audio Foley is also wired:mmaudio-v2(fal-ai/mmaudio-v2) generates synchronized SFX/ambient audio for a video and returns the clip muxed with that audio. Stem separation is wired too:demucs(fal-ai/demucs) splits a mixed track into four isolated stems (vocals, drums, bass, other). The rest of FAL's large audio catalog is not reachable: TTS, speech-to-text, voice cloning, dubbing, audio isolation, and lipsync (sync-lipsync) — ElevenLabs, MiniMax, Whisper, etc. (Some video nodes also bake audio into the clip viagenerate_audio, but that's not standalone audio generation.) For TTS/STS/dubbing in Nebula, use Runway or ElevenLabs nodes instead. - No LLM / vision / text generation. FAL hosts LLM and multimodal-vision endpoints; no Nebula FAL node exposes them. The handler has a text fallback but nothing routes to it.
- No LoRA / model training. FAL training endpoints (e.g. FLUX LoRA trainers) are not wrapped.
fast-sdxlcan consume a LoRA (via itslorasJSON param) but Nebula cannot train one. - Inpainting / masked editing is wired.
flux-fill-inpaint(fal-ai/flux-pro/v1/fill, FLUX.1 [pro] Fill) edits only the masked region of an image — wireprompt+image+mask(white = the region to edit); inpaint to replace objects in a frame or outpaint to extend its borders, leaving unmasked regions untouched. It is the only mask-based node; the other edit nodes (flux-kontext, the GPT Image edit nodes) are whole-image. - Three upscalers (two image, one video) / one video-modify model.
seedvr2-upscale(faithful) andclarity-upscaler(creative/added detail) are the wired image upscalers, andseedvr-video-upscale(ByteDance SeedVR2, one-step, temporally-consistent to up to 4K) is the wired video upscaler (FAL also has ESRGAN and other upscalers/restorers, etc.);luma-ray2-flash-modifyis the lone video-to-video / restyle node (FAL has many more). - Transport/control surface is minimal. Nebula always uses the queue transport (never the synchronous
fal.runhost), polls status (no SSE status-stream). Cancellation is wired (2026-06-05): when a node's task is cancelled (client disconnect, agent cancel, etc.) the handler PUTs FAL'scancel_urlon a detached best-effort task so the queued/in-flight job stops upstream instead of running to completion (~10 min). It still does not use: webhooks (?fal_webhook=), real-time WebSocket, the file-storage upload API (it base64-inlines local files instead, which bloats large requests), real log streaming (?logs=1— progress is a synthetic poll-count bar), or theX-Fal-*queue headers (priority, server-side timeout, no-retry, runner affinity). The only SSE path wired is streaming for the two GPT Image 2 nodes. - Catalog reach via escape hatch only. ~53% of FAL's overall capability surface is exposed as dedicated nodes. Anything outside the 52 ids (and outside the rest of the audio catalog plus LLM/training, which need different transport or inputs) is reachable only through
fal-universalby pasting a slug — and only if the model needs nothing beyond apromptand a singleimage.
Sources
- Nebula audit guide (primary, source-cited):
docs/api-guides/fal.md. - Live node roster, ports, params, defaults:
backend/data/node_definitions.json(52 nodes withapiProvider: "fal"). - Handler behavior (submit/poll/stream, port→key mapping, base64 inlining, output detection):
backend/handlers/fal_universal.py,backend/execution/sync_runner.py,backend/execution/stream_runner.py; infra notes indocs/model-providers/fal/fal-universal.md. - Per-model specs + category overviews (full FAL catalog, for the
fal-universalescape hatch):skills/(169 files) andcategories/(16 files) in this bundle; machine-readableby_category.json. - FAL official docs — capability overview https://fal.ai/docs; Queue API (submit/status/result/cancel, webhooks,
X-Fal-*) https://fal.ai/docs/model-endpoints/queue; calling patterns (syncfal.runvsqueue.fal.run, subscribe/submit/stream/realtime) https://fal.ai/docs/model-endpoints; file storage/upload https://fal.ai/docs/documentation/development/file-storage; model catalog https://fal.ai/models. For any single model's exact params, the canonical LLM-friendly spec ishttps://fal.ai/models/{slug}/llms.txt. - Verified 2026-06-04 against the live roster and handler (node roster updated 2026-06-10:
ideogram-v4+ the six-node Ideogram editing suite added,sora-2renamed for its Sep '26 sunset).