Nodes/WorkflowX-Configurator/Load Lora PickerX
ComfyUI Node

Load Lora PickerX

Load LoRAs that live outside your loras folder

By haroonaslam·Created 5 months ago·Updated 3 days ago· 11
Load Lora PickerX
  • model
  • clip
  • MODEL
  • CLIP
  • trigger_words
  • loaded_loras

If you train your own LoRAs, you already know the last checkpoint is rarely the best one. The one you want is usually sitting at epoch 6 or step 4000 in your trainer's output folder, three directories away from ComfyUI/models/loras. Load Lora PickerX is built for exactly that file: point it at a LoRA anywhere on disk, load it in place, and flip between sibling training checkpoints in the same row.

What it actually is

A stacking LoRA loader - the same job as rgthree's Power Lora Loader. You add rows with their own toggle, weight and CLIP weight, and the stack applies top to bottom. The difference is where the files come from: Power Lora Loader and WorkflowX's own LoraX pull from ComfyUI's scanned LoRA list, which your training output folder isn't in. This one opens a file dialog and takes whatever you hand it.

How it works

Under the hood it's the boring, correct path: resolve the file, run it through comfy.utils.load_torch_file(..., safe_load=True), hand it to comfy.sd.load_lora_for_models - the same code the stock LoraLoader uses. Same math as chaining native loaders, applied in row order, skipping any row with both strengths at 0. Two details from the source: with nothing wired into the optional clip input the node forces strength_clip to 0 and patches only the model, so the CLIP column quietly stops mattering; and IS_CHANGED fingerprints file size plus mtime, so retraining over the same filename won't feed you stale weights from cache.

The epoch picker, which is the real feature

Click Pick LoRA, choose a file, and the node scans its immediate directory - same extension only - for related checkpoints. Names with epoch, ep, step, checkpoint or ckpt plus a number count, as do trailing numbers of three digits or more, grouped by base name. You get labels like Epoch 6 and Step 4000, and the unsuffixed file shows as Final. Click the version box to switch families - the practical way to hunt the sweet spot every training write-up tells you to look for, since the last epoch usually isn't the best. Short version-style names like hero-v2.safetensors are deliberately ignored, and if nothing related turns up the selector greys out and reads Single.

It rescans on workflow load and when you open the selector. If a file later moves or is deleted, the row errors instead of silently swapping in another epoch.

Inputs and outputs

Only two sockets. model (required) is your base diffusion model; clip (optional) is the text encoder you want patched. Everything else is on the node face: On / LoRA file / Version / Model / CLIP / Remove per row, a + Pick LoRA button, and a row right-click menu with Enable, Choose another file, Refresh epochs, Move Up/Down and Remove.

Four outputs. MODEL goes to your sampler. CLIP goes to CLIPTextEncode, and only does anything if you wired a CLIP in. loaded_loras is a readable audit of the applied stack with its strengths - handy piped into a note when comparing runs. And trigger_words is a STRING of whatever the rows carry: be honest about this one, the picker's own UI never fills that field, so it comes out empty unless something else did. Fetching trigger words from CivitAI is sibling node LoraX's job.

Install

ComfyUI Manager → search WorkflowX Configurator, or by hand:

cd ComfyUI/custom_nodes
git clone https://github.com/haroonaslam/WorkflowX-Configurator

Restart ComfyUI and hard-refresh the browser - the node face is a custom canvas widget, and a stale frontend renders it wrong. The pack's requirements.txt is only pyworld, numpy and scipy; pyworld exists for the audio Voice ChangerX node, so if Manager's dependency step chokes on it this node is unaffected. No model downloads, no API keys.

Where people get burned

The picker is Windows-only. It shells out to a PowerShell WinForms file dialog, and the route rejects non-loopback requests - so you also have to be on the machine running ComfyUI. From a laptop browsing a remote server, or on Linux/macOS, Pick LoRA errors out. There's no typed path field either: the row stores a load name or an absolute path, so the fallback is editing that value in the workflow JSON by hand. Saved workflows still run as long as the path resolves.

Absolute paths don't travel. Files inside a registered ComfyUI LoRA folder are saved as a relative load name and stay portable; files anywhere else are saved as absolute paths, making the workflow yours alone. If you share workflows, move the LoRA into models/loras - or register your training output folder as a LoRA path in extra_model_paths.yaml and it'll be stored relatively. That's what I'd set up if I train often.

Single when you expected epochs. The scan is one directory, one extension, and short version-style numbers are ignored. Trainers that write a .pt alongside .safetensors won't group the way you expect, and anything outside .safetensors, .ckpt, .pt, .bin is refused outright.

The ordinary LoRA traps still apply on top of that: an SDXL-lineage LoRA won't behave on a Flux or Z-Image base, and a missing trigger word looks exactly like a broken loader.

CategoryWorkflowX/Loaders

Inputs (2)

NameTypeDefaultDescription
modelMODEL—
clipoptCLIP—

Outputs (4)

NameTypeDescription
MODELMODEL—
CLIPCLIP—
trigger_wordsSTRING—
loaded_lorasSTRING—