ComfyUI Node

Set Bundle

Publish your whole model kit under one name, wires optional

By Mistress-Lukutar·Created 2 months ago·Updated 2 days ago· 2
Set Bundle
    • slot_1
    • slot_2
    • slot_3
    • slot_4
    • slot_5
    • slot_6
    • slot_7
    • slot_8
    • slot_9
    • slot_10
    • slot_11
    • slot_12
    • slot_13
    • slot_14
    • slot_15
    • slot_16
    ◄bundle_name►
    ◄slots►

    You have an SDXL checkpoint, its VAE, its CLIP, and a stray CONDITIONING you built three screens ago. Everything downstream needs them. Today that means four wires dragged to every consumer, four copies of the loader, or a context node from a pack that wants to own your whole graph. Set Bundle is the fourth option: name the kit, and anything asking for that name gets all of it.

    The problem it's actually solving

    Every plumbing pack converged on the same answer - bundle what travels together. Efficiency Nodes has Dependencies pipes, Easy-Use threads a pipe dict, Apt_Preset defines a whole RUN_CONTEXT type, rgthree has Context. They charge the same price: one custom type only their pack understands, whose failure mode is stale contents - the wire is connected, so nothing looks wrong, but the bag was assembled before the LoRA loader and you're quietly sampling base weights.

    Set Bundle takes the other angle. It doesn't invent a type you hand around; it publishes named values that a matching Get node elsewhere picks up - and every link stays real.

    How the slots grow

    You don't configure a schema. You wire.

    A Set Bundle always shows one free + add input. Drop a wire on it and that slot's type locks to the source (MODEL, VAE, CLIP, IMAGE, any custom type) and auto-names itself - model, vae, clip, then model_2. A fresh + add appears for the next one; pulling the wire off an auto-named slot collapses it again. The node menu adds Rename slot, Remove slot and Add slot ▸ for pre-creating a typed slot. Renamed slots survive disconnects, so sdxl_model doesn't evaporate when you reroute. Names must be unique, can't contain commas, semicolons or colons, and can't be bundle_name, slots or slot_<n>.

    The two fields you'll touch

    Nearly everything here is a socket, so the form is almost empty - deliberately.

    bundle_name is the only thing you type: sdxl, flux_base, whatever. Every Get Bundle with the same name receives every slot. It's the contract between the two nodes.

    slots you leave alone. It's the internal spec (model:MODEL,vae:VAE,…) the pack's frontend extension keeps synced, hidden on the node and serialized into the workflow. The backend reads it to fail loudly per slot, so a declared-but-unwired slot gives you Set Bundle [sdxl]: slot(s) not connected: vae at queue time instead of a None five nodes downstream. The one case where you set it by hand is a hand-written API prompt, where it orders the slots (or omit it and name your links slot_1…slot_16).

    Outputs mirror the inputs by name. The raw listing shows slot_1…slot_16 - the static fallback, since real socket names grow client-side; with the extension loaded you see model, vae, clip. Wire from them for a local value without a Get.

    Source → Set → Get → consumer, but the Set-to-Get hops are drawn invisibly by the extension. They are genuine links that serialize into the prompt like any other, so ComfyUI's own execution order applies, output caching works, API export works, and a headless run matches the graph you're looking at.

    That's also the answer to the "invisible wires are undebuggable" objection: named typed sockets, links that round-trip, loud errors. The cap is 16 slots per bundle; hit it and you want two bundles.

    Install

    cd ComfyUI/custom_nodes
    git clone https://github.com/Mistress-Lukutar/ComfyUI-LukutarNodes
    

    Or Manager → Install via git URL, then restart. Per the pack's requirements.txt the only dependency beyond ComfyUI's stack is opencv-python>=4.8 - Manager pulls it; a manual clone means installing it yourself. No model downloads. Nodes land under Lukutar/Variables.

    Restart the server and reload the browser tab after installing or pulling - slot growing is frontend JavaScript, and browsers hold onto it.

    Where people get burned

    Two live Sets, one name. Names are global to the workflow. Several Sets may share one on alternative branches - the "generated or loaded" pattern - as long as only one is active, since muted or bypassed nodes never reach the prompt. Two simultaneously active is ambiguous: Gets go unlinked with a ⚠ and the queue fails.

    Different slot specs per branch. Branch A with model, vae, clip and branch B with model, vae means switching reshapes every linked Get and drops the wiring on the sockets that vanished. Keep specs identical and the switch is invisible.

    No frontend, no sockets. Without the web assets the node loads and validates, but you can't grow slots from the UI - the slot inputs aren't in the declared schema. For one value use Set Variable/Get Variable; for API prompts, write links and spec yourself.

    Last thing: the pack is new enough that a corpus check turned up nothing on the author or these nodes. The code is small, the failure messages unusually good - but you're an early adopter, not a follower.

    CategoryLukutar/Variables

    Inputs (2)

    NameTypeDefaultDescription
    bundle_nameSTRINGBundle name, e.g. sdxl_base; Get Bundle nodes with this name receive all slots
    slotsSTRINGSlot spec 'name:TYPE,...' managed by the web extension (hidden in the UI); hand-written API prompts may set it to order the slots

    Outputs (16)

    NameTypeDescription
    slot_1*—
    slot_2*—
    slot_3*—
    slot_4*—
    slot_5*—
    slot_6*—
    slot_7*—
    slot_8*—
    slot_9*—
    slot_10*—
    slot_11*—
    slot_12*—
    slot_13*—
    slot_14*—
    slot_15*—
    slot_16*—