HappyHorse-1-1 reference-to-video
Paste a URL, name your characters in the prompt
- reference_image
- video
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
This is the character-consistency node. Instead of animating a first frame, you hand HappyHorse a reference image and describe a shot, and it generates the video with that subject in it. It's the hosted answer to the problem every local workflow keeps tripping over: keeping the same character across shots without training a LoRA.
Be clear-eyed about the trade, though. Weights for HappyHorse were never released - the "open source?" excitement in April 2026 was followed almost immediately by a wave of fake HuggingFace repos that the community correctly flagged as scam bait. What's real is the hosted API, which is what this node calls.
The awkward part: that field is a URL, not a socket
reference_image is a STRING widget, not an IMAGE socket. It wants a JSON array of image URLs - the default value is literally:
[
"https://static.aiquickdraw.com/tools/example/1782114387854_IufKnPxR.png"
]
So unlike the sibling image-to-video node, you can't just wire a Load Image into it. Options: paste a public URL, or use the pack's Upload Image utility node, feed a STRING from something that produces one, and connect that into this field. That extra hop is the price of admission.
Documented limits for the reference: JPEG/JPG/PNG/WEBP, shortest side at least 400px, 720P or higher recommended, 20MB max. Small, blurry or heavily compressed references degrade the output - that's the vendor saying out loud what you'd otherwise learn the hard way.
Prompting by index
prompt (required) is where this node earns its keep. KIE's own documentation says to refer to references as [Image 1], [Image 2] in the text, in the same order as the media array, and to name the object explicitly: "the woman in a red qipao in [Image 1]". Up to 5000 non-Chinese characters, or 2500 in Chinese - over that gets truncated silently.
If you feed two references and don't reference them in the prompt, expect the model to mix them however it likes.
The rest of the inputs
resolution is 1080p (default) or 720p. aspect_ratio is a nine-way dropdown - 16:9, 9:16, 3:4, 4:3, 4:5, 5:4, 1:1, 9:21, 21:9 - which is more flexibility than the image-to-video sibling gets, because there's no source frame dictating the shape. duration is a float 3–15 seconds, default 5, and the docs call for whole seconds. timeout_seconds defaults to 1200; callback_url stays empty.
No seed. Every run is a new roll, which matters when you've finally got a good take.
Outputs
video (a native VIDEO object) is the one that matters. Alongside it: url, all_urls_json, task_id, raw_json, and credits_consumed / credits_left as floats. The node also prints a credits receipt, and downloaded results are archived in ComfyUI/output/KIE-Results/videos/.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
cd ComfyUI-KIE-Nodes-Next
pip install -r requirements.txt
Restart ComfyUI. Four light dependencies (requests, Pillow, numpy, PyYAML), no checkpoints, no VRAM. There's a one-click Windows installer in dist/ too. Manager may not list the pack yet - the README describes the registry route as still upcoming - so the clone is the reliable path.
Then: Settings → KIE.ai Nodes Next → Connection, paste your KIE key once. It's validated before it replaces anything, and the frontend only ever sees a masked fingerprint. KIE_API_KEY in the environment works for headless installs and overrides the saved key.
Worth knowing before you spend
A reference image and a prompt are not an identity lock. That's the pack author's own framing, and it matches what the wider community says about reference-image approaches generally: you get a strong resemblance, not a guarantee, and consistency degrades as you push further from the reference pose. For a character you'll use hundreds of times, a trained LoRA is still the more reliable tool - and HappyHorse's API-only status means you can't train one on it.
Two characters in one shot is the harder problem. The community's read on character consistency is that single-character consistency is well enough solved and multi-character composition still needs scaffolding. Reference-to-video helps; it doesn't make the merge problem disappear.
Timeout ≠ refund. If the node reports "Timed out waiting for KIE task …", the job is still running server-side and already billed. Use the task_id from the error with the Task Status node.
The free rerun. Queue the identical graph twice and ComfyUI serves the cached output - no second charge, no second video. Change the prompt to submit again.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| reference_image | IMAGE | — | |
| prompt | STRING | A cat running on the grass | A description of the desired elements and visual style for the generated video. Input in any language is supported. The length is limited to 5,000 non-Chinese characters or 2,500 Chinese characters. Content exceeding this limit is automatically truncated. Image referencing: In the prompt, use "[Image 1]" and "[Image 2]" to refer to the corresponding reference image in the media array. The order must be consistent with the order in the media array. When using a reference, specify the object in the image, such as "the woman in a red qipao in [Image 1]". |
| resolutionopt | COMBO | 1080p | The resolution tier of the generated video. Options: 720p; 1080p |
| aspect_ratioopt | COMBO | 16:9 | The aspect ratio of the generated video. Options: 16:9; 9:16; 3:4; 4:3; 4:5; 5:4; 1:1; 9:21; 21:9 |
| durationopt | FLOAT | 5.003–15 | The duration of the generated video, in seconds. Value range: An integer from 3 to 15. |
| 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 | — |