Nodes/comfyui-character-picker/Random Character Picker
ComfyUI Node

Random Character Picker

Stuck on who to draw? This node rolls a real character for you

By 1756141021·Created 3 months ago·Updated 3 months ago· 1
Random Character Picker
  • franchise_pool
  • prompt_tags
  • danbooru_tag
  • base_tag
  • franchise
seed0
moderandom
character_name
weightedtrue
min_posts0
top_n0

Out of ideas for who to draw? Random Character Picker is the two-minute fix. Drop it in, hit queue, and it hands you a real, named character from a curated pool of thousands of Danbooru-tagged characters across 27 anime and game franchises - Fate, Azur Lane, Arknights, Blue Archive, Umamusume, Nikke, and a stack of others - plus a prompt string you can wire straight into CLIP Text Encode. No API calls, no model files, no key. It's a tiny utility, and it earns its place in any workflow where you want a known character instead of an anonymous wildcard.

This is the thing that separates it from the usual wildcard randomizer. A wildcard node picks random words from a list; this node picks characters that actually exist in the Danbooru vocabulary, and it tags them correctly. That matters more than it sounds, because models trained on Danbooru learned that exact vocabulary - a character tag like ganyu (genshin impact) resolves to an actual person, and the copyright tag tells the model which series they're from. If your checkpoint is Illustrious or NoobAI family, this output is exactly what those models speak. On a natural-language model like Flux it'll do far less; the tags are the point.

How it works

The pack ships a data/characters.csv (about 8,000 curated rows, from a ~15,000-row raw scrape) that loads into memory when ComfyUI starts. Every entry is a danbooru tag with its base character, whether it's a variant/skin, its franchise, and a Danbooru post count. When you run the node, pick() filters to the franchises you've left active, applies your filters, then rolls:

  1. Pick a franchise first - equal weight per franchise, which is the pack's one genuine quirk. Fate's ~2,800 characters get the same chance as Elden Ring's 14. If that feels wrong for your use case, that's what top_n and the franchise toggles are for.
  2. Pick a character inside it - weighted by Danbooru post count by default, so popular characters show up more often. Flip weighted off for a fair coin.
  3. Output - base tag, plus the variant tag if you hit a skin, plus the franchise copyright tag, escaped and comma-separated.

The seed is deterministic, so the same seed always gives the same character. The node's IS_CHANGED always fires, though, so it re-rolls every queue if you've set the seed widget to randomize.

The inputs that matter

  • franchise_pool - the custom widget. It's a searchable list (Chinese or English, so searching "蔚蓝" or "blue archive" both work) with All/None buttons, live character counts, and a running summary. Click a franchise to toggle it off. This is the input you'll actually fiddle with.
  • seed - set the widget to randomize for a fresh character every run, or lock a number to pin one.
  • mode / character_name - switch to specify and type a name for a fuzzy match instead of a random roll.
  • weighted, min_posts, top_n - the taste dials. min_posts filters out characters with few total posts (base + variants summed), top_n keeps only the N most popular base characters per franchise.

Outputs: prompt_tags is the one that matters - feed it into your positive prompt. danbooru_tag and base_tag are the raw picked tags, and franchise is the franchise name, handy if you want to branch on it.

Installing it

ComfyUI Manager (search "comfyui-character-picker"), or the old-fashioned way:

cd ComfyUI/custom_nodes
git clone https://github.com/1756141021/comfyui-character-picker

Restart ComfyUI and it appears as Random Character Picker under the character category. The best part: there are no dependencies to worry about. No requirements.txt, no torch imports, no model downloads - just the standard library and a CSV. It can't break your environment.

Where people get tripped up

  • All-franchises-off returns four empty strings, which is easy to misread as a bug. It's not - it's you toggling everything off. The widget's summary line shows how many are active.
  • specify mode doesn't error on a miss. Type something unrecognized and prompt_tags comes back literally as Not found: your text - which will happily become part of your prompt if you don't notice.
  • Editing the CSV to add characters works, but each new franchise also needs an entry in the _FRANCHISE_TO_COPYRIGHT map in nodes/random_character_picker.py, or you'll get no copyright tag. And restart ComfyUI after editing - the CSV is loaded at startup.
  • It's a character picker, not a consistency tool. Re-rolling with a new seed gives you a new character; if you want the same character across a batch, that's a LoRA job, a separate problem entirely.

