Nodes/Kinburg-Nodes/Local LLM Chat (GGUF)
ComfyUI Node

Local LLM Chat (GGUF)

Chat With Your Local GGUF Inside ComfyUI — Before You Generate a Single Pixel

By Kinburg·Created 3 months ago·Updated 6 days ago· 1
Local LLM Chat (GGUF)
  • persona_1
  • image
  • persona_2
  • persona_3
  • persona_4
  • persona_5
  • persona_6
  • text
  • help
unload_on_approvetrue
chat_state

The most useful LLM in ComfyUI isn't the one that writes a prompt automatically - it's the one you talk to before generation, the one that lets you discuss an idea until it's ready. Local LLM Chat (GGUF) is a self-contained multi-turn chat window as a node. Type, send, get a streamed reply, iterate. When you're happy, hit Approve and the last reply flows downstream into the graph. It runs your local GGUF, it costs nothing per call, and it blocks the branch below it while you chat - which is the whole trick.

The persona system

The node is deliberately bare: chat window, message field, context meter, Send / Approve / Clear. Everything about how to generate comes through persona_1, which takes a whole Local LLM Settings (GGUF) bundle. Wire only that and it's an ordinary single-model chat. Wire persona_2persona_6 and a chip row appears - each persona brings its own model, sampling and system prompt. One might be a prompt-writer, one a harsh critic, one a director. Clicking a chip selects it; Send is the only trigger. Personas share one history, so the critic sees the whole discussion; when the writer speaks, its replies are prefixed with its name so it doesn't mistake the critic's turns for its own.

Send vs Approve

Two buttons, two meanings, and the difference is the node's superpower:

  • 📨 Send - runs the workflow up to the chat node, generates a reply streamed live into the bubble, and blocks everything downstream with an ExecutionBlocker while you chat. Nothing past the node runs. Reasoning shows in an open thinking block, then collapses into a toggle; only the answer goes downstream.
  • ✅ Approve - runs with the gate open: skips generation and emits the last reply on the text output, so it flows downstream immediately. No regeneration, any seed.

That gating is what makes this a workflow tool rather than a toy: you iterate on the idea freely, and only commit a draft to the pipeline when it's right.

The details that make it usable

Pasting a picture works - Ctrl+V, drop a file, or the 📎 - and it goes out with your next message (needs an mmproj on the Settings node). It's not a graph link: the image is saved to input/kinburg_chat/ and referenced by name, so Send never re-runs an image branch to fetch it. From the next turn the pixels are just a [image] marker in context, so long picture conversations stay cheap.

You can edit the conversation - hover any bubble for copy/edit/resend/delete. Stop a reply mid-stream and keep what it wrote (⏹) or discard it (✕). Archive older turns into a summary when the window crowds. The context meter under the chat shows KV-cache fill after each turn (amber past 75%, red past 90%), and when a reply stops at max_tokens, Send with an empty box continues it from where it cut off. The whole conversation persists in a single chat_state JSON input in the workflow, so it survives saves. unload_on_approve (on by default) frees the LLM when you Approve, giving the image model downstream room.

Outputs: text (the approved reply, gated) and a help cheat-sheet.

Install

Pack install via ComfyUI Manager (search "Kinburg-Nodes") or git clone. Needs llama-cpp-python - Manager runs install.py automatically, or run <ComfyUI>/.venv/Scripts/python.exe <ComfyUI>/custom_nodes/Kinburg-Nodes/install.py. If your chat templates ever reject a persona turn (a mistral-family quirk with no-user-message turns), the ⚙ trigger field is the way out. This is the node the pack's whole config-bundle design exists for - one Settings node, several personas, one chat.

CategoryKinburg-Nodes/LLM

Inputs (9)

NameTypeDefaultDescription
persona_1KINBURG_LLM_CONFIGPersona #1: wire a whole 'Local LLM Settings (GGUF)' here — its system prompt, model and sampling become the config for every turn this persona speaks. A chip for it appears in the chat as soon as a second persona is wired. Keep the loader fields (model, n_ctx, n_gpu_layers, flash_attn, kv_cache_type) identical across personas and switching between them costs no model reload. This one is also the node's default config.
imageoptIMAGEOptional image for vision, attached to every turn while it stays connected. Prefer pasting or dropping a picture straight into the chat window instead — that attaches it to ONE turn and doesn't re-run this branch on every message. Needs an mmproj on the active Settings node either way.
persona_2optKINBURG_LLM_CONFIGPersona #2: wire a whole 'Local LLM Settings (GGUF)' here — its system prompt, model and sampling become the config for every turn this persona speaks. A chip for it appears in the chat as soon as a second persona is wired. Keep the loader fields (model, n_ctx, n_gpu_layers, flash_attn, kv_cache_type) identical across personas and switching between them costs no model reload.
persona_3optKINBURG_LLM_CONFIGPersona #3: wire a whole 'Local LLM Settings (GGUF)' here — its system prompt, model and sampling become the config for every turn this persona speaks. A chip for it appears in the chat as soon as a second persona is wired. Keep the loader fields (model, n_ctx, n_gpu_layers, flash_attn, kv_cache_type) identical across personas and switching between them costs no model reload.
persona_4optKINBURG_LLM_CONFIGPersona #4: wire a whole 'Local LLM Settings (GGUF)' here — its system prompt, model and sampling become the config for every turn this persona speaks. A chip for it appears in the chat as soon as a second persona is wired. Keep the loader fields (model, n_ctx, n_gpu_layers, flash_attn, kv_cache_type) identical across personas and switching between them costs no model reload.
persona_5optKINBURG_LLM_CONFIGPersona #5: wire a whole 'Local LLM Settings (GGUF)' here — its system prompt, model and sampling become the config for every turn this persona speaks. A chip for it appears in the chat as soon as a second persona is wired. Keep the loader fields (model, n_ctx, n_gpu_layers, flash_attn, kv_cache_type) identical across personas and switching between them costs no model reload.
persona_6optKINBURG_LLM_CONFIGPersona #6: wire a whole 'Local LLM Settings (GGUF)' here — its system prompt, model and sampling become the config for every turn this persona speaks. A chip for it appears in the chat as soon as a second persona is wired. Keep the loader fields (model, n_ctx, n_gpu_layers, flash_attn, kv_cache_type) identical across personas and switching between them costs no model reload.
unload_on_approveoptBOOLEANtrueFree the LLM from VRAM when you press ✅ Approve, so the image model downstream has room. Turn off to keep chatting at full speed when nothing heavy follows.
chat_stateoptSTRINGThe conversation, managed by the chat window. You don't edit this directly.

Outputs (2)

NameTypeDescription
textSTRING
helpSTRING