LC Model Info ℹ️
The checkpoint tells you what's in it, if you know where to look
- model
- model
- info
- loras
- metadata
You downloaded a merge called krea2_something_v3_FIXED_final.safetensors. The CivitAI page has forty pretty pictures and no description, and you'd quite like to know what's in the thing before you spend twenty minutes sampling with it. LC Model Info answers that in about a second - because the answer is usually already inside the file.
What it is, and why you'd bother
Model files aren't opaque blobs. A .safetensors file is a JSON header followed by raw tensor bytes, and that header is where tools stash their notes: model-card fields, a Kohya LoRA's training parameters, trigger tags, and - the good part - the workflow of whoever made the file. Merge a checkpoint in ComfyUI with a save node that writes metadata and the entire merge graph rides along: base models, every LoRA with its strength, the merge nodes. Same trick as ComfyUI baking your workflow into the output PNG, one layer deeper.
Three moments you reach for it: a downloaded merge you want to see inside, a LoRA whose page lists no trigger words, and a workflow someone handed you where you'd rather not trace the model wire backwards by eye. That last one is why this is a node and not a viewer app - it reads the wire, not just the file. LoRAs you apply at runtime show up too, with strengths, because the report is built from your current graph.
How it works
It follows the wire. Your graph goes to a small server route, and the Python side walks upstream from this node's model input through every input whose name contains "model" - Lora Loaders, merges, model patches, the LC Model Optimizer. The model itself is never touched; it comes out the other side untouched.
Then it reads headers, never weights. For safetensors that's eight bytes (a header length), then that much JSON. The dtype mix printed next to the file size - BF16 92%, F32 8% - is arithmetic on the tensor table's byte offsets, not a load. GGUF files get their key/value block read instead, which is where the quant type (Q4_K_M, Q8_0, BF16) and architecture come from.
It also filters to the files that are the model: only things in checkpoints, diffusion_models / unet / unet_gguf, and loras count, so text encoders and VAEs riding the same wire are ignored on purpose.
What prints is the LoRAs on the wire with their strengths, then per file: size, dtype mix, model-card fields, a "Built with" block decoded from the embedded workflow (bases, LoRA: name @ 0.7, merges, sampler), and for Kohya-trained LoRAs a training block - base, rank/alpha, steps, epochs, resolution, learning rate - plus the top tags from the metadata.
The input and outputs that matter
One input: model (MODEL) - any model output at all, a checkpoint loader, a LoRA loader, a merge. Nothing to configure: no file picker, no mode switch. Four outputs:
model- the same model, untouched. Chain it into your sampler; this is a pass-through, not a detour.info- the report, as a string. Send it to Show Text or a save-text node when you want it in the run log.loras- every LoRA found, one per line, deduped: applied on this wire and baked into the files.metadata- every header field of every file as JSON, embedded workflow included. Good for saving or diffing two checkpoints; don't display it casually, a merged checkpoint's embedded workflow is enormous.
The report draws on the node as soon as it's wired, no queue needed, and refreshes when you connect it, when a workflow loads, when anything upstream changes, and after a run.
Install
Manager: search ComfyUI_LC123_nodes. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC123_nodes.git
Restart, then Ctrl+F5. Two things worth knowing: there's no requirements.txt - everything it needs (torch, numpy) ships with ComfyUI, so no pip step - and __init__.py must sit directly inside custom_nodes/ComfyUI_LC123_nodes/, not one folder deeper. If nothing loads, that nesting is almost always why.
Common issues
"Wire a MODEL output into this node." Nothing connected, or the wire is dead upstream. It reads the graph, so a muted loader means no files to find.
"No model file found on this wire: the file isn't on disk yet…" The graph names a file the node can't match to anything on your disk - usually a loader whose filename lives somewhere this node can't parse, or a ★ Recommended pick from the LC Model Optimizer that downloads on first run. Run once and it resolves. You may also see <file>: not found on disk under it, which just means you renamed or moved something.
"this format keeps no readable header." You wired something other than safetensors or GGUF. Legacy .ckpt files are pickles with no JSON header, so there's nothing to read without loading the weights, which this node won't do.
"No metadata in this file (stripped, or the tool that saved it wrote none)." The honest empty answer. Plenty of merges came from tools that never embedded a graph, and headers get scrubbed at various points, the same way re-encoding an image deletes its workflow. Size and dtype mix always work; the rest is genuinely unknown.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | Any diffusion model output: a loader, a LoRA loader, a merge. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| model | MODEL | The same model, untouched. |
| info | STRING | The report shown on the node. |
| loras | STRING | Every LoRA found: on this wire and baked into the files, one per line. |
| metadata | STRING | All header fields of every file, as JSON (the embedded workflow included). |