Concurrent Submit | zhenzhen-topaz-upscale-fal
Topaz upscaling on the cloud, 30 jobs deep
- image
- video
- task
Topaz is the commercial upscaler that predates the AI-image boom - the one video editors and photographers reach for when a local model isn't good enough or fast enough. This node puts Topaz's image and video upscalers behind fal's hosted API, and then the concurrent wrapper does something the local stack struggles with: it runs up to thirty of these jobs at once. That's the important number. Local upscaling is sequential - one image, one GPU, one at a time. This queues thirty and drains them in parallel, which for a big batch of hi-res output is a genuinely different workflow.
Inputs that matter
- mode -
imageorvideo. Everything else in the input list is conditional on this. - image_model - ten choices:
Standard V2,Low Resolution V2,CGI,High Fidelity V2,Text Refine,Recovery,Redefine,Recovery V2,Standard MAX,Wonder.Standard V2is the everyday pick;Recovery/Recovery V2are for restoring old or compressed footage;Redefinetakes a prompt and gets creative. - video_model - nineteen options headed by
Proteus(the general video workhorse) with Artemis and Nyx tiers and the Gaia/Starlight families. - upscale_factor - 1 to 8 in 0.5 steps, default 2. This is the lever most people touch.
- face_enhancement - on by default, with
face_enhancement_creativityandface_enhancement_strength(both default to -1 = leave unset). For portraits, this is what keeps faces from turning to mush at 4x. - output_format - jpeg or png.
- target_fps - 0 (unset) by default; setting it enables frame interpolation on video.
- image / video or image_url / video_url - your source. A connected tensor wins over a URL.
- api_key, image_way, video_way, poll_interval, max_poll_attempts, skip_error - the standard fal-node furniture.
The model-specific knobs (strength/creativity/texture/prompt for Redefine, detail for Recovery V2, sharpen, denoise, grain, halo, and friends) are all -1-or-unset by default, so you can ignore them until you hit a specific failure mode. The tooltips tell you which model each belongs to.
How it works - and the one difference from the video nodes
This is an image-pool node. The task it outputs is a COMFLY_IMAGE_FUTURE, and you collect it in Concurrent Collect Images (ComflyConcurrent_Image_Await), which has thirty sockets - one per image worker. Not the ten-slot video collector; wire an image task into the video node and it'll refuse. Under the hood the wrapper in ComflyConcurrent.py validates and pushes the real fal job onto the image executor (default 30 workers, COMFLY_IMAGE_CONCURRENCY if you want to change it). The fal route pre-deducts credits at submit and settles after.
Setup
One-time install for the pack: ComfyUI Manager (search "Comfyui-zhenzhen"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/Comfyui-zhenzhen
No weights to download - this is pure cloud. You need a Zhenzhen key from ai.t8star.org (overseas) or api.seedance.nz (domestic), and Topaz via fal bills per job with pre-deduction, so a 30-deep batch moves a chunk of credits before a single image returns.
Gotchas
The single biggest mistake: queueing thirty 4x jobs "to be safe" and discovering the credit math after. Do one job first, check the actual cost in your account's task log, then batch. For images that are already noisy or JPEG-artifacted, Recovery (or Low Resolution V2 for very small sources) usually beats Standard V2. And because these jobs leave your machine entirely, anything you upscale is on fal's servers - keep that in mind before you batch-send a stack of images you'd rather not have leave the building.
Inputs (36)
| Name | Type | Default | Description |
|---|---|---|---|
| mode | COMBO | image | 2 options: image, video |
| imageopt | IMAGE | — | |
| videoopt | VIDEO | — | |
| image_urlopt | STRING | — | |
| video_urlopt | STRING | — | |
| api_keyopt | STRING | — | |
| image_modelopt | COMBO | Standard V2 | 10 options: Low Resolution V2, Standard V2, CGI, High Fidelity V2, Text Refine, Recovery, +4 |
| video_modelopt | COMBO | Proteus | 19 options: Proteus, Artemis HQ, Artemis MQ, Artemis LQ, Nyx, Nyx Fast, +13 |
| upscale_factoropt | FLOAT | 2.01–8 | — |
| output_formatopt | COMBO | jpeg | 2 options: jpeg, png |
| subject_detectionopt | COMBO | All | 3 options: All, Foreground, Background |
| crop_to_fillopt | BOOLEAN | false | — |
| face_enhancementopt | BOOLEAN | true | — |
| face_enhancement_creativityopt | FLOAT | -1.00-1–1 | -1 leaves API default/unset. |
| face_enhancement_strengthopt | FLOAT | 0.80-1–1 | -1 leaves API default/unset. |
| sharpenopt | FLOAT | -1.00-1–1 | -1 leaves API default/unset. |
| denoiseopt | FLOAT | -1.00-1–1 | -1 leaves API default/unset. |
| fix_compressionopt | FLOAT | -1.00-1–1 | -1 leaves API default/unset. |
| strengthopt | FLOAT | -1.00-1–1 | Text Refine only; -1 leaves unset. |
| creativityopt | INT | 00–6 | Redefine only; 0 leaves unset. |
| textureopt | INT | 00–5 | Redefine only; 0 leaves unset. |
| promptopt | STRING | Redefine prompt. | |
| autopromptopt | BOOLEAN | false | — |
| detailopt | FLOAT | -1.00-1–1 | Recovery V2 only; -1 leaves unset. |
| target_fpsopt | INT | 00–120 | 0 leaves unset. Setting FPS enables frame interpolation. |
| compressionopt | FLOAT | -1.00-1–1 | -1 leaves API default/unset. |
| noiseopt | FLOAT | -1.00-1–1 | -1 leaves API default/unset. |
| haloopt | FLOAT | -1.00-1–1 | -1 leaves API default/unset. |
| grainopt | FLOAT | -1.00-1–0.1 | -1 leaves API default/unset. |
| recover_detailopt | FLOAT | -1.00-1–1 | -1 leaves API default/unset. |
| h264_outputopt | BOOLEAN | false | — |
| image_wayopt | COMBO | base64 | 2 options: base64, image_url |
| video_wayopt | COMBO | upload | 2 options: upload, video_url |
| poll_intervalopt | INT | 61–60 | — |
| max_poll_attemptsopt | INT | 60010–3600 | Default 600*6s = 3600s timeout. |
| skip_erroropt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| task | COMFLY_IMAGE_FUTURE | — |