FAL Happy Horse 1.1 Reference To Video (Soze)
Alibaba's oddly-named character-consistency video model
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- image_7
- image_8
- image_9
- image_batch
- video
- video_url
- status
Yes, the name is real, and no, it's not about horses. Happy Horse is Alibaba's line of video models, and 1.1's selling point is character consistency: it's built to keep the same people recognizably the same across a clip, which is the single most common thing video generation gets wrong. This node wraps the FAL-hosted version, so the model stays in the cloud and all you manage is a prompt, some reference images, and one API key.
The trick that makes it work
The other FAL reference nodes in this pack use @Image1 citations. Happy Horse uses names instead: character1 through character9, in the same order you connected the images. Connect a photo to image_1 and you call that person character1 in the prompt. That naming convention is what the model keys on for identity, so "character1 walks into the room and hugs character2" is the way to write it - plain descriptions of "the woman" won't pin identity the way the explicit character handles do. You get up to nine reference slots, or a batch into image_batch (capped at 9).
The prompt is capped at 2500 characters, which is roomier than most of these models give you. resolution goes 720p or 1080p, aspect_ratio has nine options (including ultrawide 21:9 and the vertical 9:21), and duration runs 3–14 seconds via a dropdown. There's also a seed (0 = random, so set a value if you want to iterate on a fixed take) and a enable_safety_checker toggle that defaults to on.
The safety checker is the thing that bites
That default-on safety filter is the main gotcha with this node. It's Alibaba's moderation running server-side, and when it triggers you get no video - just a refusal the node reports in status. If you're generating clean, normal content you'll never notice it. If you're pushing anything the filter dislikes, or the model flags a reference image as ambiguous, the fix is to flip enable_safety_checker off and try again, and to accept that some subject matter won't clear the vendor's policy no matter what. That's the nature of calling a closed cloud model - the filter lives in the weights and API you don't control.
How it works
Identical machinery to the other FAL nodes in the Soze pack: upload your reference images to FAL's CDN, POST to alibaba/happy-horse/v1.1/reference-to-video, wait out the synchronous generation, then download the mp4 into your output folder as a VIDEO object. Outputs are video, video_url, and status. Nothing runs locally except the file handling - your GPU is a bystander.
Install and key
From the Soze pack ("Quality of Life Nodes for ComfyUI"), either via ComfyUI Manager (search "Soze") or:
cd ComfyUI/custom_nodes
git clone https://github.com/SozeInc/ComfyUI_Soze.git
pip install -r ComfyUI_Soze/requirements.txt
Restart ComfyUI, then set FAL_KEY as an environment variable or in ComfyUI_Soze/config.ini:
[API]
FAL_KEY=your_key_here
Grab a key at fal.ai/dashboard/keys; the file is gitignored, keep it that way.
Common issues
- Video refused instantly. Safety checker tripped - turn it off and retry, or adjust the subject matter.
- Characters don't stay consistent. You're describing them instead of citing them. Use
character1,character2, etc., matching the socket order. - Skips with no output. Needs at least one reference image connected; there's no text-only mode.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Refer to subjects as character1..character9 (order matches images). Max 2500 chars. | |
| aspect_ratio | COMBO | 16:9 | 9 options: 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, +3 |
| resolution | COMBO | 1080p | 2 options: 720p, 1080p |
| duration | COMBO | 5 | 13 options: 3, 4, 5, 6, 7, 8, +7 |
| enable_safety_checker | BOOLEAN | true | — |
| seedopt | INT | 00–2147483647 | 0 = random. |
| image_1opt | IMAGE | Reference image 1 (cite as @character1 in the prompt). | |
| image_2opt | IMAGE | Reference image 2 (cite as @character2 in the prompt). | |
| image_3opt | IMAGE | Reference image 3 (cite as @character3 in the prompt). | |
| image_4opt | IMAGE | Reference image 4 (cite as @character4 in the prompt). | |
| image_5opt | IMAGE | Reference image 5 (cite as @character5 in the prompt). | |
| image_6opt | IMAGE | Reference image 6 (cite as @character6 in the prompt). | |
| image_7opt | IMAGE | Reference image 7 (cite as @character7 in the prompt). | |
| image_8opt | IMAGE | Reference image 8 (cite as @character8 in the prompt). | |
| image_9opt | IMAGE | Reference image 9 (cite as @character9 in the prompt). | |
| image_batchopt | IMAGE | Optional IMAGE batch (capped at 9). Ignored if any image_N slot is connected. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_url | STRING | — |
| status | STRING | — |