Concurrent Submit | zhenzhen-flux-pro-vto-fal
Virtual try-on without a model card — FLUX Pro VTO on fal, batched
- human_image
- garment_image
- task
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 variantshuman_image_url/garment_image_urlinstead). 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) orimage_url. base64 uploads your images inline; useimage_urlif 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-zhenzhenand 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.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| human_imageopt | IMAGE | — | |
| garment_imageopt | IMAGE | — | |
| human_image_urlopt | STRING | — | |
| garment_image_urlopt | STRING | — | |
| api_keyopt | STRING | — | |
| num_inference_stepsopt | INT | 41–50 | — |
| output_formatopt | COMBO | jpeg | 2 options: jpeg, png |
| seedopt | INT | 00–65535 | 0 = random seed. FAL seed max is 65535. |
| image_wayopt | COMBO | base64 | 2 options: base64, image_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 | — |