Load Lens
Load Lens — pull a saved steer direction back out of the drawer
- steer
- info
Load Lens is the "open a saved steering direction" node - the read half of the Save Lens / Load Lens pair. A lens is just a direction tensor plus metadata (where it came from, its defaults) persisted as a .safetensors file. This node reads it back and turns it into a QSCOPE_STEER plan, ready to drop into Steer Conditioning, Steer CLIP, Combine Lenses, or Generate.
The point of lenses is reuse. You train or extract a good "cinematic" direction once, save it, and then every workflow - including ones you share with other people - can just load it without re-running analysis or training. The README frames it as the same idea as ConceptSteer's lenses, and the compatibility story is genuinely nice: the dropdown picks up .pt lenses from any lenses/ directory under either the pack or ComfyUI/lenses/, so existing ConceptSteer lenses load through this node too.
How it works
The node scans the lens roots (<pack>/lenses/ and ComfyUI/lenses/) for .safetensors and .pt files and populates the dropdown. On load, it reads the direction tensor from the safetensors header - no pickle, just a JSON header plus raw bytes, so no code executes on load - and pulls any stored defaults out of the metadata. Those defaults are overridable right here: the node always lets you re-specify strength, layer_spec, normalize, and last_token_only on top of what the file remembers.
For layer_spec, note the tooltip's warning: it's used by Steer CLIP, and Steer Conditioning ignores it (that node applies at whatever layer the conditioning tensor carries). So don't overthink the spec when you're heading into a Steer Conditioning flow.
The inputs that matter
- lens - the dropdown of discovered lens files. Start with
Noneand pick from the list; files appear as relative paths. - custom_path - an absolute path that overrides the dropdown if set. The escape hatch for lenses living outside the standard roots.
- strength - how hard to apply when this steer plan is used (default 1.0, −8 to +8).
Outputs: steer (QSCOPE_STEER) and info confirming the loaded dim and metadata. If no lens is selected and custom_path is empty, you get a clear "No lens selected" error rather than silent weirdness.
Installing it
Same pack, one install: ComfyUI Manager → search "ComfyUI QwenScope", or
cd ComfyUI/custom_nodes
git clone https://github.com/Nynxz/ComfyUI-QwenScope
restart. Needs the usual deps (transformers, huggingface_hub, safetensors, Pillow, numpy). No downloads happen at load time - lenses are tiny (one direction tensor), so this node is instant.
Common issues
The d_model trap applies here too: a lens trained from a 2048-d encoder will not apply to a 4096-d encoder, and downstream nodes will complain. That's normally visible right in the info string - check dim= against your encoder's hidden size. If the dropdown is empty, your lens lives outside the two scanned roots - use custom_path with an absolute path. And if a .pt lens comes from a foreign format with no metadata, the node still extracts a direction (it scans for the first plausible tensor), but the stored defaults are gone, so set strength explicitly.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| lens | COMBO | None | 1 options: None |
| strength | FLOAT | 1.00-8–8 | — |
| layer_spec | STRING | middle | Used by Steer CLIP. Steer Conditioning ignores this. |
| normalize | BOOLEAN | true | — |
| last_token_only | BOOLEAN | false | — |
| custom_pathopt | STRING | Absolute path; overrides the dropdown if set. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| steer | QSCOPE_STEER | — |
| info | STRING | — |