ComfyUI Node

Load Lens

Load Lens — pull a saved steer direction back out of the drawer

By Nynxz·Created 4 months ago·Updated 4 months ago· 0
Load Lens
    • steer
    • info
    lensNone
    strength1.00
    layer_specmiddle
    normalizetrue
    last_token_onlyfalse
    custom_path

    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 None and 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.

    CategoryQwenScope/Lens

    Inputs (6)

    NameTypeDefaultDescription
    lensCOMBONone1 options: None
    strengthFLOAT1.00-8–8
    layer_specSTRINGmiddleUsed by Steer CLIP. Steer Conditioning ignores this.
    normalizeBOOLEANtrue
    last_token_onlyBOOLEANfalse
    custom_pathoptSTRINGAbsolute path; overrides the dropdown if set.

    Outputs (2)

    NameTypeDescription
    steerQSCOPE_STEER
    infoSTRING