并发提交|VOSR2 4K 图片超分
Batch-upscale 30 images at once — the 并发提交 wrapper for VOSR2 4K
- input_image
- api_config
- future
The plain VOSR2_Image_Upscale node handles one image per run, and each run means waiting on a remote job. Fine for a single hero shot. Awful when you have twenty frames that all need to hit 4K. That's the gap SeedanceConcurrent_VOSR2_Image_Upscale_Submit ("并发提交|VOSR2 4K 图片超分") exists to fill: it's the same cloud upscale, but it fires the job and immediately returns a future handle instead of blocking, so a whole batch of them can run in parallel and land together.
How it works
Concurrency in this pack is a submit/collect split. This is the submit half. You give it the identical inputs the normal node takes - one input_image, optional api_config, skip_error, cache-only seed - and it hands back a single output called future (type SEEDANCE_IMAGE_FUTURE). Under the hood it runs the same validation as the original node up front (so a bad input fails fast, before anything is charged), then hands the job to a bounded thread pool that uploads, submits, polls and downloads each image independently.
The future isn't a picture yet. To get pictures, wire every submit node's future into the pack's collector, 并发接收图片(30 路) - that's SeedanceConcurrent_Image_Await in the "Seedance/并发接收" category. Connect each future to a future_1…future_30 slot. The collector waits for all of them, then outputs the images in slot order, one IMAGE per slot plus a status_json.
Inputs and what to actually connect
- input_image (required) - exactly one source image per submit node. One node per image; a batch of ten needs ten of these nodes.
- future (output) - wire this to a slot on the 30-way image collector.
Two behaviors matter once the batch is wired up. The collector's failure_mode defaults to raise, which cancels the remaining jobs and reports the failing slot if anything errors. Switch it to placeholder and failed slots come back as placeholder images while the successes survive. Each submit node also keeps its own skip_error, so a single dead image doesn't have to sink the whole batch.
One nice property: the collector is media-typed, not model-typed. Image futures from VOSR2, Seedream or the pack's other image generators can all be mixed into the same 30-slot collector - this wrapper exists purely to keep VOSR2's strict single-image contract intact inside a batch.
Installing
It's part of the ComfyUI_Seedance pack, so install the pack once:
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
Restart ComfyUI, or use Manager and search "ComfyUI Seedance". No model downloads - the only dependency is requests - and you'll need an API key from api.seedance.nz/console.
Things that bite
- Forgetting the collector. A submit node's
futureoutput does nothing on its own. No collector, no images. - Slot count. The collector caps at 30, and the thread pool caps at 30 by default. You can lower it with
SEEDANCE_IMAGE_CONCURRENCY(1–30) if you're hitting upload rate limits. - Cost. Thirty images is thirty billed jobs, and they all count even if a few fail. Keep
skip_errorsensible.
If you mostly upscale one image now and then, use the plain node and skip all this. The moment you're doing folders of frames, this is the version that pays for itself.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| input_image | IMAGE | Exactly one source image. The result is a 4K image. | 必须连接且只能提交一张源图片,结果为 4K 图片。 | |
| api_configopt | SEEDANCE_CONFIG | Connect Seedance API Config; otherwise SEEDANCE_API_KEY is used. | |
| skip_erroropt | BOOLEAN | false | On failure return a placeholder error image instead of stopping the workflow. | 失败时输出占位错误图片而不中断工作流。 |
| seedopt | INT | 00–18446744073709550000 | ComfyUI 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)
| Name | Type | Description |
|---|---|---|
| future | SEEDANCE_IMAGE_FUTURE | — |