NS WaveSpeed Flux ControlNet Union Pro 2
Hosted Flux With a Real ControlNet Knob
- client
- output_image
ControlNet is the single highest-leverage trick in this hobby: it takes a pose, a depth map, an edge map - the shape of a picture - and makes the model build within it. On a local Flux install, a union ControlNet means downloading the base model, the controlnet weights, the text encoder, and finding a preprocessor. NSWaveSpeedFluxControlNetUnionPro2 skips all of that: it runs Flux ControlNet Union Pro 2 on WaveSpeed's servers. Paste a control image's URL, write a prompt, and the structure is respected without a single weight on your disk.
The trade-off is the same as every cloud node in this pack: it's hosted, it costs per call, and your image leaves the machine. For a first pass at a composition, or a run on a machine with no GPU headroom, that's often the right price.
How it works
The node calls WaveSpeed's Flux ControlNet Union Pro 2 endpoint with your prompt, the control image, and the conditioning knobs. The interesting ones:
- control_image - a URL string, not an IMAGE tensor. The tooltip says "connect from Upload Image node": you need a node that hands back a URL (this pack's uploader or any URL-producing node). This trips people up constantly - an IMAGE socket won't plug into it.
- controlnet_conditioning_scale - 0–2, default 0.7. How hard the control pulls. On union models the current advice is lower than the old SD-era 1.0; 0.7 is a sane start, and 0.4–0.5 gives structure without strangling the prompt.
- control_guidance_start / control_guidance_end - when in denoising the control applies (defaults 0 → 0.8). The community's standing tip applies here: let composition form under the control, then release it for the detail phase. Ending at 0.8 instead of 1.0 does exactly that.
- guidance_scale (default 3.5), num_inference_steps (default 28) - Flux is a low-guidance model; 3.5 is in the right band. 28 steps is plenty for hosted Flux.
- size - 11 presets from 1024×1024 up to 1536×640/640×1536, or custom_size as a
"1920*1080"string that overrides the dropdown. - seed (-1 = random), num_images (1–4), output_format (jpeg/png/webp), enable_sync_mode (wait for the result).
Output: output_image as an IMAGE tensor, dropped back into your graph like any local generator.
Install and setup
Part of the Symbiotica pack. ComfyUI Manager → search "Symbiotica", or:
cd ComfyUI/custom_nodes
git clone https://github.com/symbiotica-ai/comfyui-nodes.git symbiotica
pip install -r symbiotica/requirements.txt
Restart, then build the client: wire a NSWaveSpeedClient node (key in Settings → Symbiotica) into this node's client socket.
Troubleshooting
- "control_image" won't accept my image - it's a URL string, not an IMAGE socket. Feed it from a node that outputs a URL.
- The control is ignored -
controlnet_conditioning_scaletoo low, or the control image is too weak (a blank edge map conditions nothing). Crank to ~1.0 to confirm the pipeline, then dial back. - Too much of the control, not enough of the prompt - lower the conditioning scale and end guidance earlier (0.6 instead of 0.8). You want structure, not a photocopy.
- Costs creep up - every call is metered, and
num_images4 is four billable renders. Iterate at 1 image, sync mode on, and only fan out when the composition is locked.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| client | WAVESPEED_AI_API_CLIENT | — | |
| prompt | STRING | Text description of the image to generate | |
| control_image | STRING | URL of control image for ControlNet guidance (connect from Upload Image node) | |
| size | COMBO | 1024*1024 | Resolution of the generated image |
| num_inference_steps | INT | 281–50 | Number of denoising steps (higher = better quality, slower) |
| guidance_scale | FLOAT | 3.50–20 | How closely to follow the prompt (higher = more adherence) |
| controlnet_conditioning_scale | FLOAT | 0.70–2 | Influence of control image on generation (0=none, 2=maximum) |
| control_guidance_start | FLOAT | 0.000–1 | When to start applying control (0=beginning) |
| control_guidance_end | FLOAT | 0.800–1 | When to stop applying control (1=end) |
| seed | INT | -1-1–18446744073709550000 | Random seed for reproducible results. -1 for random seed |
| num_images | INT | 11–4 | Number of images to generate (1-4) |
| output_format | COMBO | jpeg | Format of the output image |
| enable_sync_mode | BOOLEAN | true | Wait for generation to complete before returning |
| custom_sizeopt | STRING | Custom size as 'width*height' (e.g. '1920*1080'). Overrides size dropdown if provided. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| output_image | IMAGE | — |