Bobs LoRA Loader (FLUX)
The FLUX LoRA loader that gives every block its own strength
- model
- clip
- MODEL
- CLIP
- info
A FLUX LoRA is never one thing. Character files mix a face, an outfit, and an art style; style files bury a subject in the texture. The standard LoraLoader gives you a single strength slider, which is a sledgehammer for a problem that wants tweezers. Bobs LoRA Loader (FLUX) splits the model into a row of conceptual blocks - composition, subject, style core, detail, texture, the text encoder - each with its own weight. Keep the subject, kill the style. Or the reverse. That's the whole pitch.
It's one of three loaders in the BobsBlazed/Bobs-Lora-Loader pack, all under Bobs_Nodes (the siblings are SDXL and a Universal node). This one targets FLUX.1 dev/schnell and its variants - the README explicitly includes Chroma, which matters because the community's standing advice is that FLUX LoRAs mostly transfer there, just with some blocks missing.
How it works
FLUX.1 is built from 19 double-stream blocks (the big attention+MLP units) followed by 38 single-stream blocks. This node reads the block counts straight off the loaded model's config rather than hard-coding them, so pruned and distilled FLUX variants (a chopped-down 8+16 Flex, Chroma, whatever) scale proportionally instead of dumping tensors into "Other Tensors."
Each block gets bucketed by its position:
- Early Downsampling (Composition) through Late Downsampling (Refinement) - the double-stream path, split into fifths by index.
- Core/Middle Block (Style Focus) - the late double blocks plus the first single blocks. The style carrier.
- Early/Mid/Late Upsampling - the single-stream tail. Initial style, then detail, then final textures.
- Text Conditioning, Timestep, Image Hint, Guidance, Vector Embedding - FLUX's conditioning inputs (
txt_in,img_in,guidance_in...), so you can tune the LoRA's text influence separately. - Final Output Layer (Latent Projection) and Other Tensors round it out.
A nice mechanical detail: FLUX packs q, k, v into single fused qkv weights, and OneTrainer's lora_transformer_* naming is a separate dialect again. The loader classifies on the canonical key ComfyUI resolves to, not the raw name, and it handles the fused-weight patches properly - the classification rewrite in the changelog fixed exactly this class of bug.
The inputs that matter
Wire in model and clip from your loader (the README says clip is optional - skip it to patch the model only), pick the LoRA, then:
strength- global multiplier over every block, −5 to 5. Setting it to 0 returns the model untouched.preset-Character,Style,Concept,Fix Hands/Anatomy(andDetail & Texture). These are tuned weight tables, not vibes.Characterruns the up path and final layer at ~0 so you get the subject without the style;Styledoes the reverse, slashing the text encoder and letting the single-stream tail carry the look.Fix Hands/Anatomyis a modest global 0.4 with early downsampling at 1.0.- The block sliders - only active when
presetisCustom.
Read this twice, because it's the #1 confusion: any preset other than Custom ignores the sliders. They don't add on top; the preset's table replaces them. strength is the only thing that still multiplies. Want the Character preset with 20% more texture? Rebuild it in Custom and nudge Mid/Late Upsampling up from 0.
Full (Normal LoRA) sets everything to 1.0, matching ComfyUI's built-in loader - handy as a control to prove the node isn't changing your baseline.
Installing it
There's no requirements.txt and no model download - pure Python over ComfyUI's API. Install Bobs_LoRA_Loader from ComfyUI Manager, or:
cd ComfyUI/custom_nodes/
git clone https://github.com/BobsBlazed/Bobs-Lora-Loader
Restart, and your LoRAs come from the usual models/loras folder.
Where people get burned
- The preset trap above. If your Custom slider edits "do nothing," check you're not still sitting on a named preset.
- Wrong architecture. Point this node at an SDXL model and every tensor lands in one bucket; since v1.2.1 it logs a loud warning when 90%+ of UNet tensors pile into a single block and points you at the Universal loader. Take the hint.
- "Other Tensors" isn't zero. The console prints a per-block report - weight, tensors found, tensors patched - for every LoRA you load. A nonzero weight with zero tensors means that LoRA simply doesn't reach that block. It's the fastest way to learn what a file actually touches.
FLUX LoRAs are already the fiddliest part of the ecosystem, and this node is how you pull them apart instead of fighting one global slider. Start with a preset, read the report, then go Custom once you know which blocks hold the part you hate.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | Diffusion model to patch. | |
| lora_name | COMBO | LoRA file to load. 'None' passes the model through untouched. | |
| strength | FLOAT | 1.00-5–5 | Global multiplier applied on top of every block weight. |
| preset | COMBO | Choose 'Custom' to use the sliders below; any other preset overrides them. | |
| Text Conditioning | FLOAT | 1.00-2–2 | diffusion_model.txt_in — projects text embeddings into the transformer. |
| Timestep Embedding | FLOAT | 1.00-2–2 | diffusion_model.time_in — timestep embedding. |
| Image Hint | FLOAT | 1.00-2–2 | diffusion_model.img_in — latent patch embedding. |
| Guidance Embedding | FLOAT | 1.00-2–2 | diffusion_model.guidance_in — distilled guidance embedding. |
| Vector Embedding | FLOAT | 1.00-2–2 | diffusion_model.vector_in — pooled CLIP vector embedding. |
| Early Downsampling (Composition) | FLOAT | 1.00-2–2 | First fifth of the double-stream blocks. Global composition and pose. |
| Mid Downsampling (Subject & Concept) | FLOAT | 1.00-2–2 | Second fifth of the double-stream blocks. Subject identity and concept. |
| Late Downsampling (Refinement) | FLOAT | 1.00-2–2 | Tail of the first half of the double-stream blocks. Structural refinement. |
| Core/Middle Block (Style Focus) | FLOAT | 1.00-2–2 | Late double-stream plus early single-stream blocks. Dominant style carrier. |
| Early Upsampling (Initial Style) | FLOAT | 1.00-2–2 | Early-middle single-stream blocks. Broad stylistic treatment. |
| Mid Upsampling (Detail Generation) | FLOAT | 1.00-2–2 | Middle single-stream blocks. Detail generation. |
| Late Upsampling (Final Textures) | FLOAT | 1.00-2–2 | Final single-stream blocks. Fine texture, grain and skin detail. |
| Final Output Layer (Latent Projection) | FLOAT | 1.00-2–2 | diffusion_model.final_layer — projection back to latent space. |
| Other Tensors | FLOAT | 1.00-2–2 | UNet tensors outside the three stages (time_embed, label_emb, out.*). |
| Text Encoder | FLOAT | 1.00-2–2 | CLIP-L / T5 text encoder weights. Lower this to keep a LoRA's look while weakening its trigger words. |
| clipopt | CLIP | Optional. Leave unconnected to patch the model only. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | Model with the block-weighted LoRA applied. |
| CLIP | CLIP | CLIP with the text-encoder portion of the LoRA applied. |
| info | STRING | Per-block report: weight, tensors found and tensors actually patched. |