Local LLM Model Info π
Read a .gguf's mind before you load it
- report
- json
A GGUF file is more than quantized weights. Tucked into its header are the architecture, the context length the model was trained for, the sampling values its authors recommend - and, most interestingly, the chat template, whose variables are the reasoning controls of a modern model. enable_thinking, reasoning_effort: those aren't things you set generically; they're template variables that only exist if the model's own file says they do. Local LLM Model Info π reads all of that and tells you, before you've loaded a single weight.
That's the niche, and it's a genuinely useful one. Reasoning-era chat models are picky in a way that varies per family. On a Qwen3-with-thinking quant, reasoning_effort accepts a specific set of values and has a specific default. On a Gemma-4, the template doesn't read reasoning_effort at all - the widget for it is dead weight, and this node's report says so instead of letting you set something inert. That's the kind of thing you otherwise discover after ten minutes of scratching your head about why a setting isn't doing anything.
How it works
The clever bit is that it reads only the key/value block at the very front of the file - a few hundred kilobytes, never the tensor index, never a weight. It hand-rolls the parser instead of using the gguf library because gguf.GGUFReader takes about 7 seconds on a 17 GB model, all of it spent building views over hundreds of tensors this node has no use for; a dropdown that stalls seven seconds isn't a dropdown. Results are cached per file path, mtime and size.
The template analysis is equally direct. To find which controls a model honours it parses the chat template's Jinja AST and lists the undeclared variables it reads - that's a fact, not a guess. To find which reasoning_effort values are accepted, it renders the template with each candidate and sees which renders don't raise (Qwen3.5/3.8's template validates the value itself); the candidate that matches a bare render is the model's own default. No per-family hardcoding, so a model nobody has shipped before gets tested for free.
Inputs, outputs, and what to do with it
Two inputs, both simple: model (a dropdown of the .ggufs in ComfyUI/models/llm) or model_path (a full path when the dropdown is the placeholder - surrounding quotes are stripped). Outputs are report, the human-readable text, and json, the same data as structured JSON you could parse downstream. Loads no weights and touches no VRAM, so it works on a model you literally don't have room for. An example report:
Local LLM Model Info - Qwen3.8-27B-...-Q4_K_P.gguf
qwen35 Β· 27B Β· 65 layers
trained context: 262 144 tokens (n_ctx costs VRAM - raise it deliberately)
reasoning_effort: low, medium, xhigh (its default: xhigh)
enable_thinking: read Β· leaving it unset means on
Where it earns its keep
The same reading drives the pack's Local LLM Settings (GGUF) node directly: pick a model and the reasoning_effort dropdown narrows to the values that model takes, and "Apply model defaults" writes the file's own recommended temperature/top_p/top_k/min_p into the widgets. Note it's an explicit apply, not silent - those sampling values are part of ComfyUI's cache signature, and writing them behind your back would re-run your graph. Also note n_ctx is reported and never applied: these files are trained for 128kβ1M tokens, and setting that would exhaust VRAM instantly. Watch for the report flagging an mmproj - picking a vision projector as the model is an easy mistake, and the node calls it out.
Installing is the standard pack story - clone Kinburg/Kinburg-Nodes into custom_nodes or install via ComfyUI Manager, restart. This particular node needs nothing beyond the pack: no llama-cpp-python, no weights download, nothing loaded. The only real gotcha is ComfyUI's caching of dropdown lists - a model you drop in after ComfyUI starts won't be in the list until you refresh the node definitions, which is exactly why model_path exists. If it errors, it prefixes the report with a clear β - a truncated or still-downloading file, or a path that isn't a GGUF, is the usual cause.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | The .gguf to inspect, from ComfyUI/models/llm. Nothing is loaded β only the file's header is read, so this costs no VRAM and works on a model you have no room for. | |
| model_path | STRING | Full path to a .gguf, used when 'model' is the placeholder. Surrounding quotes are stripped. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| report | STRING | β |
| json | STRING | β |