Nodes/ComfyUI-PixlStash/PixlStash Multi Adapter (LoRA) Loader
ComfyUI Node

PixlStash Multi Adapter (LoRA) Loader

Eight LoRA rows in one node, if you run PixlStash

By Pikselkroken·Created 6 months ago·Updated 7 days ago· 16
PixlStash Multi Adapter (LoRA) Loader
  • model
  • clip
  • model
  • clip
  • trigger_words
◄showAll adapters►
◄adapter_kind— Any —►
◄base_model▾►
◄adapter_sha256►
◄strength_model1.00►
◄strength_clip1.00►
◄adapter_sha256_2►
◄strength_model_21.00►
◄strength_clip_21.00►
◄adapter_sha256_3►
◄strength_model_31.00►
◄strength_clip_31.00►
◄adapter_sha256_4►
◄strength_model_41.00►
◄strength_clip_41.00►
◄adapter_sha256_5►
◄strength_model_51.00►
◄strength_clip_51.00►
◄adapter_sha256_6►
◄strength_model_61.00►
◄strength_clip_61.00►
◄adapter_sha256_7►
◄strength_model_71.00►
◄strength_clip_71.00►
◄adapter_sha256_8►
◄strength_model_81.00►
◄strength_clip_81.00►

Let's get the awkward part out of the way: this node only does anything if you run PixlStash, the self-hosted image management database that talks to ComfyUI over HTTP. No PixlStash instance, no node - it will just fail on the connection. If you got here from a Google search for "LoRA stacking node," you probably want rgthree's Power Lora Loader instead - the one the community actually names in threads (363 of them at last count).

If you do run PixlStash, this is the node that collapses a chain of five LoRA loaders into one box with rows.

What it actually is

Same job as the pack's single Adapter (LoRA) Loader, eight times over. Each row is one adapter off your PixlStash model shelf, with its own strength_model and strength_clip, and the rows are applied top to bottom - exactly as if you had chained that many Adapter Loaders. The Adapter Loader is the PixlStash-shaped twin of ComfyUI's built-in LoraLoader; this is the twin of chaining it.

The pleasant side effect is trigger_words: every picked adapter's trained words, comma-separated in row order, on one output. That solves the most boring failure mode in LoRA work - the missing trigger word - without you opening five CivitAI tabs. (The node is defensive about this: PixlStash often stores the field as a JSON array like ["Clementine"], so the code unpacks a list before joining it. You get Clementine, not ["Clementine"].)

How the rows work

The node declares eight rows as flat, numbered inputs: adapter_sha256, strength_model, strength_clip, then adapter_sha256_2, strength_model_2, and so on. You don't type digests by hand - you hit Browse adapters… and tick cards; the browser fills the rows and keeps them packed from the top. An empty digest means that row loads nothing, wherever it sits, and a node with all eight rows empty passes model and clip straight through untouched.

Why numbered widgets instead of one JSON blob? Because PixlStash finds LoRA slots by field name. That spelling is a contract with the server's own "run this workflow with a person's LoRA injected" popup - a list hidden in a dict would be invisible to it. Practical upshot: if you hand-edit workflow JSON, keep the names as written.

Underneath, each row resolves its digest to a file - used in place if ComfyUI and PixlStash share a filesystem, otherwise fetched once and cached as pixlstash/<sha256>.safetensors under your models/loras, digest verified - then applies it via comfy.sd.load_lora_for_models, the same public API the built-in loader uses. Each adapter's file also stays read between runs instead of being re-read on every generate.

Inputs and outputs that matter

  • model (required) - the diffusion model to patch.
  • clip (optional) - wire it for adapters that touch CLIP. Leave it unwired for model-only adapters, and then leave the CLIP output unwired too, because it'd be carrying nothing.
  • show - All adapters or People who fit. The second lists people instead of files: everyone on the shelf with an adapter for the chosen base_model, with a choice between their adapters when more than one fits.
  • adapter_kind and base_model - narrow what the Browse grid shows. All three of show, adapter_kind and base_model affect the grid only, not what loads.

Outputs: model, clip, trigger_words (wire it into a text encode). The node also attaches a pixlstash_lock to its output recording which shelf adapters were actually resolved, so a picture saved downstream knows what went into it.

Install

ComfyUI Manager, search ComfyUI-PixlStash, install, restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/Pikselkroken/ComfyUI-PixlStash.git

Then set Settings > PixlStash → URL, API Token, Verify SSL. Credentials live there, not in the workflow JSON. Dependencies are just requests and Pillow, both already present in a normal ComfyUI env. .gguf needs pip install -U "gguf>=0.13.0" - but not for this node: shelf adapters are .safetensors only.