For a niche utility, it's thoughtfully built - the bilingual search, the variant/base handling, and the ready-to-paste output all work exactly as advertised.

Categorycharacter

Inputs (7)

NameTypeDefaultDescription
franchise_poolFRANCHISE_POOL[{"name": "Elden Ring", "copyright": "elden_ring", "count": 14, "active": true}, {"name": "Fate", "copyright": "fate", "count": 2859, "active": true}, {"name": "Limbus Company", "copyright": "limbus_company", "count": 13, "active": true}, {"name": "偶像大师", "copyright": "idolmaster", "count": 17, "active": true}, {"name": "偶像大师CG", "copyright": "idolmaster_cinderella_girls", "count": 48, "active": true}, {"name": "偶像大师SC", "copyright": "idolmaster_shiny_colors", "count": 31, "active": true}, {"name": "别当欧尼酱了", "copyright": "onii-chan_wa_oshimai!", "count": 13, "active": true}, {"name": "妮姬", "copyright": "nikke", "count": 260, "active": true}, {"name": "孤独摇滚", "copyright": "bocchi_the_rock!", "count": 13, "active": true}, {"name": "学园偶像大师", "copyright": "gakuen_idolmaster", "count": 17, "active": true}, {"name": "少女前线", "copyright": "girls'_frontline", "count": 641, "active": true}, {"name": "少女前线2", "copyright": "girls'_frontline_2:_exilium", "count": 68, "active": true}, {"name": "异环", "copyright": "neverness_to_everness", "count": 13, "active": true}, {"name": "明日方舟", "copyright": "arknights", "count": 992, "active": true}, {"name": "电锯人", "copyright": "chainsaw_man", "count": 28, "active": true}, {"name": "碧蓝幻想", "copyright": "granblue_fantasy", "count": 244, "active": true}, {"name": "碧蓝航线", "copyright": "azur_lane", "count": 1298, "active": true}, {"name": "终末地", "copyright": "arknights:_endfield", "count": 30, "active": true}, {"name": "绝区零", "copyright": "zenless_zone_zero", "count": 56, "active": true}, {"name": "葬送的芙莉莲", "copyright": "sousou_no_frieren", "count": 19, "active": true}, {"name": "蔚蓝档案", "copyright": "blue_archive", "count": 454, "active": true}, {"name": "赛马娘", "copyright": "umamusume", "count": 597, "active": true}, {"name": "迷宫饭", "copyright": "dungeon_meshi", "count": 28, "active": true}, {"name": "重返未来1999", "copyright": "reverse:1999", "count": 156, "active": true}, {"name": "间谍过家家", "copyright": "spy_x_family", "count": 15, "active": true}, {"name": "鸣潮", "copyright": "wuthering_waves", "count": 77, "active": true}]
seedINT00–18446744073709550000Random seed. Set widget to 'randomize' for auto-change each run.
modeoptCOMBOrandomrandom: pick by seed. specify: pick by character_name.
character_nameoptSTRINGPick a specific character (specify mode). Fuzzy match on danbooru_tag.
weightedoptBOOLEANtrueWeight by Danbooru post count. On: popular characters appear more often. Off: equal chance.
min_postsoptINT00–100000Filter out characters with fewer total posts (base + variants). 0 = no filter.
top_noptINT00–1000Keep only top N characters per franchise by post count. 0 = no limit.

Outputs (4)

NameTypeDescription
prompt_tagsSTRINGComma-separated prompt tags: base, variant (if any), franchise copyright.
danbooru_tagSTRINGThe picked danbooru tag (base or variant).
base_tagSTRINGBase character tag.
franchiseSTRINGFranchise name.