Seedream5.0 Flash - Image to Image
Keep the pose, change the material
- image_urls
- image
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
The default prompt this node ships with tells you everything about what it's for:
"Keep the model's pose and the flowing shape of the liquid dress unchanged. Change the clothing material from silver metal to completely transparent clear water..."
That's the use case. You have a reference image with a composition you like, and you want to alter one property of it - material, colour, styling, environment - while everything else survives. This is the edit side of ByteDance's Seedream line, called through KIE.ai's API from inside your ComfyUI graph, with no local model and no VRAM cost.
It's a reference-image edit, not a mask editor
Worth being clear about, because people arrive expecting ControlNet behaviour. You feed an image, you describe the change in prose, and the model decides what to preserve. There's no mask input, no strength slider, no denoise value. Your leverage is entirely in how precisely you write the sentence - name what must not change before you name what must.
That's also why the aspect ratio widget still exists on an image-to-image node: output framing is chosen here, not inherited from the input. Set it deliberately rather than leaving it at 1:1 out of habit.
Inputs and outputs
Required:
- prompt - 3 to 5,000 characters, per the tooltip.
- image_urls - an
IMAGEsocket, plural on purpose. The pack's native-media layer uploads what you connect and passes the resulting KIE URLs. A single image is the normal case; a batch becomes multiple reference URLs, so index out a single frame first if you only mean one. - aspect_ratio - the same eight presets as the text-to-image node: 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9.
- quality -
basic= 1K,high= 2K. This is the main cost dial on a paid API; iterate at basic.
Optional: output_format (png/jpeg), timeout_seconds (default 1200), callback_url (leave empty), nsfw_checker. The checker's tooltip is worded confusingly - take the widget name at face value: enable it to apply KIE's content filter. The tooltip's own admission is that it can't guarantee what gets through.
Outputs: image (the result as a ComfyUI IMAGE), url, all_urls_json, task_id, raw_json, credits_consumed, credits_left. Keep the task_id - KIE • Reuse Completed Image will pull a finished result back by ID without submitting a new job, which is how you avoid paying twice for the same edit.
How it runs
The node assembles the request from the model's documented schema, uploads any connected media to KIE's file host, submits the task with the resolved model ID, then polls until it finishes. On success it downloads the first result URL and decodes it into a ComfyUI image tensor. If the provider doesn't report task-level spend, the pack labels the credits figure an estimate from a before/after balance difference rather than pretending it's exact.
Installing the pack
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
cd ComfyUI-KIE-Nodes-Next
pip install -r requirements.txt
Restart. Deps are requests, Pillow, numpy and PyYAML - nothing exotic, no model downloads.
Then save your KIE API key under Settings → KIE.ai Nodes Next → Connection. It's validated against KIE before it replaces an existing working key, stored in ComfyUI's user config area, kept out of workflow JSON, and shown to you only as a masked fingerprint. Environment-variable keys are not supported by design.
Note the install-integrity check: if you copy a new __init__.py over an old nodes/ folder, ComfyUI refuses to load the pack and tells you to delete the whole directory and reinstall. That's intentional - it stops you running version-mismatched code that spends real credits.
Gotchas
Missing from the node menu. Catalog-driven nodes are built from KIE's live docs. Restart and let the first-run sync complete; if it's still missing, drop in the KIE Next · Catalog Sync node and run it. Search the display name - the acce852a suffix in the class name is a stable hash, not something to type.
"expects one image; received a batch of 4." You connected a batch to a field that takes a single image. This fires during the local pre-check, before anything is uploaded - which is the point of the pre-check.
The model changed things you told it not to. Reference-image adherence is provider behaviour, not node behaviour, and there's no local knob for it. Tighten the prompt, or try the same image through a model whose edit path you trust better.
Check before you submit. Right-click the node and choose KIE Next · Check inputs & model controls to inspect the documented fields and limits without uploading media or spending anything.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Keep the model's pose and the flowing shape of the liquid dress unchanged. Change the clothing material from silver metal to completely transparent clear water (or glass). Through the liquid water, the model's skin details are visible. Lighting changes from reflection to refraction. | A text description of the image you want to generate (Max length: 3-5000 characters) |
| image_urls | IMAGE | — | |
| aspect_ratio | COMBO | 1:1 | Width-height ratio of the image, determining its visual form. |
| quality | COMBO | basic | Basic outputs 1K images, while High outputs 2K images. |
| output_formatopt | COMBO | png | Format of the output image |
| 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 | — |