Apply Flux2 Fun Control
Where the Flux2 Fun ControlNet actually happens — and why it won't break your other workflows
- model
- control_model
- control_context
- control_group
- model
This is the node that does the actual ControlNet work in the Flux2 Fun chain: it takes your base Flux.2 Dev model, your loaded control branch, and your prepared 260-channel context, and produces a patched model you feed to the sampler. If you've got Load and Prepare wired up but nothing is wired into this node, you have no control happening at all - just a very expensive text-to-image.
How it works, without the scary part
The classic ControlNet idea - a trainable copy of the encoder blocks whose outputs get added into the frozen model's skip connections - doesn't survive contact with a DiT architecture like Flux.2. On these models the same job gets reimplemented against attention and MLP layers, and the gen2 pack does it the clean way: it clones your Flux.2 Dev MODEL, registers the managed control branch once, and composes clone-local replacements at double blocks 0/2/4/6. The key selling point is what it doesn't do: no flux.forward_orig replacement, no global monkey-patching of ComfyUI, no heuristic token-resizing. Every change lives on the cloned model instance, so running this graph doesn't silently corrupt every other Flux workflow in your install. That's a real virtue - a lot of ControlNet ports are just global patches waiting to break the next git pull.
The inputs that matter
model- your Flux.2 Dev diffusion model. Only Dev; Klein and Flux.1 will be rejected upstream.control_model- theFLUX2_FUN_MODELoutput fromGen2_LoadFlux2FunControlNet.control_context- theFLUX2_FUN_CONTEXToutput fromGen2_PrepareFlux2FunControl.strength- 0 to 4, default 1. How hard the condition pushes. On a union ControlNet like this, 1.0 is a sane start; drop toward 0.3–0.7 for loose guidance, and the KB's standing advice applies here more than anywhere: once the composition is formed, you don't need the condition shouting anymore.start_percent/end_percent- when during denoising the control applies, 0–1. This is the parameter ControlNet veterans fiddle with most. Holding the condition for the full sample can over-constrain detail; many structure-heavy workflows release it early (e.g. start 0, end 0.5).control_group(optional) - feed in aFLUX2_FUN_CONTROL_GROUPfrom the Combine node to stack multiple controls.
The output is a patched model - wire it into your sampler the same way you'd wire the unpatched one.
Install
ComfyUI Manager: search ComfyUI-gen2. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/petmycat/ComfyUI-gen2.git
cd ComfyUI-gen2
pip install -r requirements.txt
Restart. You need ComfyUI v0.28.0+ (this section is pinned to a specific recent commit), the Flux.2 Dev stack, and the 2602 checkpoint in models/controlnet. The Flux2 Fun section itself has no extra Python deps.
Where people get burned
Two things. First, VRAM - you're loading Flux.2 Dev (the 56B stack) plus a control branch that the loader never frees. Budget for it before you blame the node. Second, temper your expectations: the author states plainly that real-weight end-to-end parity is not yet claimed and the full GPU matrix hasn't passed. The architecture is deliberate and the harness exists, but treat first results as promising rather than gospel.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| control_model | FLUX2_FUN_MODEL | — | |
| control_context | FLUX2_FUN_CONTEXT | — | |
| strength | FLOAT | 1.000–4 | — |
| start_percent | FLOAT | 0.000–1 | — |
| end_percent | FLOAT | 1.000–1 | — |
| control_groupopt | FLUX2_FUN_CONTROL_GROUP | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |