Nodes/comfyui-jz/jz BytePlus Seedream (image)
ComfyUI Node

jz BytePlus Seedream (image)

Seedream on your own key, watermark actually off

By j-zhang19·Created 2 months ago·Updated 5 days ago· 3
jz BytePlus Seedream (image)
  • image
  • images
  • urls
  • usage
◄prompta photo of a cute dog►
◄modelseedream-4-0-250828►
◄size2k►
◄custom_width1024►
◄custom_height1024►
◄n1►
◄watermarkfalse►
◄seed-1►
◄custom_model►
◄api_key►
◄regionap-southeast►

Seedream is ByteDance's image line, and like the rest of it there are no weights to download - Seedream is closed, the API is the only door. ComfyUI's own Partner Nodes cover it, on prepaid credits behind a Comfy account. This node is the other way in: your own ModelArk key, direct to BytePlus, no credits in the middle.

The pack is a personal one (comfyui-jz, by j-zhang19) with no meaningful community footprint - searching the pack name across r/comfyui, r/StableDiffusion and r/civitai turns up nothing at all. That's not a warning, just calibration: you're reading the source and the README rather than a reputation. Seedream the model is a different story - 500-plus corpus threads - and the appetite is clearly for closed models inside a local graph, next to your own masking and upscaling.

How it works

It's the simplest API path in the pack: POST /images/generations, synchronous, back in about eight seconds. No task ids, no polling, no DELETE to forget about. You get PIL images converted to a ComfyUI batch.

The mechanism worth understanding is what happens when you wire an IMAGE in. Every frame in that input becomes a reference entry in the request - so one reference is an edit, several are multi-reference blending, and a batch is a batch of references rather than a fan-out of billed calls. The node takes a list as well as a tensor, which matters if your references are mixed sizes (a list is what jz Resize Long Edge emits; a tensor can't hold them). References go up at native size - Ark doesn't reject large refs the way some providers do.

Parameter support varies by model and is enforced server-side: seedream-4-0 rejects output_format outright, dola-seedream-5-0-pro rejects 4k. So the node only sends what you actually set - no defaults smuggled in to get rejected.

The inputs that matter

prompt, then model - default seedream-4-0-250828, populated from the live Ark catalogue filtered by task type and cached for 24h, with curated favourites pinned and custom + custom_model for anything not listed.

size is 1k / 2k / 4k (default 2k) or custom, in which case custom_width and custom_height take over. Those two are widgets with their own limits, but the API enforces the real constraint: total pixels must land between 921,600 and 16,777,216.

n (1–8) is how many images per call - and each one is billed separately, so it's a spend dial, not a batch dial. watermark defaults to off here, and it's sent explicitly every time because Ark's own default is on - this is the node quietly fixing one of the more annoying parts of the raw API. seed at -1 omits the parameter; it's left on fixed so a re-queue can't silently spend again.

api_key - leave it empty. Keys resolve server-side: api_key widget → BYTEPLUS_API_KEY env var → the pack's .env → [BYTEDANCE] ARK_API_KEY in config.ini. region must match where the key was issued.

Outputs are images (an IMAGE batch), urls (the returned URLs, newline-joined) and usage (a JSON string - useful for checking what you were actually charged; jz Display JSON renders it as a tree if you have this pack installed anyway).

Install

ComfyUI Manager → search comfyui-jz, or:

cd ComfyUI/custom_nodes
git clone https://github.com/j-zhang19/comfyui-jz

Restart, then add your key to ComfyUI/custom_nodes/comfyui-jz/.env:

BYTEPLUS_API_KEY=your-key-here

Dependencies are requests, pillow and numpy. No model files, no heavy wheels - the whole pack installs in seconds. .env and config.ini are both gitignored, and the README is explicit that keys should never end up in workflow JSON.

Where people get burned

The region-scoped 401. BytePlus keys are issued per region, and using an ap-southeast key against eu-west returns "the API key ... is missing or invalid" - which sounds like a key problem but is a region problem. Match the region widget to the key that was issued for it.

The 4K rejection on newer models. dola-seedream-5-0-pro doesn't take 4k. The error is the model saying so, not the node misbehaving - drop to 2k or go custom.

Cost creep. Billing is per output token - a 1k image is roughly 4,096 tokens - so n: 8 on a 4K size is not a small experiment. Check usage after your first run and set your expectations from the number rather than the model listing.

Categoryjz/api

Inputs (12)

NameTypeDefaultDescription
promptSTRINGa photo of a cute dog—
modelCOMBOseedream-4-0-2508285 options: seedream-4-0-250828, seedream-4-5-251128, seedream-5-0-260128, dola-seedream-5-0-pro-260628, custom
sizeCOMBO2k1k/2k/4k, or custom WxH. not every model takes 4k — dola-seedream-5-0-pro rejects it
custom_widthINT1024256–4096—
custom_heightINT1024256–4096—
nINT11–8each image is billed separately
watermarkBOOLEANfalsethe api default is ON, so this is sent explicitly
seedINT-1-1–2147483647-1 omits it. left on 'fixed' so a re-queue cannot silently spend
imageoptIMAGEreference images for editing — every frame becomes one ref
custom_modeloptSTRING—
api_keyoptSTRING—
regionoptCOMBOap-southeast2 options: ap-southeast, eu-west

Outputs (3)

NameTypeDescription
imagesIMAGE—
urlsSTRING—
usageSTRING—