πΈ Tag to Description (Ollama)
Extract two characters' appearances into natural-language descriptions with Ollama
- description_a
- description_b
- names
- debug
If you build character workflows - especially the pack's character-library or Duo Character Builder style setups - you eventually hit the translation problem: your characters are stored as tag lists ("short_hair, red_hair, green_eyes"), but a natural-language description reads better and encodes better on LLM-based text encoders. πΈ Tag to Description (Ollama) is the node that does that extraction for two characters at once, turning each one's tag pile into a clean appearance description, all through a local Ollama model.
Here's what makes it different from the pack's other Ollama node. πΈ LLM Prompt Refiner rewrites whole-scene prompts. Tag to Description does the narrower, character-builder-specific job: it takes the tags for character A and character B, strips out scene/group metadata (2girls, solo, group, siblings...), and asks the model to produce a trait-list phrase that completes "The one on the left/right has β¦" - hair length and colour, eye colour, body descriptors, and nothing else. The system prompt is strict about it: only what's in the tags, no invented glasses, no clothing guesses, no expressions, and explicit colour tags always beat a character name's connotation (if the tags say purple_hair, you get purple hair even for Raven).
The wiring is built for the character-library flow. The two required text inputs are char_a_tags and char_b_tags, with tooltips suggesting you wire them from a πΈ Library node's positive output. The optional char_a_name / char_b_name inputs are the reliability trick: wire the Library's name outputs here and those names are used directly in the names output ("Name1 & Name2") rather than being guessed from the tag soup - the tooltip calls this "more reliable than tag extraction."
Outputs:
description_a- wire tochar_a_NLon the Duo Character Builder.description_b- wire tochar_b_NLon the Duo Character Builder.names- both names joined as "Name1 & Name2".debug- per-character debug info.
Settings: model (default mistral, must be pulled via ollama pull mistral) and seed for reproducibility (same seed + same tags = same output).
The whole thing rides on Ollama running locally - the node talks to http://localhost:11434/api/generate with no API key, so it's free per call and private. That's the same local-LLM pattern the KB's LLM-in-ComfyUI doc describes as the community's default for this job: a small uncensored model used as a worker that never touches the internet. An 8B-class model won't write better English than a frontier API, but for a constrained "convert these 40 tags to a trait list" job, it's more than enough - and the strict prompt is doing most of the work.
Installing it
Install the pack, then Ollama:
- Pack: ComfyUI Manager β search Frog Node Pack β install, or
cd ComfyUI/custom_nodes && git clone https://github.com/RabbitThatIsPink/FrogNodePack, restart, hard-refresh. - Ollama: install and run locally (
ollama serve). - Model:
ollama pull mistral(or change themodelfield to something already pulled).
No pip dependencies - the node uses plain HTTP to Ollama, so there's nothing to add on the ComfyUI side.
Common issues
The predictable trio: Ollama not running (connection errors at queue time), model not pulled (ollama pull mistral), and - the one that confuses people - both characters' tags wired to the same source, so A and B get identical descriptions. Check the debug output to see what each side received. If descriptions come out bloated or include scene words, the node strips a hardcoded list of group/scene tags before sending, but unusual phrasings can slip through; the strict "only what's in the tags" prompt is the safety net, so keep temperature low if you want maximal fidelity over creativity.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| char_a_tags | STRING | Tags for Character A. Wire from a πΈ Library 'positive' output. | |
| char_b_tags | STRING | Tags for Character B. Wire from a πΈ Library 'positive' output. | |
| model | STRING | mistral | Ollama model name (must be pulled via 'ollama pull <name>'). |
| seed | INT | 00β4294967295 | Seed passed to the model for reproducibility. |
| char_a_nameopt | STRING | Wire from πΈ Library 'name' output for Character A. Used directly in the names output β more reliable than tag extraction. | |
| char_b_nameopt | STRING | Wire from πΈ Library 'name' output for Character B. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| description_a | STRING | Description for Character A β wire to char_a_NL on Duo Character Builder. |
| description_b | STRING | Description for Character B β wire to char_b_NL on Duo Character Builder. |
| names | STRING | Both character names joined as 'Name1 & Name2'. |
| debug | STRING | Debug info for both characters. |