Wan 2.2 LoRA · Text To Video
Attach your own weights to the one Wan you can still download
- loras
- high_noise_loras
- low_noise_loras
- video
- task id
Wan 2.2 is the last Wan with weights you can download - Alibaba took 2.5, 2.6 and 2.7 behind an API and never came back. So there are two ways to run it: the 14B MoE you already have in models/, or a hosted endpoint like this one, where you don't own the GPU but you do get to hang your LoRAs on it. This node is the second path, on the 2.2 A14B base, with no filter on the prompt, the weights or the result.
What it actually is
A node that sends a job to SpicyAPI and hands back a clip. Nothing runs locally: no checkpoint to load, no VRAM to free, and it works on a laptop that has never rendered a frame. The node's options are generated from the model's own published schema, so what you see in the widgets is what the endpoint accepts - nothing invented on the ComfyUI side.
Unless you have a specific reason to pay per second, note the trade. The open 2.2 weights are free forever after the download, and the community has built a whole fine-tune layer on top of them. Paying here buys you their fast hardware and your own LoRAs on top of it, at $0.048/second.
The inputs that matter
prompt describes the scene, action and camera move. negative_prompt is here, which the local base doesn't give you directly - use it, because "static, blurry, text" does more work than people expect. duration_seconds is 5 or 8, resolution is 480p or 720p, aspect_ratio is 16:9 or 9:16. seed repeats a draw exactly.
Then the interesting part, three LoRA slots:
loras- applied to the whole generation, up to three files.high_noise_loras- the high-noise expert only.low_noise_loras- the low-noise expert only.
That split exists because 2.2 is the first open video model to use a two-expert MoE: a high-noise pass that sets composition and motion, a low-noise pass that refines detail. It's why the community's habit of applying speed LoRAs to the low-noise pass only exists - 0.4 to 0.6 strength there, keep the high-noise pass clean. Same logic here. Put a distilled speed LoRA in low_noise_loras; put a style or character LoRA in loras.
Weights come from a separate SpicyAPI LoRA node in the same pack: a direct .safetensors URL and a strength from 0 to 4. Chain several by wiring their loras output into the next one's loras input, then the last one into this node. The link has to open without a login - a gated Hugging Face URL will fail, so use the resolve/main form.
Outputs and wiring
video is an ordinary ComfyUI VIDEO - wire it into Save Video, or into the video_url input of the video-extend node if you want a longer shot. task id is a plain string for finding the job in your SpicyAPI console when something needs reporting, or for support.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart ComfyUI, then paste a key from spicyapi.ai/console/keys into Settings > SpicyAPI. It installs nothing - the HTTP client is aiohttp, which ComfyUI already ships - and the key lives in the ComfyUI user folder, not in the workflow or in saved PNG metadata. On a headless box, set SPICY_API_KEY instead.
There's a lora template under the comfyui-spicyapi section of the template browser with a working Apache-2.0 pixel-art LoRA, if you want to see the wiring before you hunt for weights of your own.
Where people get burned
Seeds start on fixed, so queueing the same graph twice is one charge and one clip. Flip control after generate to randomize only when you want a new draw, because every run is billed. Then set Max cost per run in the SpicyAPI settings - a 5-second 720p clip is already about a quarter, and an accidental randomize loop is how that becomes five dollars. And remember that cancelling in ComfyUI stops the wait, not the job: the render finishes server-side, is charged if it succeeds, and sits in your console for 14 days.
The error strings are decent, which is rare. No SpicyAPI key is set means exactly that. A 40004 is "no deployment serves this combination" - change the option named in the message. Anything ending in request_id ... is worth copying out verbatim before you file it. 50302 means the generation failed upstream and was refunded, so just run it again.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Describe the scene, the action and the camera move. | |
| negative_prompt | STRING | What must stay out of the clip. | |
| aspect_ratio | COMBO | 16:9 | Output aspect ratio. |
| resolution | COMBO | 480p | Output video resolution. |
| duration_seconds | COMBO | 5 | Output video duration in seconds. |
| 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. |
| lorasopt | SPICY_LORAS | LoRA weights applied to both noise experts. | |
| high_noise_lorasopt | SPICY_LORAS | LoRA weights applied to the high-noise expert. | |
| low_noise_lorasopt | SPICY_LORAS | LoRA weights applied to the low-noise expert. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |