Nodes//Nougan Character Chat πŸ’¬
ComfyUI Node

Nougan Character Chat πŸ’¬

SillyTavern cards inside ComfyUI β€” chatting with the LLM you already loaded

By WinnouganΒ·Created 3 months agoΒ·Updated about 16 hours agoΒ· 10
Nougan Character Chat πŸ’¬
  • clip
  • image
  • audio
  • video
  • reply
  • chat_log
  • character_name
  • description
  • avatar
  • history_json
β—„characterβ–Ύβ–Ί
β—„user_nameUserβ–Ί
β—„max_length400β–Ί
β—„temperature0.80β–Ί
β—„top_p0.95β–Ί
β—„top_k64β–Ί
β—„min_p0.05β–Ί
β—„repetition_penalty1.05β–Ί
β—„seed0β–Ί
β—„thinkingfalseβ–Ί
β—„context_messages40β–Ί
β—„card_pathβ–Ί
β—„actionnoneβ–Ί
β—„user_messageβ–Ί
β—„history_json[]β–Ί
β—„presence_penalty0.00β–Ί
β—„mtpautoβ–Ί
β—„video_max_frames8β–Ί
β—„system_promptβ€”β–Ί

Here's the thing about LLMs in ComfyUI: most people already have one loaded and don't think of it as an LLM. If you're running Qwen3.5 as a text encoder for a modern image or video model, there's a full chat model sitting in your models/text_encoders folder doing nothing between generations.

Nougan Character Chat πŸ’¬ borrows it. Drop a SillyTavern-style character card in, type a message, and the character answers on the node. No LM Studio, no API key, no second app in the background.

The distinction that decides everything

The KB is blunt about this one and so is the node: the LLM inside your checkpoint is a frozen encoder that turns your prompt into conditioning. The LLM you wire into the graph is a tool. This node is the second kind, run through ComfyUI's own text-generation API (clip.tokenize / clip.generate / clip.decode) - the same path the core Generate Text node uses. That's why the input is a CLIP.

It's built and tested around Qwen3.5 (a 9B, say), and the prompt is assembled in Qwen's ChatML format with <|im_start|> / <|im_end|> delimiters. Other model families may answer, but they may also leak their own chat markers into the reply. The node strips thinking tags and chat scaffolding before display, but it's fighting the model's habits - start with Qwen3.5 and you won't be debugging that.

What you actually get out of it

The chat panel is the fun part - avatars, *action* italics, message editing, regenerate, alternate-greeting swiping, a lorebook. The useful part is that the conversation is an output.

  • reply (STRING) - the latest message. Feed it into a prompt builder, or into an LLM-driven layout node.
  • chat_log (STRING) - the whole conversation as Name: message text.
  • character_name and description (STRING) - the card's name, and its description with {{char}} / {{user}} substituted.
  • avatar (IMAGE) - the card's PNG, or the avatar baked into a refmod.
  • history_json (STRING) - the raw history. This is how the chat survives a ComfyUI restart: it's saved with the workflow.

Turning description into an image prompt, or wiring avatar to a Preview Image so you remember who you're talking to, is the obvious first move. character_name makes a good filename prefix.

Cards, and the shortcuts

Character Card V1/V2/V3, as .png with the data embedded, as .json, or as a refmod - a .safetensors with the character in its header. Upload with ⬆ Card (it lands in ComfyUI/input/characters/) or drop files there and hit ↻. Botbooru is the author's suggested source, and any SillyTavern-compatible card works.

If you already have baked characters from Nougan Refmod Baker 🧬, they show up in the same dropdown as refmod:<name> and read instantly, because only the header is parsed - a multi-gigabyte hybrid file opens as fast as a 4KB one.

The settings a beginner touches

