Nodes/ComfyUI-COF/πŸ“ COF Personality
ComfyUI Node

πŸ“ COF Personality

A system prompt that ships with the character, not stuck in a text box

By yannsouetreΒ·Created 17 days agoΒ·Updated a day agoΒ· 1
πŸ“ COF Personality
  • cof
  • persona
  • language

The smallest node in the pack, and the one that switches genres

Images are only half a character. The other half is how she talks - and in a graph with an LLM in it, that half is a system prompt.

COF Personality takes the cof output and gives you the preset's personality as plain text plus the language(s) it's written for. Two outputs, no inputs beyond the wire. If you're building anything with an LLM node, a chat workflow, a captioner told to write as the character, or a TTS pipeline where the text has to sound like someone specific, this is where the voice comes from.

The context is worth stating because people conflate it with the other thing: the language model inside a checkpoint (T5 on Flux, Qwen3 on Z-Image) is a frozen encoder you don't control. This node feeds the other kind - the LLM you dropped into the graph as a node, the one that writes text before or alongside generation. That's a separate model doing a separate job, and a persona is exactly the payload it wants.

How it works

A .cof can hold personality variants. Each one is either a card - a JSON blob with description, personality, scenario and system_prompt fields - or a plain text block. The reader walks the preset's resolved personality list and concatenates:

  • description verbatim, with no lead-in;
  • personality prefixed Personality: ;
  • scenario prefixed Scenario: ;
  • system_prompt verbatim;
  • any plain text variants appended as-is.

Multiple variants are joined with a blank line between them. So what comes out is a readable, character-card-shaped document - close to the SillyTavern-style card format, if you've ever pasted one of those into a node - not a template with holes. Nothing is substituted at runtime; there's no name interpolation, no age injection. What's in the file is what you get.

The second output, language, is the deduplicated set of language fields on those variants, comma-joined - en, fr if the character ships bilingual. Take it seriously: if it says fr and your TTS node is English-only, you're about to generate gibberish with excellent prosody.

Inputs and outputs

Required: cof. That's the whole input surface.

  • persona - the concatenated text. Wire into the system-prompt input of your LLM node, or into a Preview Any while you're reading a file for the first time.
  • language - comma-separated language tags.

There's no "which personality" dropdown, because a preset carries the personality that belongs to it. Want a different personality? Change the preset on COF Load Character; every downstream COF node follows it.

Because both outputs are STRING, they compose with everything: a text-concatenate node to prepend scene direction ("reply in one short sentence"), a switch to swap between the file's persona and your own, or a Preview Any to diff two presets against each other. The persona output is also the right thing to feed a prompt-enhancer if you want the writing style to match the character.

Install

Part of the ComfyUI-COF pack, no extra Python packages - the project declares an empty dependency list, and there is no model download for this node.

cd ComfyUI/custom_nodes
git clone https://github.com/yannsouetre/ComfyUI-COF

Put .cof files in ComfyUI/models/cof/ or ComfyUI/input/cof/, restart, press R in ComfyUI after adding a new file. Nodes appear under COF. The bundled workflows/cof_preview.json wires this node to a Preview Any, which is genuinely the fastest way to see whether a file has any personality content at all.

Common issues

Empty persona. The preset has no personality variant, or its card is missing the fields the reader knows. Nothing errors - you just get an empty string, which will then quietly become an empty system prompt and a fully generic LLM reply. Check with Preview Any before blaming the model.

Both outputs are empty and you're sure the file has a card. Make sure the cof wire comes from the same loader whose preset you set. A preset is resolved at load time; the personality node reads the preset baked into the cof object, not the widget you're currently looking at on screen.

The persona reads like a spec sheet. That's what's in the file - a description, a personality line, a scenario. If you need behaviour ("answer in under 20 words, never break character"), add it with a text-concat node. Don't edit the archive.

Dialogue comes out in the wrong language. Check language first. Prompting around a persona written in French is more work than just picking a preset written in the language you want.

CategoryCOF

Inputs (1)

NameTypeDefaultDescription
cofCOFβ€”

Outputs (2)

NameTypeDescription
personaSTRINGβ€”
languageSTRINGβ€”