Hailuo Pro Image to Video
The quality tier, and the end-frame socket you must fill
- image_url
- end_image_url
- video
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
What it is
MiniMax's Hailuo 02 Pro image-to-video model - the quality tier of the closed Hailuo video service - as a node at KIE Next / Video / Hailuo. You give it a still, optionally a last frame, and a prompt describing the motion; it gives you a video.
Hailuo is one of the names people drop when they're comparing a local Wan or LTX render to a hosted one: same job, hours of VRAM tuning versus a credit and a wait. Our KB's MiniMax panel covers the lab itself - Shanghai, publicly traded since early 2026, Hailuo its flagship closed video product and H3 its first open-weights release. What matters for this node is narrower: Hailuo 02 Pro is the high-quality endpoint, and the same KIE catalog also carries Hailuo 2.3 and the standard/02 text-to-video variants as separate nodes, so you're choosing a model, not a setting.
How it works
The image_url (and end_image_url, if connected) are uploaded to KIE's upload endpoint as PNG, and the returned URLs go into the create-task payload with your prompt and the optimizer flag. The node polls until the task completes, downloads the MP4, and returns a native VIDEO. Nothing runs locally.
The first-frame/last-frame pattern is the interesting part of this node: connect one image and it's classic image-to-video. Connect two and you're interpolating a transition between them - which is how people get a controlled camera move or an A-to-B morph without describing every beat in text.
The inputs
- image_url (required) - the starting frame. KIE documents a 10MB cap and JPEG/PNG/WebP on the upload.
- end_image_url (required in this schema) - the last frame. KIE's own docs call this optional, but the node lists it as required. If a run refuses to queue, that's why: feed it an image, even the same one twice, and the graph validates.
- prompt (required) - up to 1500 characters. Shorter than the image models' limits on purpose; Hailuo responds well to concrete camera and motion language rather than adjective soup.
- prompt_optimizer - boolean, default
true. On, the model rewrites/expands your prompt internally before generating. This is a real fork in behaviour: with it on, weirdly terse prompts get rescued; with it off, what you typed is what you get. Turn it off when you've carefully crafted a prompt and don't want it reinterpreted. - nsfw_checker - default
false, and the tooltip is unusually candid: with it off, KIE's content filtering is disabled and results come back as the model produced them, with no guarantee anything gets filtered. It is not a guarantee of anything, and provider policy still applies. - timeout_seconds (1200) and callback_url (leave empty).
Outputs
video is the deliverable, as a ComfyUI VIDEO. url is the primary result URL; all_urls_json is every URL the task returned; task_id is the handle for anything downstream (extend, upscale, or a task lookup); raw_json is the provider response when you need to know why something failed; credits_consumed and credits_left report cost and remaining balance and are also printed on the node after a successful run.
Note that unlike the standard node, Pro exposes no resolution or duration controls - that's the tier's trade. You're buying a fixed, better render.
Install
Manager → KIE.ai Nodes Next, or:
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
python -m pip install -r ComfyUI-KIE-Nodes-Next/requirements.txt
requests, Pillow, numpy, PyYAML. No model downloads, no VRAM requirement, but you do need a funded KIE.ai account. Restart ComfyUI, then paste your API key once at Settings → KIE.ai Nodes Next → Connection - verified before saving, masked afterwards, and KIE_API_KEY covers headless installs. The pack generates its nodes from KIE's docs index on first launch and re-syncs about daily.
Gotchas
- Both frames must be connected. The schema treats
end_image_urlas required even though the vendor calls it optional; a queue that refuses to start is almost always this. - Prompt text is capped at 1500 characters. Long cinematic bibles get truncated by the provider.
- Video credits are the expensive ones. Draft on the standard tier, finish on Pro.
- No key →
No KIE API key configured.One-time Settings fix. - Keep ComfyUI reasonably current - the pack's
VIDEOoutputs use ComfyUI's newercomfy_apifile helper and will tell you to update if it's absent.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Cinematic wide shot: A colossal starship drifts silently above the rings of Saturn, its metallic hull reflecting streaks of cosmic light. The camera pushes closer, revealing thousands of illuminated windows like a floating city. Smaller fighter crafts dart across the frame, leaving neon trails as they maneuver through the vastness of space. A sudden burst of thrusters scatters asteroid fragments in slow motion, glowing faintly as they collide and drift apart. | Text prompt describing the desired video animation (Max length: 1500 characters) |
| image_url | IMAGE | Input image to animate (File URL after upload, not file content; Accepted types: image/jpeg, image/png, image/webp; Max size: 10.0MB) | |
| end_image_urlopt | IMAGE | Optional URL of the image to use as the last frame of the video (File URL after upload, not file content; Accepted types: image/jpeg, image/png, image/webp; Max size: 10.0MB) | |
| prompt_optimizeropt | BOOLEAN | true | Whether to use the model's prompt optimizer (Boolean value (true/false)) |
| nsfw_checkeropt | BOOLEAN | false | Defaults to false. When false, no additional content filtering is applied and results are returned directly by the model. |
| timeout_secondsopt | INT | 120030–7200 | — |
| callback_urlopt | STRING | Optional KIE callback URL. Leave empty for normal ComfyUI use. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| url | STRING | — |
| all_urls_json | STRING | — |
| task_id | STRING | — |
| raw_json | STRING | — |
| credits_consumed | FLOAT | — |
| credits_left | FLOAT | — |