SF WaveSpeed Flux ControlNet Union Pro 2
Flux with real spatial control, served over the WaveSpeed API
- client
- output_image
ControlNet is how you tell a diffusion model where things go instead of just what they are - you feed it an edge map, a depth map, or a pose skeleton and it composes along that structure. For Flux, the good open ControlNet checkpoints exist, but running them properly means a serious GPU and a bit of setup. SF WaveSpeed Flux ControlNet Union Pro 2 is the lazy path: it hands a control image to WaveSpeed's flux-controlnet-union-pro-2.0 endpoint and returns a composed IMAGE. No checkpoint downloads, no VRAM math - just a public URL for your control image and a few dials.
How it works
"Union" ControlNets are the modern single-file approach: one checkpoint covers multiple condition types (canny edges, soft edge, depth, pose, and friends) instead of needing a separate model per condition. You supply the preprocessed control image as a URL, and the node sends it alongside your prompt with a batch of conditioning parameters. The interesting dials are the ones that control when and how hard the control applies:
- controlnet_conditioning_scale - default 0.7 (0 = no influence, 2 = maximum). This is the strength dial. Too low and your canny map is decorative; too high and the prompt can't breathe.
- control_guidance_start / control_guidance_end - default 0.0 to 0.8. The control window in denoising time. Stopping at 0.8 (before the end) is the classic trick for letting the model add fine detail in the late steps without breaking the structure.
The rest reads like a familiar sampler block: num_inference_steps (28), guidance_scale (3.5), seed (-1 = random), num_images (1–4), output_format (jpeg/png/webp), and enable_sync_mode.
The inputs that matter
For a beginner, three things:
- client - the SF WaveSpeed Client output. No client, no generation.
- prompt - what the image should contain, decoupled from where.
- control_image - a public URL of your control input (edges, depth, pose). This is the input that makes or breaks the result - garbage in, garbage composed.
Also useful: size (presets like 1024*1024), and custom_size (an optional "width*height" string like "1920*1080" that overrides the dropdown if provided). Output is output_image (IMAGE).
Installing it
In the SF ComfyUI Nodes pack from Stillfront. ComfyUI Manager → "SF ComfyUI Nodes" → Install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Stillfront/comfyui-sf-nodes.git
cd comfyui-sf-nodes
pip install -r requirements.txt
Plus a WaveSpeed API key through SF WaveSpeed Client.
Common issues
The usual URL trap applies - the control_image must be publicly fetchable or the request dies immediately. The more interesting failure is silent: a preprocessed control image that doesn't match what the union model expects. A canny map resized to a tiny thumbnail will technically work and produce mush. Keep control inputs at a reasonable resolution, and treat controlnet_conditioning_scale as your primary lever - most "it ignored the control" complaints are solved by moving 0.7 toward 1.2. And if you're coming from a local ComfyUI ControlNet workflow, note that Flux's controlnets don't load on other architectures; this node sidesteps that entirely by using the API-side model, which is honestly the point.
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 | — |