EditUtils: Flux3Klein Edit Apply (Model Check) lrzjason
The FLUX.3 Patch Node That Deliberately Patches Nothing
- model
- model
Here's the thing about Flux3KleinEditApply_EditUtils: it has a model input and a model output, it sits between your UNETLoader and your sampler exactly like every other EditUtils "apply" node, and it does not modify the model in any way that changes your output.
That's not a bug or an unfinished node. It's a guard rail with a familiar shape.
Why there's nothing to patch
On the older routes, an apply node is doing real work. It rewrites the model's forward pass so reference latents get injected at the right place - that's the whole mechanism behind the Qwen and FLUX.2 klein edit paths in this pack. FLUX.3 is different: ComfyUI's own implementation already consumes reference_latents from the standard conditioning key and derives the reference position ids itself, including the negative l coordinates that tell one reference from another. There's nothing left for a custom node to do.
So what this node does instead is check that the thing you connected is actually a FLUX.3 model. It looks for the architectural fingerprints - the per-mode block sets and the reference-id helper that only exist on FLUX.3 - and if they're missing, it tells you.
The failure it's built to catch
The realistic mistake is wiring the FLUX.2 klein patch into a FLUX.3 graph, or the other way round. If you run a FLUX.2 patch over a FLUX.3 checkpoint, you don't get a crash. You get a graph that samples happily and quietly ignores your references. Worse, the good-looking FLUX.2-style output gives you no reason to suspect anything is wrong, so you go rewrite your prompt for an hour.
Put this in the path and the model either validates or the graph stops with a message naming the actual problem, including the suggestion to use Flux2KleinEditApply_EditUtils for FLUX.2 klein. That's the entire value.
The inputs
model (required) - the model wire, nothing else. Unlike the other apply nodes there is no conditioning input; references reach the model through the conditioning chain on their own.
strict (default true) - raise when the model isn't FLUX.3. Set it to false and the node prints a warning and passes the model through untouched, which is useful when you're swapping checkpoints in a shared graph and don't want the whole thing to die mid-test.
debug_log (default false) - flips on a small printout: FLUX.3 detected, whether the checkpoint is step-distilled, and the reminder of what sampling settings that implies. Worth turning on once when you install a new checkpoint, then leaving off.
Output is a single model. When validation passes it hands you a clone, so nothing upstream is mutated.
Do you need it?
No. The pack's own flux3 editutils example.json leaves it out entirely, and that graph works. References flow through FLUX.3 natively, and the model remains unpatched.
Reach for it if you're building graphs that get shared around, if you're porting a FLUX.2 klein workflow to FLUX.3 and want to know immediately whether you've missed something, or if you're the sort of person who'd rather have a red error than a plausible-looking picture of a wolf in the wrong place.
Install
Manager → search ComfyUI-EditUtils → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/lrzjason/ComfyUI-EditUtils
No pip dependencies. The relevant install requirement isn't on the Python side at all - it's your ComfyUI build. FLUX.3 has to be implemented in the ComfyUI you're running, because the pack relies on the core flux3 model path rather than shipping its own. On an older build the checkpoint won't load, and this node will do exactly what it says: tell you the model doesn't look like FLUX.3.
Where people get burned
Expecting it to enable editing. It doesn't. If your references aren't reaching the sampler, the problem is upstream: an unconnected configs link in the preparer chain, or a to_ref turned off. No amount of apply node fixes that.
Leaving strict off and forgetting. With strict = false you've turned your diagnostic into a logger message in a console you're not reading. Fine while experimenting, bad as a permanent state.
Assuming FLUX.2 settings carry over. The distilled FLUX.3 checkpoint is a flow-map model: roughly 4–16 steps at CFG 1.0 with a zeroed-out negative. The example runs 8 steps with ConditioningZeroOut feeding the negative. If you paste in 30 steps at CFG 3.5, that's a different graph, not a stronger one.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| debug_logopt | BOOLEAN | false | — |
| strictopt | BOOLEAN | true | Raise instead of warning when the model is not a FLUX.3 model. Disable to pass the model through unchanged. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |