HappyHorse 1.1 · Image to Video
One frame in, fifteen seconds of video with sound out
- image_url
- video
- task id
You have a still. You want it to move, and you want the result to have sound in it - not a separate foley pass you have to babysit, but audio generated alongside the pixels. That's the job this node does: you hand it one image as the opening frame and a prompt describing what happens next, and Alibaba's HappyHorse 1.1 returns a clip between 3 and 15 whole seconds at 720p or 1080p.
It's an API node, so nothing runs on your card. That matters more than usual here, because the local video landscape is stuck in a weird place: Wan 2.1 and 2.2 are the last open Wan weights that exist, and everything Alibaba shipped after them went API-only. This node is the other side of that turn - you get the newer video model, and you pay per second instead of per kilowatt-hour.
How it works, mechanically
The pack builds its nodes from each hosted model's own published input schema, so this node wears exactly the options HappyHorse 1.1 accepts and nothing else. When you press Run, the pack uploads your image, asks SpicyAPI for a quote for that exact combination of settings, and only then creates the job. It polls the task, downloads the finished video, and hands it to you as an ordinary ComfyUI VIDEO value - the same type a local video sampler produces, so Save Video doesn't care where it came from.
The inputs that matter
image_url- anIMAGEsocket, not a filename. WireLoad Imageinto it. This is the first frame, which means the image sets the shape of the output: there's no aspect-ratio dropdown on this node, so don't go looking for one. Whatever you feed in is what you get back, scaled to the resolution you pick.prompt- a multiline string. This is the whole directorial control you have. Write motion, not description: the still already answered "what does it look like". Camera movement, what moves, the order things happen in, and roughly when.duration_seconds- an integer from 3 to 15. Every extra second costs proportionally more, so prototype at 3.resolution- 720p or 1080p, defaulting to 720p.seed- same seed and settings, same result. It starts oncontrol after generate: fixedon purpose, because queueing the same graph twice reuses the first result rather than quietly charging you for a second one. Switch it torandomizewhen you actually want a different take.
Outputs
Two sockets: video, which goes straight into Save Video, and task id, the SpicyAPI job identifier. The task id looks like plumbing and mostly is, but keep it: it's what support asks for if a run fails, and it's how you find the job in your console logs after you've closed ComfyUI in frustration.
Install and key
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart ComfyUI. There is genuinely nothing else to install - the pack declares no dependencies of its own beyond what ComfyUI already ships. Drop a key from spicyapi.ai/console/keys into Settings > SpicyAPI and restart once more so the node list comes from your account. On a headless box, set SPICY_API_KEY in the environment instead. The key is never a node widget, so sharing a workflow or a PNG doesn't leak it.
The traps
This is billed per second of output. At the advertised rate of about $0.14/s, a 15-second clip is a couple of dollars, and iterating at 15 seconds because you didn't feel like waiting is how a balance disappears in an afternoon. Settle the prompt at 3 seconds and 720p, then re-run long.
Set "Max cost per run" in the SpicyAPI settings. The node quotes every run before submitting, and a quote above your ceiling aborts with nothing charged. It's the cheapest insurance in ComfyUI.
Cancelling stops the wait, not the job. Hit the interrupt button and the node stops polling - but the task keeps running on SpicyAPI and is charged if it succeeds. The result sits in your console for up to 14 days.
A missing key is the usual error. No SpicyAPI key is set means exactly that. If you get an error code instead, 40004 means no deployment serves the combination you picked (change the parameter named in the message), 40310 means the account's email is still unverified, and anything else is worth sending to support with the task id.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Describe the scene, action, camera movement, and timing. | |
| image_url | IMAGE | Image used as the first video frame. | |
| resolution | COMBO | 720p | Output video resolution. |
| duration_seconds | INT | 53–15 | Output duration in seconds. Any integer from 3 to 15 is accepted; longer clips cost proportionally more. |
| seed | INT | 00–2147483647 | Same seed and settings, same result. Set 'control after generate' to randomize to get a new result on every run; every run is billed. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |