Steer CLIP
Steer CLIP — install steering hooks on your image model's text encoder
- clip
- steer
- clip
- info
Steer CLIP is the node that makes QwenScope steering work on actual image generation. It takes a ComfyUI CLIP (the text encoder) and a QSCOPE_STEER plan, installs residual-stream steering hooks on the encoder's transformer layers, and hands back a steered CLIP that feeds straight into CLIPTextEncode → KSampler. For FLUX.2 [klein], Qwen-Image, and any model whose encoder is a Qwen LLM, this is how you nudge generation without touching the diffusion model at all.
The whole pitch: no LoRA, no fine-tuning, no extra model. The encoder in these image models is a Qwen model - FLUX.2 [klein] 9B uses Qwen3-8B - so the same SAE directions you'd steer an LLM with apply to your image prompts. Steer CLIP is the plumbing that makes that happen.
How it works
It discovers the transformer layers hidden inside whatever CLIP wrapper ComfyUI loaded (fp16, fp8mixed, fp4mixed, GGUF - the bridge probes for the real decoder module regardless of quantisation), checks that the steer direction's d_model matches the encoder's hidden size, and installs forward hooks on the residual stream at the layers your plan's layer_spec names, scaled by strength. Every subsequent CLIPTextEncode through the returned CLIP produces steered conditioning.
The critical detail: the hooks persist on the CLIP object. This is the multi-layer power move - you can intervene at several layers at once, which Steer Conditioning can't do (it applies a single shot to the encoded tensor). But persistence cuts both ways: the steering stays live until you run Clear CLIP Steering. Re-running this node replaces the previous hooks, which is the other way to change direction. And unlike Generate's self-cleaning context-manager steering, here you are the cleanup.
The inputs
- clip - the
CLIPfrom any Load CLIP in your graph. - steer - the
QSCOPE_STEERplan (from Feature → Direction, Load Lens, Combine Lenses, Train Lens…).
Outputs: clip - the steered encoder, to be wired into CLIPTextEncode - and info reporting the source, strength, and how many of the encoder's layers got hooks (layers active: N/total).
Installing it
One pack, one install: ComfyUI Manager → search "ComfyUI QwenScope", or
cd ComfyUI/custom_nodes
git clone https://github.com/Nynxz/ComfyUI-QwenScope
restart. Usual deps (transformers, huggingface_hub, safetensors, Pillow, numpy). If you need the matching SAE for FLUX.2 [klein] 9B, that's Qwen/SAE-Res-Qwen3-8B-Base-W64K-L0_50, downloaded lazily on first use.
Common issues
The two that bite: (1) mismatched d_model - a direction trained for a 2048-d encoder won't install on a 4096-d one, and you get a hard error listing packs that fit. (2) forgotten hooks - the #1 support question for this node is "why is my generation still steered?" because the hooks survived a workflow edit. When in doubt, drop a Clear CLIP Steering node in. If you get "Could not find transformer layers," the CLIP bridge dumped the encoder structure in the console - check which loader wraps yours. And a real edge case: if you're about to train a lens, make sure no stale steer hooks are live, or your training captures will be contaminated (the Train node's NaN error explicitly tells you to clear steering first).
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| steer | QSCOPE_STEER | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| clip | CLIP | — |
| info | STRING | — |