TT SDXL Models Loader
SDXL's loaders and a checkpoint merge in one node
- MODEL
- CLIP
- VAE
SDXL's normal loader story is three nodes minimum: a CheckpointLoader for the UNet, a DualCLIPLoader for CLIP-L and CLIP-G, and a VAELoader. TenserTensor's TT SDXL Models Loader collapses that into one box - and then does one thing the stock loaders can't: it merges a second checkpoint into the first on the fly. Pick a primary checkpoint, optionally pick a secondary one and set how much of each you want, and you get MODEL, CLIP, and VAE out the right side.
The merge is the reason this node exists, honestly. primary_ckpt is your base model, secondary_ckpt defaults to "None" (skip the merge entirely), and primary_weight (0–1) controls the blend: at 1.0 you get 100% primary, at 0.5 a 50/50 mix, toward 0 you're mostly the secondary. Under the hood it loads both checkpoints, clones the primary, and applies the secondary's weights as patches weighted by primary_weight vs 1 - primary_weight - the same weighted-merge math you'd get from a dedicated model-merging tool, but done live in the graph so you can dial a style mix per render instead of baking one merged file.
The rest is standard SDXL plumbing done well. clip_l and clip_g load the two text encoders as a proper SDXL CLIP pair (clip_device can push them to CPU to save VRAM - the T5-sized CLIP-G is the memory hog here, though nothing like Flux's), and vae_name pulls the VAE. The pixel_space VAE option you'll see in the dropdown is worth knowing: it's not a real VAE file, it's a passthrough that makes the pipeline skip VAE encoding/decoding, handy when you're feeding pixel-space images straight through without a latent round trip. In this plain version the VAE is loaded on CPU in bfloat16 to keep GPU memory for sampling.
Inputs that matter:
primary_ckpt/secondary_ckpt- the models; both frommodels/checkpoints.primary_weight- the blend knob when a secondary is set.clip_l,clip_g,vae_name- your encoder and VAE picks.
Outputs: MODEL, CLIP, VAE, all standard types - they plug into any native node, which makes this loader usable outside the pack's context system too.
Install is the pack standard:
cd ComfyUI/custom_nodes
git clone https://github.com/tenser-tensor/ComfyUI-TenserTensor
or search "TenserTensor" in ComfyUI Manager and restart. Declared deps are gguf and kornia; nothing heavy here, since SDXL loading is all core ComfyUI.
Where people get caught:
primary_weightis not "secondary strength". It's the primary's share of the merge. Set it to 0.7 and you're getting 70% primary, 30% secondary. Misreading it as "secondary at 0.7" is the classic mix-up.- CLIP-G VRAM. If the graph OOMs right after loading, push
clip_deviceto CPU. The CLIP stays on CPU and sampling runs on GPU; you lose a little prompt-encode speed, not sampling speed. - Merge happens at load, not at sample. Changing
primary_weightmid-graph reloads the merge, so weight tuning on a big checkpoint set can stutter. Tune with a small preview batch.
And the pack-wide caveat: this is the V1 class, marked deprecated as the author migrates to API V3 (TT_SdxlModelsLoaderNode is the maintained successor). It works fine today, and honestly the weighted live merge is a feature you'll miss in the stock loaders once you've used it.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| primary_ckpt | COMBO | 0 options: | |
| secondary_ckpt | COMBO | 1 options: None | |
| primary_weight | FLOAT | 1.000–1 | — |
| clip_l | COMBO | 0 options: | |
| clip_g | COMBO | 0 options: | |
| clip_device | COMBO | 2 options: default, cpu | |
| vae_name | COMBO | 1 options: pixel_space |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |
| CLIP | CLIP | — |
| VAE | VAE | — |