jz fal Video
Kling and Hailuo clips in your graph — where the JSON check earns its keep
- image
- video
- request_id
- info
Why you'd leave the GPU idling for this
Video is the one place where local genuinely isn't the answer yet for a lot of jobs. There are no weights for Kling or Hailuo - MiniMax only opened H3's weights in August 2026, and it's a 42 GB model under a licence that excludes the US, EU, UK and Korea, which is not most people's evening. So if you want that specific look, a paid endpoint is the only door.
jz fal Video is the pack's fal queue client pointed at video models: same node shape as jz fal Image, different output type. The curated picks are fal-ai/kling-video/v2/master/image-to-video, the matching text-to-video variant, and fal-ai/minimax/hailuo-02/standard/image-to-video, with custom reaching any of fal's roughly 1,500 endpoints.
How it works, and why it differs from the image node
Mechanically it's identical: POST https://queue.fal.run/{model}, poll the status URL, fetch the finished result. What changes is the shape of what comes back.
The output is a native VIDEO, not an IMAGE batch. That's not fussiness - a 5-second 1080p clip decoded to a Comfy tensor is something like 3 GB of float data, and the node would be building it every run for no reason. Instead the MP4 is downloaded and wrapped with ComfyUI's InputImpl.VideoFromFile, so you wire it into a saver (core's SaveVideo takes a VIDEO directly, and the VideoHelperSuite nodes do too). That means the node needs a reasonably current ComfyUI - it imports comfy_api.latest, so a build from before the VIDEO type existed will fail at import.
The second difference is that the pre-flight validation matters more here, because video is where video money goes. params is still a JSON widget, validated against fal's published OpenAPI schema before anything billable is sent - missing required field, unknown parameter, wrong type or bad enum all raise locally and list what the model accepts. On a video model that's the difference between a free error message and a $2 typo.
The inputs that matter
model- the curated video shortlist above, orcustom+custom_modelfor anything else (including later Kling, Veo, Wan and LTX endpoints).prompt- motion description. It's defaulted intoargs, so a"prompt"key inparamsoverrides the widget.params- everything model-specific. The author's example is{"duration": "5", "cfg_scale": 0.5}; note the duration is a string, which is exactly the kind of thing the schema check catches for you.image- the start frame or reference for the image-to-video models. Wire it into a text-to-video endpoint and the node raises instead of submitting: that model declares no image input at all.poll_timeout- 1800 seconds by default, 5-second interval. Keep it generous; a clip can sit in queue for a while, and while fal can cancel a job, you'd rather it finish.
Outputs are video, request_id and info. The request_id is worth keeping: fal holds the result server-side, so a graph that errors after the spend is recoverable rather than a second purchase.
Install
Same as the rest of the pack. ComfyUI Manager → search comfyui-jz, or:
cd ComfyUI/custom_nodes
git clone https://github.com/j-zhang19/comfyui-jz
Restart ComfyUI. No models to download, no fal_client package to fight with - the pack's declared dependencies are just requests, pillow and numpy, which ComfyUI already ships with.
Key setup: FAL_KEY=... in a .env at the pack root, or [FAL] api_key=... in config.ini. Both are gitignored. Leave the api_key widget empty unless you enjoy your key living inside shared workflow JSON.
Where people get burned
- The bill is per job, and video jobs are the expensive ones. This is the standard objection to API nodes pointed at video, and it's correct: the "videos per month per $20" maths is grim compared to a local Wan run. Use it for the jobs your local stack can't do, not as the default.
- Timeout cancels. If
poll_timeouttrips, the node cancels the request rather than leaving it queued and charging. That's the right behaviour, but it does mean a very slow model plus a stingy timeout equals a wasted submit. - No retries on the billable submit. Deliberate: a retried POST whose first attempt landed would queue and bill a second video.
- Model list looks stale? It's the live fal catalogue cached for 24 hours. Use
custom+custom_modeland stop waiting on the cache. infois JSON, not a receipt you can trust. It's the raw result minus the video - the numbers that matter live on your fal dashboard.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | fal-ai/kling-video/v2/master/image-to-video | 4 options: fal-ai/kling-video/v2/master/image-to-video, fal-ai/kling-video/v2/master/text-to-video, fal-ai/minimax/hailuo-02/standard/image-to-video, custom |
| prompt | STRING | a cat walking through grass | — |
| params | STRING | {} | model-specific arguments as json, e.g. {"duration": "5", "cfg_scale": 0.5}. checked against the model's schema before anything is billed; the console prints what it accepts |
| imageopt | IMAGE | start frame / reference, for the image-to-video models | |
| custom_modelopt | STRING | — | |
| api_keyopt | STRING | — | |
| poll_timeoutopt | INT | 180030–7200 | — |
| poll_intervalopt | INT | 51–30 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| request_id | STRING | — |
| info | STRING | — |