Nodes/Comfyui-zhenzhen/Concurrent Submit | zhenzhen-flux-pro-vto-fal
ComfyUI Node

Concurrent Submit | zhenzhen-flux-pro-vto-fal

Virtual try-on without a model card — FLUX Pro VTO on fal, batched

By T8mars·Created about a year ago·Updated 2 days ago· 740
Concurrent Submit | zhenzhen-flux-pro-vto-fal
  • human_image
  • garment_image
  • task
prompt
human_image_url
garment_image_url
api_key
num_inference_steps4
output_formatjpeg
seed0
image_waybase64
poll_interval6
max_poll_attempts600
skip_errorfalse

Virtual try-on is one of those jobs that looks like it should be trivial and isn't - keeping the garment's details while the person's body stays them is a hard consistency problem. FLUX Pro's VTO endpoint does it, and it does it fast: this node's default is 4 inference steps, because the API's distilled model needs very few. The Comfyui-zhenzhen pack resells that fal-hosted endpoint, and the Concurrent Submit wrapper turns it into a batch operation - which is exactly what a product-grid shoot wants. Ten garments, one person, one queue.

The -fal in the name tells you the route: the pack's fal channel runs the job through fal's queue API (pre-charge on submit, refund/true-up when done - the README is explicit that fal jobs are "预扣" / pre-withheld). You get a task back and the collector handles the polling.

How the concurrent bit works

The plain Comfly_flux_pro_vto_fal node blocks until fal returns. The Submit variant runs it in the pack's shared image pool (30 workers) and returns a task immediately. Collect via Concurrent Collect Images (30): wire task_1 … and it waits for the batch, returning images in slot order plus a status string. failure_mode = fail-fast (default) or placeholder.

Because VTO calls are quick (4 steps), the parallel pool really shows here - a grid of 20 outfit shots lands in minutes.

The inputs that matter

  • prompt (required) - a little context text. The heavy lifting is done by the two images.
  • human_image - the person photo. garment_image - the clothing photo. Both required (or use the URL variants human_image_url / garment_image_url instead). VTO is a two-image operation; the node errors if you only supply one.
  • num_inference_steps - default 4. This is a distilled pipeline; you almost never need more.
  • output_format - jpeg (default) or png.
  • image_way - base64 (default) or image_url. base64 uploads your images inline; use image_url if you already host them.
  • seed - fal seeds cap at 65535; 0 = random.
  • poll_interval (6s) / max_poll_attempts (600, i.e. a 3600s ceiling) - the polling knobs for fal's async queue.

Output: one task (COMFLY_IMAGE_FUTURE) → Collector → try-on image.

Installing it

Ships in Comfyui-zhenzhen:

  • ComfyUI Manager → Install Custom Nodes → search "Comfyui-zhenzhen" → install → restart.
  • Or cd ComfyUI/custom_nodes && git clone https://github.com/T8mars/Comfyui-zhenzhen and restart.

No local models. You need a paid token from the author's storefront (ai.t8star.org), in api_key. This is the overseas fal channel, so no domestic-base dance - but see the proxy note below.

Gotchas

Two things the README is explicit about. First, fal is pre-charge: the job withholds credits on submit and settles up when it finishes, so don't panic at a bigger hold than the final price. Second, the "0 = random seed, max 65535" rule trips people up - you can't paste an arbitrary big seed from a local run. And since fal-hosted renders are per-job metered with image upload fees, a big grid of high-step runs is where your balance disappears - keep num_inference_steps low. The usual overseas-proxy note applies for mainland users.

Categoryzhenzhen/FAL/Concurrent Submit

Inputs (13)

NameTypeDefaultDescription
promptSTRING
human_imageoptIMAGE
garment_imageoptIMAGE
human_image_urloptSTRING
garment_image_urloptSTRING
api_keyoptSTRING
num_inference_stepsoptINT41–50
output_formatoptCOMBOjpeg2 options: jpeg, png
seedoptINT00–655350 = random seed. FAL seed max is 65535.
image_wayoptCOMBObase642 options: base64, image_url
poll_intervaloptINT61–60
max_poll_attemptsoptINT60010–3600Default 600*6s = 3600s timeout.
skip_erroroptBOOLEANfalse

Outputs (1)

NameTypeDescription
taskCOMFLY_IMAGE_FUTURE