HappyHorse-1-1 image-to-video
The arena model's animator, no weights required
- image_urls
- video
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
HappyHorse is the strange one. It showed up in video-arena rankings under what everyone assumed was a placeholder codename, got "open source?" threads within hours - and a pile of fake HuggingFace repos alongside them, which the subreddit spent a day correctly calling scams. It never opened weights. It is a closed, API-only video model, and this node is how you call it from a Comfy graph.
Why you'd reach for it
Because it's genuinely good at the thing local video models are worst at: holding a character across cuts. The community's own evaluation of HappyHorse 1.0 against Veo 3.1, Seedance 2.0 and Wan 2.7 came out as "none of them won everything," and the multi-shot consistency demo posts did numbers. Caveat that with the other half of the story: that thread wave was partly astroturfed - one of the higher-scoring HappyHorse posts got taken apart in the comments as a karma-bot promotion for a third-party hosting service. Treat the hype as real but marketed.
So: use it when you have one strong keyframe and need it to move convincingly, or when you're chaining shots and need the character to survive the cut. Don't use it for anything you can run locally, because the per-call billing is the tax you pay for a model you can't download.
The inputs
image_urls (required) is an IMAGE socket - KIE documents it as the first-frame image, exactly one image, so don't try to push a batch through and expect a batch back. Requirements from the docs: JPEG/PNG/WebP, both sides at least 300px, aspect ratio between 1:2.5 and 2.5:1, up to 20MB. The pack uploads your tensor as PNG.
prompt (required in the node even though KIE lists it as optional) describes the motion - what changes, how the camera moves. Up to 5000 non-Chinese characters, or 2500 if you're prompting in Chinese.
resolution is 1080p (default) or 720p. duration is a float from 3 to 15 seconds, defaulting to 5. The docs say the value must be an integer number of seconds and the widget is a float - keep it whole-numbered and you'll never notice; give it 5.5 and you're trusting the API to round.
timeout_seconds defaults to 1200. callback_url is for webhooks - leave it empty.
No seed here: the 1.1 image-to-video node is a fresh roll every time.
Outputs
video → a normal VIDEO out to your combine/save nodes. url is the primary result URL, all_urls_json holds everything the provider returned, task_id is your ticket if something fails, raw_json is the provider response verbatim, and credits_consumed / credits_left are floats so you can watch spend. Downloaded clips 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 and you'll find it under KIE Next / Video / HappyHorse. Dependencies are requests, Pillow, numpy, PyYAML; there are no model files because the model is remote. The repo also ships a one-click Windows installer in dist/.
API key: Settings → KIE.ai Nodes Next → Connection → Paste / replace KIE.ai API key. It's validated before saving, only a masked fingerprint is shown afterwards, and the key never goes into your workflow JSON. On headless setups, KIE_API_KEY in the environment works and takes priority over the saved key.
Common issues
Upscaling the keyframe doesn't help. KIE's documented floor is 300px per side; the docs recommend 720P or better for the reference, and pushing a 4K inpaint isn't a quality lever - it's just a slower upload. Blurry or over-compressed sources do degrade output, which is the one input-quality rule that actually bites.
Task rejected on aspect ratio. If your first frame is a 3:1 banner or a tall 9:21 crop, it falls outside the documented 1:2.5–2.5:1 window. Crop to something saner before animating.
"Timed out waiting for KIE task …" - the job keeps running and the credits are gone. The message contains the task id; check it with the Task Status node instead of re-queueing.
Queueing twice does nothing the second time. Identical inputs are cached by ComfyUI, so you get the same clip back with no new charge. Change the prompt or the image to submit again.
"KIE model ID has not been resolved yet." First-launch catalog sync didn't finish. Run the Catalog Sync node, reload the page, try again.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image_urls | IMAGE | — | |
| prompt | STRING | A cat running on the grass | Describes the video content to generate. Supports any language. Maximum: 5,000 non-Chinese characters or 2,500 Chinese |
| resolutionopt | COMBO | 1080p | The resolution of the generated video. Options: 720p; 1080p |
| durationopt | FLOAT | 5.003–15 | The duration of the generated video, in seconds. The value must be an integer in the range [3, 15]. Default: 5 |
| 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 | — |