Local LLM (GGUF)
Run a GGUF LLM Inside ComfyUI Without Leaving It Eating Your VRAM
- config
- image
- text
- thoughts
- finish_reason
- sys_tokens
- user_tokens
- output_tokens
- gen_seconds
- help
- thoughts_tokens
- answer_tokens
The standing community want in the LLM-in-ComfyUI space has been "run any GGUF directly as a node, no separate Ollama server in the loop." Local LLM (GGUF) is that: a text (and optionally vision) generation node that loads a .gguf with llama-cpp-python inside ComfyUI, runs your prompt, and hands you clean outputs - text, thoughts, token counts, the lot. The thing that makes it worth using over the dozens of other local-LLM nodes is VRAM discipline: inference runs in a separate worker process, so when it exits, the OS reclaims all of its memory. Perfect right before image generation, which is usually when you want an LLM's help the least.
The config bundle
You don't set model options on this node. Everything - model, system prompt, sampling, context, reasoning, output format - lives on the pack's Local LLM Settings (GGUF) node and arrives through the single config input (a KINBURG_LLM_CONFIG bundle). One Settings node can drive several LLM nodes at once, which is the point. The per-node things you set here:
user_prompt- the question. The one thing you'll change every run.image(optional) - for vision, needs anmmprojon the Settings node. Omit for text-only.system_override- connect-only; replaces the config's system prompt for this node only.grammar_override- connect-only; a GBNF grammar that forces structured output for this node.unload_after_run-config defaultfollows Settings,unload after runfrees VRAM after just this node,keep loadedstays warm.live_preview- streams tokens to aKinburg Live Lognode as they're written.
The outputs that matter
text is the answer; thoughts is the reasoning, split out separately (with strip_think on the Settings node, reasoning stays out of text entirely - the failure mode of an LLM leaking its scratch-work into your prompt is real, and this is the fix). Then the telemetry: sys_tokens, user_tokens, output_tokens, a thoughts_tokens/answer_tokens split of the output, gen_seconds, and finish_reason. There's also a help output - the pack's own cheat-sheet, wire it to a Preview-as-Text node to read it.
How it earns its place
The local-vs-API decision in this space mostly comes down to "small and obedient beats large and clever" - rewriting a rough idea into a structured prompt doesn't need a frontier model, and an 8B Qwen on your own card is uncensored, offline, and free per call. GGUF is what lets a chat model share a consumer card with a diffusion model at all - Q4_K_M is the accepted compromise for a 12GB card, and this node makes the quantized format a first-class citizen of the graph.
Install
Install the pack via ComfyUI Manager (search "Kinburg-Nodes"), or cd ComfyUI/custom_nodes && git clone https://github.com/Kinburg/Kinburg-Nodes. The LLM nodes need llama-cpp-python (CUDA build); Manager runs the pack's install.py automatically, which picks the wheel matching your torch's CUDA version. By hand with ComfyUI's Python:
<ComfyUI>/.venv/Scripts/python.exe <ComfyUI>/custom_nodes/Kinburg-Nodes/install.py
Drop your .gguf into ComfyUI/models/llm. The classic gotcha: the wheel's CUDA major must match torch's - a cu124 wheel on a CUDA-13 torch fails with cudart64_12.dll not found. The install script exists precisely to stop that from biting you.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| config | KINBURG_LLM_CONFIG | Wire a 'Local LLM Settings (GGUF)' node here — it carries the model, system prompt, sampling, reasoning, output format, etc. | |
| user_prompt | STRING | The prompt / question for the model. | |
| imageopt | IMAGE | Optional image(s) for vision — needs an mmproj on the Settings node (Vision Settings). Omit for a text-only run. | |
| system_overrideopt | STRING | Optional: replaces the config's system_prompt for this node (connect-only). Context still applies. | |
| grammar_overrideopt | STRING | Optional: a GBNF grammar (connect-only) that replaces the config's grammar and forces gbnf_grammar output for this node. | |
| unload_after_runopt | COMBO | config default | Free the model from VRAM after THIS node runs, without touching the shared config. 'config default' follows the Settings node; 'unload after run' frees VRAM (a different model runs next); 'keep loaded' stays warm (the same model runs next). |
| live_previewopt | BOOLEAN | false | Stream the generated text to a 'Kinburg Live Log' node as it's written, token by token. Grammar / JSON runs stream too, so a card built via grammar_override types itself out as the model constrains it. |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |
| thoughts | STRING | — |
| finish_reason | STRING | — |
| sys_tokens | INT | — |
| user_tokens | INT | — |
| output_tokens | INT | — |
| gen_seconds | FLOAT | — |
| help | STRING | — |
| thoughts_tokens | INT | — |
| answer_tokens | INT | — |