Nodes/ComfyUI-SayMaker/SayMaker Edit Image
ComfyUI Node

SayMaker Edit Image

Tell it what changed, then tell it what must not

By hanshs474·Created 14 days ago·Updated 14 days ago· 0
SayMaker Edit Image
  • image
  • image
  • url
◄instructionput the product on a white marble surface; keep the label unchanged►
◄modelnano-banana-2-lite►
◄api_key►
◄seed0►

The node that replaced a whole pile of adapters

Somewhere between late 2025 and mid-2026 the answer to "same subject, new scene" stopped being IP-Adapter plus a ControlNet and became a sentence: here's the picture, now move it. Instruction editing ate that job. Qwen-Image-Edit became the local default, Flux Kontext started the category, and the closed models - Nano Banana 2, GPT Image 2.5, Seedream 5 - do it at a quality you can't download.

SayMaker Edit Image is the closed-model door to that, in one node. You hand it an IMAGE and an instruction; it hands back the edited IMAGE and a URL, ready to chain into an upscaler or straight into Image to Video in the same pack. No LoRA, no mask, no checkpoint, no VRAM.

It's not a local sampler wearing a costume - it's a wrapper around saymaker.ai's API, and the pack is the vendor's own client: the pyproject.toml publisher is saymaker, the repo is one commit old, and the code is short enough to read before you paste a key into it.

How it works, and where your picture goes

The mechanism is worth knowing, because it tells you what the node can't do.

Your incoming tensor is converted to PNG, uploaded to saymaker.ai's storage, and comes back as a public URL. That URL plus your instruction goes out as an image-to-image request, the node polls every five seconds until the result appears, then downloads it and rebuilds a float32 RGB tensor. So the source image leaves your machine and lands in public object storage on the way through. That's how every instruction-editing API works, not a bug to route around - but it's the thing to remember before you point it at material you wouldn't upload.

Edits go out with size: "auto", which is the service's way of saying keep the source framing. Your composition survives; you're not going to get a surprise re-crop.

Inputs that matter

image takes any IMAGE - a local generation, a photo through Load Image, an upscale, whatever.

instruction is the whole game, and the README gives the shape of a good one: name the change and what must stay. The default field says put the product on a white marble surface; keep the label unchanged. That second clause isn't politeness. Edit models re-emit the entire frame rather than patching pixels, so everything you didn't mention is up for grabs. Naming what must survive is drift control.

model defaults to nano-banana-2-lite, which is the right default for edits - it's fast and cheap and the README's own pick. Swap in nano-banana-2, gpt-image-2-5-flare or seedream-5-pro when the lite model starts mangling something specific. It's free text, so spelling counts.

api_key is optional; leave it blank and the client reads SAYMAKER_API_KEY from the environment instead - set it before launching ComfyUI or it won't be seen.

seed is not what you think. It's accepted and never forwarded to the API; its only job is to make ComfyUI's cache see a changed input. The tooltip says as much - "change to force a new run." Use it to reroll. Don't expect it to reproduce.

Outputs

image is the edited tensor - Save Image, Preview, an upscaler, or straight into SayMaker Image to Video. url is the same file's hosted address as a string, which is handy for logging and matches what shows up in your history on the site.

Install

Manager: search ComfyUI-SayMaker, install, restart. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/hanshs474/ComfyUI-SayMaker

Zero dependencies - the client is standard library, and the nodes use the torch/Pillow already in ComfyUI. No model files to fetch. Create a key at saymaker.ai/settings/apikeys.

Where people get burned

Vague instructions get vague edits. "Make it better" is a coin flip. "Replace the background with brushed concrete; keep the product, its shadows and the label text identical" is a request. The models are literal.

Chains of edits compound. Every pass re-emits the frame, so proportions drift and small errors stack - the same complaint that followed Qwen-Image-Edit through 2026. Two edits is usually fine, five is where faces start sliding. If a pixel absolutely cannot move, edit a crop and composite it back locally instead of asking the model to be careful.

upload failed in the console. That's the PNG upload step, which happens before any generation. A proxy, VPN or egress firewall that blocks the storage endpoint fails right there and never touches the model.

Don't count on a big source coming back big. The client asks for 1K output on edits, so a 4K product shot returns smaller than it went in - plan the upscale as a separate step.

Free accounts run one job at a time - a second concurrent request raises a busy error instead of waiting its turn.

CategorySayMaker

Inputs (5)

NameTypeDefaultDescription
imageIMAGE—
instructionSTRINGput the product on a white marble surface; keep the label unchanged—
modelSTRINGnano-banana-2-litee.g. nano-banana-2, gpt-image-2-5-flare, seedream-5-pro
api_keyoptSTRINGKey from saymaker.ai/settings/apikeys (new accounts get sign-up credits). Leave empty to read SAYMAKER_API_KEY from the environment.
seedoptINT00–4294967295Change to force a new run

Outputs (2)

NameTypeDescription
imageIMAGE—
urlSTRING—