Wan 2.7 Pro · Image Editing
The 2k canvas, for edits with several moving parts
- image_urls
- images
- task id
Same idea as the Wan 2.7 edit node - one to nine reference images, one instruction, uncensored - with two differences that justify the higher price: the output canvas is a 2k frame of about 4 megapixels, and the model is built to hold compound prompts. $0.075 per image, against $0.03 for the standard tier.
Compound is the word that matters. "Change the shirt to a hoodie, keep the face and the light, add a mug on the table, and warm the whole thing up" is four instructions in one sentence, and the smaller tier starts dropping one of them. If your edits are usually one clean change, pay the standard rate. If you're the person writing five-clause prompts and re-rolling until all five landed, this pays for itself.
What's in the schema
image_urls takes one to nine sources and grows its sockets as you connect them - order matters, since the instruction refers to them by position. prompt is the edit; write what changes and what must survive, because that second half is what keeps faces and products intact.
bounding_boxes is the precision tool: JSON rectangles in pixels from the top-left of the reference each one belongs to, up to two per image:
[{"image_index": 0, "x1": 200, "x2": 780, "y1": 140, "y2": 620}]
Reach for it when a specific area has to change and the rest has to be untouched.
color_palette pins the theme - 3 to 10 colours, each with an optional share of the frame in percent, splitting evenly if you omit the shares:
[{"hex": "#2b2d42", "ratio": 45}, {"hex": "#ef8354", "ratio": 25}, {"hex": "#f7f0e6", "ratio": 30}]
aspect_ratio defaults to model default, which follows the proportions of your last source image rather than imposing a shape. Leave it if the result has to fit an existing layout.
seed repeats a draw exactly - same seed and settings, same result. That's how you A/B a two-word change without wondering whether the dice moved.
Outputs: images, plus task id as a string for the console or a support ticket. There is no num_outputs here - one image per run - which is convenient, because at this rate a batch would add up quickly.
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. Or search "SpicyAPI" in ComfyUI Manager and let it handle the clone. The pack installs no dependencies and downloads no model files - it's a client that uploads your images, polls a job, and hands the result back as a normal IMAGE tensor, so it runs fine on a machine with no GPU at all.
Your key is kept in the ComfyUI user folder rather than in a node widget, which is deliberate: node settings get written into workflow files and image metadata, and a key that never becomes a node setting can't leak with them. On a server, set SPICY_API_KEY.
Cost habits and the failures worth knowing
The node shows a rate, not a total - $0.075/image - so the run you queue is that number times one. Set Max cost per run in the SpicyAPI settings and anything quoted above it stops before charging. Adding references raises the quote, so wire only the ones the edit actually needs.
Seeds start on fixed, so re-queueing the same graph reuses the first result instead of buying a second one. Flip control after generate to randomize when you want a different take, and remember each one is billed. Cancelling stops the wait, not the render: it finishes on the server, is charged if it succeeds, and sits in your console for up to 14 days.
Errors here are unusually actionable. 40004 means no deployment serves your combination of options and the message names the parameter to change. 40003 means an upload didn't match its ticket - run the node again to re-upload. 40310 means your account's email isn't verified yet. 50302 means the generation failed upstream and was refunded, so re-queue it without worry. If a message ends in request_id ..., that's the exact request: give support that string and nothing else.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Describe the image to produce from the source: subject, composition, style, and lighting. | |
| image_urls | COMFY_AUTOGROW_V3 | Source images that you are authorised to process. | |
| bounding_boxes | STRING | Rectangles marking the areas to edit, in pixels from the top-left corner of the reference image each one belongs to. Up to 2 per image. JSON. A list of objects with "image_index", "x1", "x2", "y1", "y2". | |
| aspect_ratio | COMBO | model default | Aspect ratio of the generated image. Omit it to follow the proportions of the last source image. |
| color_palette | STRING | Custom colour theme: 3 to 10 colours, each with an optional share of the image in percent. Leave the shares empty to split them evenly. JSON. A list of objects with "hex", "ratio"?. | |
| 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 |
|---|---|---|
| images | IMAGE | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |