Protoface MiniMax Hailuo 2.3 · Text to Video
The two-field video node
- video
- files
- run id
Two fields you can change
prompt, and enable_prompt_expansion. That is the entire creative surface of this node. Fifteen seconds after you first see it you'll have read every control, and then you either queue it or close the tab.
The output is fixed by the provider: a five-second 1080p clip from Hailuo 2.3. No duration picker, no resolution picker, no aspect ratio, no seed. If that sounds limiting, it is - and it's also the cleanest possible introduction to the whole API-node category. There's no workflow to build, no VRAM to budget, no sampler to tune. Text in, video out, invoice.
Which is exactly when you'd reach for it: storyboard beats and animatics where you need a shot of something, fast, and you'll re-generate or move on. Not for a shot you need to repeat identically, and not for anything you need more than five seconds of.
What happens when you queue
The Protoface pack doesn't have hand-written code per model. There's one adapter, and ~95 nodes generated from a catalog of public request schemas - this is the video.generate operation for Hailuo 2.3. On execute, the node validates your payload against that schema before spending anything, journals a request identity (account + node scope + generation_id + model + schema fingerprint + payload) into ~/.cache/protoface-comfyui, submits with an idempotency key derived from it, then polls the job and turns the result into native ComfyUI types. The reason that matters practically: a duplicate queue of an unchanged node doesn't buy a second clip, and a network hiccup doesn't either.
The catalog is bundled and loads offline, so the node exists even with no key and no network. New models arrive via Protoface → Refresh catalog plus a restart, without reinstalling the extension - nice design, and the reason a node you saw on the registry might not be in your Add Node list until you refresh.
Inputs
prompt is the shot description, and it's worth writing like a shot list rather than a caption: subject, action, camera, light. Hailuo responds to motion verbs.
enable_prompt_expansion defaults to on. Read its tooltip carefully, because it's not just a prompt prettifier: the rewrite also switches on the safety checker. If a clip comes back tamer than what you asked for, or a prompt gets filtered, that's the flag involved. Leaving it on is the sane default; turning it off is a deliberate choice about both polish and filtering.
generation_id (0 by default) is the job's identity, not a seed - there is no seed field here at all, so you cannot pin a lucky roll. Fixed ID plus unchanged inputs = reuse/resume. Incremented ID = a new paid generation. request_scope is stamped per node by the frontend and must be supplied by hand only in headless workflows, where an empty value makes the node refuse to submit.
Outputs
video is a native VIDEO - and a list, so multiple results map cleanly into Save Video or Video Combine downstream. files gives the untouched originals as PROTOFACE_FILE, which is what Protoface Save File writes to your output directory if you care about the provider's container rather than ComfyUI's re-mux. run id is a string: your support handle and the input to Protoface Resume Run.
Install
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
ComfyUI 0.41.0+, Python 3.10+; dependencies are httpx, jsonschema, Pillow, av>=14. Or skip the shell: ComfyUI-Manager → search Protoface → install protoface-nodes → restart → reload the browser. Then the Protoface button in the lower-right corner and your API key. Note the key is held in server memory only - restart the server and you'll be asked again; for a headless box use PROTOFACE_API_KEY_FILE.
Where people get bitten
No nodes in the search box: check the ComfyUI version (0.41.0 is the floor), check the startup log for an import error, and make sure you don't have the pack installed twice under two folder names.
No credit or an auth error right after a restart is usually the memory-only key, not the account.
And the one that bites everyone eventually: a timeout or a dropped browser tab does not mean the render failed. Keep the same generation_id, requeue, or resume with the run id. Cancelling mid-job is best effort and carries no refund, so "stop" is not a discount.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The positive prompt for the generation. | |
| 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 | — |