WAN22 Generate Video
Wan 2.2 Image-to-Video, Powered by Someone Else's GPU
- input_image
- frames
- metadata
What it is
Same RunPod-client pattern as ComfyBros Text to Video, but this one is image-to-video, and it's Wan 2.2 under the hood. Feed it a still, get back a clip. The giveaway is the parameter list: high/low CFG schedule, shift, context windows, fuse_method, closed_loop - that's WanVideoWrapper's sampling config surfaced through a remote call, so what's actually running on the other side of that endpoint is effectively a Wan 2.2 workflow.
Wan 2.2 is worth knowing about because it's the frozen open base the community still treats as the reference for quality local video - Alibaba's last open numbered release, Apache 2.0, and the thing ByteDance and Z.ai later built their own models on. Image-to-video from a strong still is the default way people use it. This node just moves that default onto rented hardware.
How it works
Your input image is base64-encoded, bundled with a couple dozen parameters, and POSTed to {endpoint}/run. The node then polls {endpoint}/status/{job_id} every four seconds, up to a 15-minute hard cap, and when the job completes it downloads a ZIP of frames from your Cloudflare R2 bucket, sorts them, and reassembles them into an IMAGE batch. Nothing is computed on your machine - this is a client, not a generator.
The parameters that actually matter
instance_name,input_image,positive_prompt- the essentials. Theinstance_namedropdown defaults to "No instances configured" until you set one up.length- 240 frames by default, which is 10 seconds at 24fps; up to 800.total_steps- defaults to 4, not 20–50. That's the distilled speed-LoRA regime:high_cfg2.0 for the first two steps,low_cfg1.0 for the last two. If your server workflow isn't running the distilled model, four steps will come out mushy - and if it is, raising steps just adds cost and queue time without much gain.shift/shift_model- the standard WanVideoWrapper shift value. Leave the model toggle off unless your server workflow expects it.context_length(default 81 - Wan's native context),context_overlap,context_schedule,context_stride,closed_loop,fuse_method- how long clips get generated in chunks and stitched back together. This is also where quality falls apart: identity drift across chunk boundaries is the classic Wan long-video failure, so don't expect 800 frames to hold a face.upscale(bool) - whether the server runs an upscale pass on the frames. Off by default for good reason: it roughly multiplies render time.- Outputs:
frames(IMAGE batch) - wire into any video preview/save node;metadata(STRING) - JSON with frame_count, execution and delay time, status, and R2 info.
Setup and install
Identical to Text to Video. Edit ComfyUI/user/default/comfy.settings.json with serverlessConfig.instances (name, endpoint, auth_token) and serverlessConfig.offloadBucket (Cloudflare R2 account id, bucket name, access key id, secret key) - the frames come back from R2, so the bucket is mandatory, not a nice-to-have.
Install via ComfyUI Manager (search "ComfyBros"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/turnbros/ComfyBros
Restart, then pip install boto3 - the README's pip install -r requirements.txt is a phantom (no requirements.txt exists), and boto3, which the module imports at the top, isn't in the declared dependency list. Without it the node won't load.
The honest verdict
If you already run Wan 2.2 locally with WanVideoWrapper, this is strictly more expensive and slower than your own GPU - you'd only reach for it to keep your local VRAM free for something else. If you have no local GPU but do have a RunPod budget, it's a legitimate way to drive Wan 2.2 from the ComfyUI graph you already know. Either way, run at the defaults first and read the metadata output - it's the only place you'll see what the server actually did, how long it sat in the queue, and whether the frames came back at the size you asked for.
Inputs (29)
| Name | Type | Default | Description |
|---|---|---|---|
| instance_name | COMBO | No instances configured | 1 options: No instances configured |
| input_image | IMAGE | — | |
| positive_prompt | STRING | A cinematic video of a sunset over a mountain range | — |
| negative_prompt | STRING | blurry, low quality, distorted | — |
| width | INT | 512128–2048 | — |
| height | INT | 512128–2048 | — |
| length | INT | 2408–800 | — |
| high_cfg | FLOAT | 2.00.1–30 | — |
| high_start_step | INT | 00–100 | — |
| high_end_step | INT | 20–100 | — |
| low_cfg | FLOAT | 1.00.1–30 | — |
| low_start_step | INT | 20–100 | — |
| low_end_step | INT | 40–100 | — |
| total_steps | INT | 41–150 | — |
| seed | INT | -1-1–2147483647 | — |
| sampler_name | COMBO | euler | 22 options: euler, euler_ancestral, heun, heunpp2, dpm_2, dpm_2_ancestral, +16 |
| scheduler | COMBO | simple | 7 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +1 |
| shift_model | BOOLEAN | false | — |
| shift | INT | 5-100–100 | — |
| batch_size | INT | 11–16 | — |
| upscale | BOOLEAN | false | — |
| adjust_context | BOOLEAN | false | — |
| context_length | INT | 811–1000 | — |
| context_overlap | INT | 80–100 | — |
| context_schedule | COMBO | standard_uniform | 4 options: looped_uniform, standard_uniform, standard_static, batched |
| context_stride | INT | 11–10 | — |
| closed_loop | BOOLEAN | false | — |
| fuse_method | COMBO | pyramid | 4 options: flat, pyramid, relative, overlap-linear |
| dim | INT | 00–3 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | — |
| metadata | STRING | — |