Protoface MiniMax Hailuo 2.3 · Image to Video
Five seconds, 1080p, no knobs
- video
- files
- run id
The whole node in one sentence
You give Hailuo 2.3 an image and a prompt, and five seconds of 1080p video comes back. Note what's missing from that sentence: duration, resolution, aspect ratio, seed. This node has none of them. That's not the brief being coy - the schema genuinely exposes three things you can change (prompt, image, enable_prompt_expansion) plus the two booking fields, and the model's clip length and resolution are the provider's fixed offering.
For a beginner that's honestly a relief. Animating a still locally means a video model, a VAE, a frame count, a sampler schedule and a first afternoon of OOM errors. Here you wire Load Image in and a VIDEO comes out. For a five-second beat - a product rotating, a portrait coming to life, a shot where you already like the frame and just want motion - this is the shortest path in ComfyUI.
The catch is the same one every API node carries: the frame you love is now somebody else's billing event, and Hailuo's safety filter sits between your prompt and the render.
How it works, briefly
The Protoface pack is one adapter over a catalog of ~95 tasks; this node is the video.animate operation for Hailuo 2.3. On queue, your image is encoded and uploaded as an asset (cached - re-running with the same file doesn't re-upload), a request is journaled with an idempotency key derived from your account, the node scope, generation_id and the payload, then submitted. The node polls and downloads the finished clip into a native VIDEO. Because the identity of the request is computed from the payload, changing the prompt or the image is a new paid request, and that's not something generation_id can undo.
Inputs
image is the frame you want animated - Load Image straight in. Single asset: a batch throws "expects one asset; split the image/audio batch first" from the adapter.
prompt describes the motion, not the picture. The image already says what the scene is; your prompt should say what happens. "Hands lift the cup, steam curls, camera pushes in slightly" will do more than re-describing the room.
enable_prompt_expansion defaults to true, and its tooltip is the interesting one: expanding the prompt also activates the safety checker, which detects and filters potential risks. So turning it off isn't purely a style decision - it changes what the pipeline does with your prompt. Keep it on unless you have a specific reason, and if a render comes back refused or oddly sanitised, this is the flag to think about.
generation_id is the paid-job identity: fixed to reuse or resume, incremented for a fresh generation. request_scope is assigned by the frontend; only headless callers need to invent one.
Outputs
video (VIDEO, list), files (PROTOFACE_FILE, list - the original container, for Protoface Save File), and run id (string). Wire video into Save Video or Video Combine; wire run id into a text preview if you're queueing a lot of these, because it's your only handle on a job after the browser closes.
Install
ComfyUI 0.41.0+, Python 3.10+, and no model weights - Hailuo isn't downloadable. Manager (search Protoface → protoface-nodes) or:
cd ComfyUI/custom_nodes
git clone --branch v0.1.0 --depth 1 https://github.com/protoface-ai/protoface-comfyui.git protoface
python -m pip install -r protoface/requirements.txt
Then Protoface (lower-right) → paste key. The key sits in server memory and is gone after a restart, which is why a working setup suddenly asks you for one the next morning.
Where people get bitten
People expect a duration field and go looking for one in the settings dialog. There isn't one; if you need control over length, this is the wrong Hailuo node - the pack also ships a general MiniMax H3 node with duration_seconds from 4 to 15.
A refusal or a weirdly tame render with enable_prompt_expansion on is the safety checker doing its job, not a bug you can prompt around.
And if the browser disconnects mid-render, don't queue again. The job is still alive on Protoface's side - keep the same generation_id and requeue, or use Protoface Resume Run with the run id. Bumping the generation ID to "retry" is how a single five-second clip gets charged twice.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | COMBO | The positive prompt for the generation. | |
| image | COMBO | A public URL, a data URI, or an asset id. | |
| enable_prompt_expansion | BOOLEAN | true | The model automatically optimizes incoming prompts to enhance output quality. This also activates the safety checker, which ensures content safety by detecting and filtering potential risks. |
| generation_id | INT | 00–9007199254740991 | Keep fixed to reuse/resume this paid job. Increment for a fresh paid generation; independent of the model seed. |
| request_scope | STRING | Automatically assigned per node. Headless clients must supply a stable unique workflow/node ID. This is not a secret. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| files | PROTOFACE_FILE | — |
| run id | STRING | — |