clip and character are the two that matter. After that:

  • max_length (400) - tokens per reply. Cut-off sentences live here.
  • temperature (0.8) / repetition_penalty (1.05) - creativity vs loops. A character who keeps saying the same thing wants 1.1.
  • context_messages (40) - how much recent history the model sees. More memory, more VRAM, slower turns.
  • thinking (off) - lets the model reason first; reasoning is discarded. Slower, occasionally smarter.
  • mtp (auto) - speculative decoding off the checkpoint's multi-token-prediction head. Does nothing without MTP weights, and it changes output for a given seed.

Installing it

cd ComfyUI/custom_nodes
git clone https://github.com/Winnougan/Nougan_Nodes
# restart ComfyUI

Or search Nougan in ComfyUI Manager. Check the console for [Nougan] βœ… Character Chat loaded., then hard-refresh the browser so nougan-character-chat-ui.js loads. You need a reasonably recent ComfyUI with the text-generation API - an older build will import the node and then fail at generation. No pip installs required.

Where people get burned

Every message queues the workflow. That's the design. Mute or bypass the chat node and the panel will happily let you type into the void and nothing will reply - "The chat node didn't run" in the docs, older than the pack itself.

The dropdown does nothing. card_path is still filled in; it overrides the dropdown by design. Click the βš™ and clear it.

"has no 'chara' / 'ccv3' text chunk". That PNG isn't a character card, or you re-saved it through something that stripped the metadata. Re-download the original.

The node disappeared after an update. It imports nougan_refmod_io.py; if that file isn't sitting beside it, nothing loads. Re-pull the pack rather than copying single files around.

No chat panel at all. The Python side loaded, the JS didn't. Hard refresh, and confirm the file is in web/.

CategoryNougan

Inputs (23)

NameTypeDefaultDescription
clipCLIPThe LLM (e.g. Qwen3.5 9B loaded as a text encoder / CLIP).
characterCOMBOCharacter card from ComfyUI/input/characters, or a refmod with a baked character (listed as refmod:<name>). Use the upload button on the node to add cards.
user_nameSTRINGUserWhat {{user}} is called in the card.
max_lengthINT40016–4096Max tokens per reply.
temperatureFLOAT0.800.01–2β€”
top_pFLOAT0.950–1β€”
top_kINT640–1000β€”
min_pFLOAT0.050–1β€”
repetition_penaltyFLOAT1.050–5β€”
seedINT00–18446744073709550000β€”
thinkingBOOLEANfalseLet the model reason before replying (slower). The reasoning is discarded.
context_messagesINT402–400How many of the most recent chat messages are sent to the model.
card_pathoptSTRINGOptional full path to a card (.png/.json) or a character refmod (.safetensors) anywhere on disk. Overrides the dropdown.
actionoptSTRINGnoneβ€”
user_messageoptSTRINGβ€”
history_jsonoptSTRING[]β€”
presence_penaltyoptFLOAT0.00-2–2Penalises tokens that have already appeared at all. Raise a little to nudge the character toward new topics.
mtpoptCOMBOautoSpeculative decoding with the checkpoint's multi-token-prediction head. No effect without MTP weights. auto adapts the draft depth; 2-5 pins it. Output differs from non-MTP output for the same seed.
video_max_framesoptINT81–64Most frames taken from a connected video. Each frame is processed like an image, so more frames = more VRAM and time.
imageoptIMAGEOptional. Connect Load Image. The character sees it with your newest message (a batch = several images).
audiooptAUDIOOptional. Connect Load Audio. Passed to the model with your newest message (only used if the loaded model supports audio).
videooptVIDEOOptional. Connect Load Video. Sampled into up to video_max_frames evenly spaced frames (about 1 per second) and shown as images.
system_promptoptSTRINGOptional. Replaces the card's own system prompt. Description, personality, scenario, lore and examples are still used.

Outputs (6)

NameTypeDescription
replySTRINGβ€”
chat_logSTRINGβ€”
character_nameSTRINGβ€”
descriptionSTRINGβ€”
avatarIMAGEβ€”
history_jsonSTRINGβ€”