Qwen - Image Edit
Change One Thing and Leave the Rest Alone
- image_url
- image
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
Why this node exists next to the other Qwen ones
Qwen-Image-Edit is the model that made masks optional for a huge class of image work - object removal, garment swaps, relighting, re-posing, camera angles. It's Apache 2.0, it has the LoRA library that Flux Kontext never allowed, and in mid-2026 the community answer to "how do I get the same character in a different scene" was literally "Qwen-edit with a consistency lora."
It also runs like a 20B model on your GPU, which is the part people gloss over. This node is the hosted version of that idea: your reference image goes to KIE, comes back edited, and your VRAM never hears about it. Same category of tool, none of the local cost.
How it works
It posts to KIE's unified task endpoint with the qwen/image-edit model and the parameters documented for that endpoint, then polls. Your image_url is uploaded first and the generated URL is substituted into the request, so you never see the URL plumbing - which is the pack's whole design goal.
One nice quirk: sync_mode. The tooltip says setting it true makes the call wait for the image to be generated and "uploaded before returning the response" - it costs latency but hands you the image directly in the response. For normal ComfyUI use you can leave it off and let the node's polling do the waiting.
The dials
- prompt (required, 2000 characters) - the edit instruction.
- image_url (required) - the reference, wired as a normal
IMAGEsocket. - image_size - a fixed set here, not free text:
landscape_4_3,square,square_hd,portrait_4_3,portrait_16_9,landscape_16_9. Ratio changes are the single most common cause of "the edit looked right but the composition shifted," because the model re-emits the whole frame at whatever size you asked for. - num_inference_steps - default 25 in the node; the docs describe 30 with a max of 49. This endpoint caps far lower than the plain image-to-image node does.
- guidance_scale - default 4. Higher sticks closer to the prompt.
- acceleration -
none,regular,high. Regular balances speed and quality; high is documented as recommended for images without text, so don't use it on your poster mockups. - negative_prompt, seed, output_format, enable_safety_checker (on by default here - note that's the opposite of the
nsfw_checkerfield on the Qwen3 nodes), num_images (1–4), timeout_seconds, callback_url.
Outputs: image (the first result), url, all_urls_json, task_id, raw_json, credits_consumed, credits_left. If you set num_images above 1, the extras live in all_urls_json, not on extra sockets.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
pip install -r ComfyUI-KIE-Nodes-Next/requirements.txt
Restart, then set the key once under Settings → KIE.ai Nodes Next → Connection. The pack checks the key with KIE before overwriting a working one, keeps it out of the workflow file, and shows the balance on the node after each run.
What will actually annoy you
Edit models re-emit the frame. That's the structural limitation of the whole approach, and it doesn't disappear because the inference is hosted: pixels nobody asked about move, and a chain of edits drifts. The community's fix is to crop to a mask, run the edit on the crop, and stitch back - which you can still do here, since this node is just a step that takes and returns images.
Also watch your input size on the way up: the endpoint documents a 10 MB per-file ceiling on the uploaded reference, so a 24-megapixel TIFF straight off a camera gets refused before anything generates. Downscale to something sane, and keep the aspect ratio you actually want out, since this endpoint's image_size list is coarse.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The prompt to generate the image with (Max length: 2000 characters) | |
| image_url | IMAGE | — | |
| accelerationopt | COMBO | none | Acceleration level for image generation. Options: 'none', 'regular'. Higher acceleration increases speed. 'regular' balances speed and quality. Default value: "none" |
| image_sizeopt | COMBO | landscape_4_3 | The size of the generated image. Default value: landscape_4_3 |
| num_inference_stepsopt | FLOAT | 25.002–49 | The number of inference steps to perform. Default value: 30 (Min: 2, Max: 49, Step: 1) (step: 1) |
| guidance_scaleopt | FLOAT | 4.000–20 | The CFG (Classifier Free Guidance) scale is a measure of how close you want the model to stick to your prompt when looking for a related image to show you. Default value: 4 (Min: 0, Max: 20, Step: 0.1) (step: 0.1) |
| sync_modeopt | BOOLEAN | false | If set to true, the function will wait for the image to be generated and uploaded before returning the response. This will increase the latency of the function but it allows you to get the image directly in the response without going through the CDN. (Boolean value (true/false)) |
| enable_safety_checkeropt | BOOLEAN | true | If set to true, the safety checker will be enabled. Default value: true (Boolean value (true/false)) |
| output_formatopt | COMBO | png | The format of the generated image. Default value: "png" |
| negative_promptopt | STRING | blurry, ugly | The negative prompt for the generation Default value: " " (Max length: 500 characters) |
| seedopt | INT | 0-2147483648–2147483647 | The same seed and the same prompt given to the same version of the model will output the same image every time. |
| num_imagesopt | COMBO | 1 | num_images |
| nsfw_checkeropt | BOOLEAN | false | Defaults to false. You can set it to false based on your needs. If set to false, our content filtering will be disabled, and all results will be returned directly by the model itself. Note: There is no guarantee that everything can be filtered out; if you are not satisfied with the results, you will need to make your own arrangements. |
| timeout_secondsopt | INT | 120030–7200 | — |
| callback_urlopt | STRING | Optional KIE callback URL. Leave empty for normal ComfyUI use. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| url | STRING | — |
| all_urls_json | STRING | — |
| task_id | STRING | — |
| raw_json | STRING | — |
| credits_consumed | FLOAT | — |
| credits_left | FLOAT | — |