Nodes/Kinburg-Nodes/Local LLM Model Info πŸ”
ComfyUI Node

Local LLM Model Info πŸ”

Read a .gguf's mind before you load it

By KinburgΒ·Created 3 months agoΒ·Updated 2 days agoΒ· 1
Local LLM Model Info πŸ”
    • report
    • json
    β—„modelβ–Ύβ–Ί
    β—„model_pathβ–Ί

    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.

    CategoryKinburg-Nodes/LLM

    Inputs (2)

    NameTypeDefaultDescription
    modelCOMBOThe .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_pathSTRINGFull path to a .gguf, used when 'model' is the placeholder. Surrounding quotes are stripped.

    Outputs (2)

    NameTypeDescription
    reportSTRINGβ€”
    jsonSTRINGβ€”