Nodes/ComfyUI Seedance/并发提交|FLUX 3 Image 图像生成/编辑
ComfyUI Node

并发提交|FLUX 3 Image 图像生成/编辑

Submit 30 FLUX 3 Image jobs at once — and don't pay for the ones you didn't want

By T8mars·Created 4 months ago·Updated 3 days ago· 43
并发提交|FLUX 3 Image 图像生成/编辑
  • image1
  • image2
  • image3
  • image4
  • image5
  • image6
  • image7
  • image8
  • image9
  • image10
  • api_config
  • future
◄prompt►
◄resolution1k►
◄aspect_ratioauto►
◄groundingtrue►
◄safety_tolerance2►
◄skip_errorfalse►
◄seed0►

This node has exactly the inputs of Flux_3_Image - same prompt, same resolution, same ten reference slots - and one output instead of four. That output is future, typed SEEDANCE_IMAGE_FUTURE, and it's the difference between a workflow that waits and a workflow that fans out.

It exists for one reason. An API image job takes tens of seconds. Run five copies of a generator node and your canvas is fine, but you're queuing five sequential waits. Use these submit nodes and you hand the work to a thread pool, get an immediate receipt, and let 30 of them run concurrently.

How the mechanism works

The pack registers a wrapper class per submit node. When the node executes it does three things: it runs the original Flux_3_Image validator synchronously, before anything is enqueued, so a bad prompt or an unsupported ratio fails loudly and cheaply instead of becoming 30 bogus remote jobs; it submits the real work to a bounded ThreadPoolExecutor (image pool and video pool are separate); and it returns a handle immediately.

Each worker gets its own HTTP session, so uploads and polls don't tangle. Default image concurrency is 30 threads, and you can dial it down without changing the receiver's slot count:

export SEEDANCE_IMAGE_CONCURRENCY=8   # 1..30, restart ComfyUI after

Then a receiver node - 并发接收图片(30 路) - takes future_1…future_30, waits on completion notifications, and re-orders the results back into slot order. It also aggregates per-task upload/poll/download progress into one bar, which is the difference between a usable node and a 90-second stare at nothing.

Wiring it up

Add as many 并发提交|FLUX 3 Image 图像生成/编辑 nodes as you need, each with its own prompt (and its own api_config, unless you like errors). Connect each future to a future_N slot on the image receiver. The receiver is media-type generic, not model-specific, so a FLUX 3 future and a Nano Banana 2.1 future can sit in slots 1 and 2 and come out as image_1 and image_2.

The reference inputs are identical to the base node: image1–image10, one image per slot, and the same rule applies - a batch in that slot fails validation before submission.

What the receiver does with failures

failure_mode has two settings and both are defensible. raise (the default) aborts the whole receiver and names the slot that broke - correct when the 30 images are one deliverable. placeholder keeps the successful slots and puts a placeholder image in the failed ones while writing a redacted summary to status_json, which is what you want for a sweep where losing one prompt shouldn't cost you 29 results.

Per-branch skip_error still works underneath: a submit node with skip_error on whose task fails yields its own placeholder and doesn't take the pool down with it, even if the receiver is set to raise. If you interrupt the run in ComfyUI, the receiver stops polling and cancels tasks that haven't started.

One housekeeping note in the pack's history worth knowing: these wrappers deliberately do not inherit the base node's VALIDATE_INPUTS. In older ComfyUI builds that inheritance made one model error smear across every input, and you'd see dozens of fake "invalid input" badges across the whole graph. The synchronous preflight replaces it. If you're on an old version of the pack and see that behavior, update.

Install

Same pack, so same install as everything else here - Manager, search ComfyUI Seedance, restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/ComfyUI_Seedance.git
cd ..
python -m pip install -r custom_nodes/ComfyUI_Seedance/requirements.txt

requirements.txt is just requests>=2.28. The receiver node ships in the same pack, so you don't install a second thing. The pack's examples/ folder has a 2-slot minimal workflow and a full 30-slot one - 并发图片2路最小验证.json and 并发图片30路示例.json - and loading one of those is a much faster way to learn the wiring than building it from a blank canvas.

The bits that bite

Concurrency is not free. Thirty slots is thirty billed calls, and FLUX 3 Image at 4k on a closed frontier model is not a rounding error. Draft at 768sq or 1k across the fan-out, then re-run the two winners at full size.

Unconnected slots don't go away. The receiver always returns 30 images, and empty slots get placeholders - so don't count the outputs to figure out what you generated, read status_json.

And the usual API-pack realities: no api_config and no SEEDANCE_API_KEY means an auth error, every reference image leaves your machine, and the seed field on these nodes is a ComfyUI cache seed rather than a model parameter. Same as the base node - pinning it reproduces the cache, not the picture.

CategorySeedance/并发提交

Inputs (18)

NameTypeDefaultDescription
promptSTRING—
resolutionCOMBO1k5 options: 768sq, 1k, 1.5k, 2k, 4k
aspect_ratioCOMBOauto16 options: auto, 1:1, 16:9, 9:16, 4:3, 3:4, +10
groundingBOOLEANtrue—
safety_toleranceINT20–4—
image1optIMAGEReference image 1/10 | 参考图 1/10
image2optIMAGEReference image 2/10 | 参考图 2/10
image3optIMAGEReference image 3/10 | 参考图 3/10
image4optIMAGEReference image 4/10 | 参考图 4/10
image5optIMAGEReference image 5/10 | 参考图 5/10
image6optIMAGEReference image 6/10 | 参考图 6/10
image7optIMAGEReference image 7/10 | 参考图 7/10
image8optIMAGEReference image 8/10 | 参考图 8/10
image9optIMAGEReference image 9/10 | 参考图 9/10
image10optIMAGEReference image 10/10 | 参考图 10/10
api_configoptSEEDANCE_CONFIG—
skip_erroroptBOOLEANfalse—
seedoptINT00–18446744073709550000ComfyUI cache seed. Fixed reuses the cached result while all other inputs stay unchanged; randomize/increment/decrement starts a new execution. This value is not sent to models without documented seed support. | ComfyUI 缓存种子;Fixed 在其他输入不变时复用缓存,随机、递增或递减会触发新任务。未声明支持 seed 的模型不会收到此参数。

Outputs (1)

NameTypeDescription
futureSEEDANCE_IMAGE_FUTURE—