Nodes/Frog Node Pack/🐸 Tag to Description (Ollama)
ComfyUI Node

🐸 Tag to Description (Ollama)

Extract two characters' appearances into natural-language descriptions with Ollama

By RabbitThatIsPinkΒ·Created 3 months agoΒ·Updated 24 days agoΒ· 1
🐸 Tag to Description (Ollama)
    • description_a
    • description_b
    • names
    • debug
    β—„char_a_tagsβ€”β–Ί
    β—„char_b_tagsβ€”β–Ί
    β—„modelmistralβ–Ί
    β—„seed0β–Ί
    β—„char_a_nameβ€”β–Ί
    β—„char_b_nameβ€”β–Ί

    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 to char_a_NL on the Duo Character Builder.
    • description_b - wire to char_b_NL on 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:

    1. Pack: ComfyUI Manager β†’ search Frog Node Pack β†’ install, or cd ComfyUI/custom_nodes && git clone https://github.com/RabbitThatIsPink/FrogNodePack, restart, hard-refresh.
    2. Ollama: install and run locally (ollama serve).
    3. Model: ollama pull mistral (or change the model field 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.

    Category🐸 Node Pack/Utility

    Inputs (6)

    NameTypeDefaultDescription
    char_a_tagsSTRINGTags for Character A. Wire from a 🐸 Library 'positive' output.
    char_b_tagsSTRINGTags for Character B. Wire from a 🐸 Library 'positive' output.
    modelSTRINGmistralOllama model name (must be pulled via 'ollama pull <name>').
    seedINT00–4294967295Seed passed to the model for reproducibility.
    char_a_nameoptSTRINGWire from 🐸 Library 'name' output for Character A. Used directly in the names output β€” more reliable than tag extraction.
    char_b_nameoptSTRINGWire from 🐸 Library 'name' output for Character B.

    Outputs (4)

    NameTypeDescription
    description_aSTRINGDescription for Character A β€” wire to char_a_NL on Duo Character Builder.
    description_bSTRINGDescription for Character B β€” wire to char_b_NL on Duo Character Builder.
    namesSTRINGBoth character names joined as 'Name1 & Name2'.
    debugSTRINGDebug info for both characters.