Krea2 Control Apply
The node that actually attaches your Krea 2 control — and why sampling dies without it
- model
- control_latent
- MODEL
Krea 2's control pipeline is three nodes that do one job between them: load the control LoRA, encode your control image, and hand the whole thing to the sampler. Krea2 Control Apply is the handoff. It's the smallest of the three and the easiest to forget, which is unfortunate, because forgetting it is the single most common way to turn a working Krea 2 control workflow into a red error box.
So what does it actually do? The name undersells it. The loader node has already patched the model with the control LoRA's weights and registered a wrapper that runs on every diffusion forward. What it's waiting for is the encoded control latent to be somewhere the wrapper can read it - and that's this node's entire job. It takes the LATENT your Krea2 Control Image Encode produced, normalizes it the way ComfyUI normalizes the sampler's main latent (the same process_latent_in pass the DiT expects, including the extra time dimension if you're on the 3D Krea2/Qwen VAE), checks the channel count against what the model's latent_format expects, and tucks the result into the model's transformer_options under a key the sampling wrapper watches. Every diffusion step, the wrapper pulls it out, turns it into control tokens, and injects them.
That channel check is worth knowing about, because it's the built-in tripwire for a mistake everyone makes once: using the wrong VAE. Encode with the Flux or SDXL VAE instead of the Krea2/Qwen one and Apply will refuse the latent with a message telling you exactly which channels the model wants. Annoying the first time, genuinely useful the tenth.
Inputs and outputs are mercifully few:
- model - the MODEL output of
Krea2 Control LoRA Loader. This node verifies the loader's attachment is actually on the model and errors if you feed it the raw base model instead. - control_latent - the
control_latentLATENT output ofKrea2 Control Image Encode. - MODEL out - goes straight into your sampler (KSampler / SamplerCustom).
The output is a patched clone, not the original, so your base model path stays untouched and re-runnable.
Installing the pack is the same for all three nodes: ComfyUI Manager → search "comfyui-krea2-controlnet" → install, or clone it manually:
cd ComfyUI/custom_nodes
git clone https://github.com/facok/comfyui-krea2-controlnet
Restart ComfyUI. There's no requirements.txt and no extra pip dependencies - it only uses ComfyUI's own internals (torch, ModelPatcher, patcher_extension). Nothing is auto-downloaded; the only file you need to fetch yourself is the control LoRA into models/loras.
Where people get burned
- Sampling fails with "no control latent is attached." The README is blunt about it:
Krea2 Control Applyis required after the loader. If the control LoRA is loaded without an attached control latent, sampling errors instead of silently running a half-patched model - which is the right call, but it reads as a mysterious failure until you realize you skipped Apply or wired the sampler to the loader's output directly. - "must receive the MODEL output from Krea2 Control LoRA Loader." You connected Apply to a model that never went through the loader. Route it through the loader first.
- A channel-count error on Apply. Wrong VAE upstream. Re-encode with the Krea2/Qwen image VAE and the mismatch disappears.
It's a tiny node, but it's the difference between a control workflow that works and one that crashes with a puzzle for an error message. Wire it in the order the README suggests - loader, then Apply, then sampler - and it just works.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| control_latent | LATENT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |