SF WaveSpeed Wan 2.5 Image Edit
Wan 2.5 image editing, done by instruction — and it returns a real IMAGE
- client
- output_image
Here's the thing about Wan 2.5: it doesn't exist locally. Alibaba's 2.5 was a cloud-only preview - the last open Wan is 2.2, and everything after it is API. So when you see "Wan 2.5" in a ComfyUI graph, someone's doing a remote call, and that someone is WaveSpeed (it was the first platform to host Wan 2.5, per community chatter). This node is the editing end of that deal: you describe the change, give it one or two images, and get back an edited image.
The mechanic is instruction-style editing - "change the sky to sunset" or "make the car red" - no masks, no ControlNet, no inpainting scaffolding. The model preserves layout and subject structure while implementing the update. That's the whole pitch, and for quick alterations it's a lot less fiddly than building a local edit pipeline.
How it works
Same pack anatomy: an SF WaveSpeed Client wired into client. The node POSTs your prompt plus up to two image URLs to /api/v3/alibaba/wan-2.5/image-edit, polls until done, then - and this is the difference from the pack's video nodes - fetches the returned image URL and converts it to a real ComfyUI IMAGE tensor locally. So this one actually produces a tensor you can wire into a Save Image node, an upscaler, or anything downstream that expects an image. Most of the pack's other nodes hand you a URL string; this one hands you something ComfyUI-native.
The inputs that matter
- image_1 - the required input image URL. This is what gets edited.
- image_2 - optional second image, for multi-image editing jobs.
- prompt - the instruction. Say what to change, keep it specific.
- size - eleven presets from 1024x1024 up to HD (16:9/9:16/4:3 variants), plus Custom. Pick "Custom" and the
custom_width/custom_heightsliders take over (384–5000px, step 8). - seed, enable_sync_mode - standard; sync mode defaults to on here.
Output is output_image (an IMAGE tensor). No negative_prompt on this one - the info_schema doesn't have it, so don't go looking.
Installing it
ComfyUI Manager, search comfyui-stillfront, install. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/razvanmatei-sf/comfyui-stillfront.git
cd comfyui-stillfront
pip install -r requirements.txt
Grab a WaveSpeed key from wavespeed.ai and set it via config.ini (copy config.ini.tmp first), the WAVESPEED_API_KEY env var, or the SF WaveSpeed Client's api_key widget. The README's stillfront/... clone URL is stale - the repo is razvanmatei-sf/comfyui-stillfront.
Where people get burned
Two gotchas, and they're both pack-wide but hit this node hardest.
First, the image inputs are URL strings, not IMAGE tensors - a stock Load Image node won't connect; you need an upload-style node that produces URLs. Yes, it's a bit odd that the input side expects URLs while the output side gives you a tensor. That's just how the pack is built.
Second, this node (and the Wan 2.5 text-to-image node) pulls in a helper that imports PyAV (av) and the comfy_api package at load time - dependencies that aren't in the pack's requirements.txt. If the node doesn't show up and your ComfyUI console prints Failed to load wavespeed_wan25_image_edit, that's why; pip install av (and comfyui-api if needed) fixes it. The video nodes don't touch that code path, so they load fine without it.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| client | WAVESPEED_AI_API_CLIENT | — | |
| prompt | STRING | Positive prompt describing desired adjustments to the image | |
| image_1 | STRING | First input image URL (required - connect from Upload Image node) | |
| size | COMBO | 1024x1024 (1:1) | The output resolution and aspect ratio |
| seed | INT | -1-1–2147483647 | Random seed for reproducible results. -1 for random seed |
| enable_sync_mode | BOOLEAN | true | Wait for generation to complete before returning |
| image_2opt | STRING | Second input image URL (optional - for multi-image editing) | |
| custom_widthopt | INT | 1024384–5000 | Custom width (384-5000px, used when Custom is selected) |
| custom_heightopt | INT | 1024384–5000 | Custom height (384-5000px, used when Custom is selected) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| output_image | IMAGE | — |