Where people get burned

  • A share token gives you a 403. The model shelf needs an owner token; resource-scoped share tokens are refused by design.
  • Multi-user setups don't work. ComfyUI doesn't tell a node which user submitted the prompt, so these nodes refuse to run rather than risk using someone else's token. One single-user ComfyUI per PixlStash user.
  • A digest the shelf doesn't have errors out naming the row - "PixlStash Multi Adapter Loader, row 3" - which with eight rows is the difference between a fixable error and a shrug. Good error, keep it.
  • Stacking is still stacking. The node makes it convenient, not predictable: interactions between several LoRAs are wild, so add one row at a time with a fixed seed. If you get black images or NaN, try reordering - larger adapters first is the folk fix. And weights aren't 0.7 forever: 0.5–0.8 is SDXL-lineage advice, while current-generation character adapters often want 1.0 or above, since dropping the strength costs likeness. Read the model page.
CategoryPixlStash

Inputs (29)

NameTypeDefaultDescription
modelMODELThe diffusion model the adapters are applied to.
showCOMBOAll adaptersWhat the Browse grid lists: every adapter, or the people who have one for the chosen base model. Affects the grid only, not what is loaded.
adapter_kindCOMBO— Any —Narrows the Browse grid to one adapter algorithm. Affects the grid only, not what is loaded.
base_modelCOMBONarrows the Browse grid to adapters for one base model family (Krea 2 takes Raw and Turbo too). Filled in from the checkpoint on a workflow opened from PixlStash; affects the grid only, not what is loaded.
clipoptCLIPOptional. Leave unwired for model-only adapters — but then leave the CLIP output unwired too, as it has nothing to carry.
adapter_sha256optSTRINGSHA-256 of the adapter on row 1; empty loads nothing. Written by the Browse button.
strength_modeloptFLOAT1.00-100–100How strongly row 1 patches the model.
strength_clipoptFLOAT1.00-100–100How strongly row 1 patches CLIP. Ignored with no clip wired.
adapter_sha256_2optSTRINGSHA-256 of the adapter on row 2; empty loads nothing. Written by the Browse button.
strength_model_2optFLOAT1.00-100–100How strongly row 2 patches the model.
strength_clip_2optFLOAT1.00-100–100How strongly row 2 patches CLIP. Ignored with no clip wired.
adapter_sha256_3optSTRINGSHA-256 of the adapter on row 3; empty loads nothing. Written by the Browse button.
strength_model_3optFLOAT1.00-100–100How strongly row 3 patches the model.
strength_clip_3optFLOAT1.00-100–100How strongly row 3 patches CLIP. Ignored with no clip wired.
adapter_sha256_4optSTRINGSHA-256 of the adapter on row 4; empty loads nothing. Written by the Browse button.
strength_model_4optFLOAT1.00-100–100How strongly row 4 patches the model.
strength_clip_4optFLOAT1.00-100–100How strongly row 4 patches CLIP. Ignored with no clip wired.
adapter_sha256_5optSTRINGSHA-256 of the adapter on row 5; empty loads nothing. Written by the Browse button.
strength_model_5optFLOAT1.00-100–100How strongly row 5 patches the model.
strength_clip_5optFLOAT1.00-100–100How strongly row 5 patches CLIP. Ignored with no clip wired.
adapter_sha256_6optSTRINGSHA-256 of the adapter on row 6; empty loads nothing. Written by the Browse button.
strength_model_6optFLOAT1.00-100–100How strongly row 6 patches the model.
strength_clip_6optFLOAT1.00-100–100How strongly row 6 patches CLIP. Ignored with no clip wired.
adapter_sha256_7optSTRINGSHA-256 of the adapter on row 7; empty loads nothing. Written by the Browse button.
strength_model_7optFLOAT1.00-100–100How strongly row 7 patches the model.
strength_clip_7optFLOAT1.00-100–100How strongly row 7 patches CLIP. Ignored with no clip wired.
adapter_sha256_8optSTRINGSHA-256 of the adapter on row 8; empty loads nothing. Written by the Browse button.
strength_model_8optFLOAT1.00-100–100How strongly row 8 patches the model.
strength_clip_8optFLOAT1.00-100–100How strongly row 8 patches CLIP. Ignored with no clip wired.

Outputs (3)

NameTypeDescription
modelMODELThe model with every row's adapter applied, in row order.
clipCLIPThe CLIP with every row's adapter applied — carries nothing if you left the clip input unwired, so leave this unwired too in that case.
trigger_wordsSTRINGEvery picked adapter's trigger words, in row order, comma-separated. Wire into a text encode. Empty when no row has any.