Happy Horse Image to Video (Ace Data Cloud)
No ratio widget, and a URL problem you have to solve yourself
- status
- task_id
- video_url
- trace_id
Animate a still. That's the pitch, and it's the least exotic thing in this pack - first-frame-conditioned video is how most people actually work, because a good still is far cheaper to make than a good clip. The catch is specific to hosted models rather than to this node: the API is not on your machine, so it cannot open your PNG.
The URL thing, first
image_url takes a public HTTPS URL and only that. Not C:/ComfyUI/input/hero.png, not a 127.0.0.1 address, not an http:// link, not a URL with credentials baked into it. The client checks all of that and rejects it before any request goes out, with the flat message "Reference media must use public HTTPS URLs."
So your still has to be reachable from the internet for the minute or two the job runs. Practically: upload the exported frame anywhere that serves it over HTTPS - a public image host, a bucket with public read, a CDN, a temporary file-sharing link that won't expire mid-job. Signed URLs are fine as long as the signature outlives the fetch. Some people run a small tunnel in front of ComfyUI's own output folder, which is a neat trick but its own project.
This pack ships no upload node, and that's the single biggest piece of friction here. Worth knowing: once a clip has come out of Happy Horse, its Ace CDN URL is already public and already on the allowlist, so chaining from a Happy Horse output into Video Edit needs no hosting at all. It's only the first input media you have to place somewhere.
What the node does with it
prompt describes the motion, not the picture - the picture is already decided. model offers happyhorse-1.1-i2v (default) and happyhorse-1.0-i2v. resolution is 720P or 1080P. duration runs 3–15 seconds, default 5. watermark off by default, seed defaulting to -1, which means "server picks" - any value below zero is simply not sent.
Notice what's missing from that list: there is no ratio input. That's deliberate. With a fixed first frame, the aspect ratio follows the image you fed in, so if you want a 9:16 clip, crop your still to 9:16 before you upload it. People read the absent widget as a bug and ask where the portrait option went. It's the design.
The outputs, and the two-graph habit
The node returns four strings - status, task_id, video_url, trace_id - and it is a paid submit, so video_url comes back empty and you're expected to take the task_id into Happy Horse Retrieve Task. Feed that node's video_url into Happy Horse Load Video, and Load Video's video output goes to Save Video.
Keep the submit half and the retrieve half in separate graphs. ComfyUI runs output nodes every time you press Queue, and this one bills your account when it does. Build a graph that submits, then queue it twice while you're fiddling, and you've bought the same clip twice. The pack's own examples are split exactly this way for that reason.
Install
Manager → Custom Nodes → search Happy Horse, publisher acedatacloud, package Happy Horse by Ace Data Cloud, install, restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/AceDataCloud/HappyHorseComfyUI.git
cd HappyHorseComfyUI && python -m pip install -r requirements.txt
All you're installing is requests. Then set the key in the environment of the ComfyUI process and restart it:
export ACEDATACLOUD_API_KEY='paste-your-key-here'
python main.py --cpu
No GPU, no checkpoint, no --lowvram gymnastics. ComfyUI 0.39.0+ is only needed for the native VIDEO type that Load Video uses at the far end of the chain.
Where it bites
I2V is the cheapest way to spend a lot of money, because a first frame that's slightly wrong is easy to rationalise and the retry costs the same as the first attempt. Fix the still before you submit, not after. Encode the motion in the prompt in plain terms - what moves, which way the camera drifts, how fast - because the model is animating your image, not reinterpreting it.
And the usual two: a missing key surfaces as a clear environment-variable error, not a silent no-op; and a task that comes back pending should be re-queried by ID, never resubmitted. Querying is read-only and doesn't cost anything. Submitting does.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image_url | STRING | — | |
| prompt | STRING | The scene gently comes to life. | — |
| model | COMBO | happyhorse-1.1-i2v | 2 options: happyhorse-1.1-i2v, happyhorse-1.0-i2v |
| resolution | COMBO | 720P | 2 options: 720P, 1080P |
| duration | INT | 53–15 | — |
| watermark | BOOLEAN | false | — |
| seed | INT | -1-1–2147483647 | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| status | STRING | — |
| task_id | STRING | — |
| video_url | STRING | — |
| trace_id | STRING | — |