SAA Character Selector
Click a picture instead
- character_zh
- character_en
- origin
- prompt
- character_json
Every anime workflow has the same bottleneck: you know the character you want, but not the tag. If you run WAI-illustrious or anything in the Illustrious family, the model only speaks Danbooru - you need the exact character tag, and it's never the spelling you guessed. The SAA Character Selector is a picture book for that moment. It loads a big list of characters (Chinese and English names), shows them as clickable image cards right inside the node, and hands you the generation tag when you click. You stop googling "what's the tag for X" and just point at the face.
It's a niche tool, aimed at the Chinese-language anime community, and it's genuinely handy if you live in that world. If you're doing anything that isn't anime, skip it - there's nothing here for you.
How it works
On first load the node reaches out and downloads two files into its own folder:
wai_characters.csv- the character list, from thecharacter_select_stand_alone_appproject on GitHubwai_character_thumbs_v160.json- matching thumbnails, served from a HuggingFace dataset
That's it for dependencies. No requirements.txt, no model downloads, no API keys - everything else is the Python standard library plus ComfyUI's own server (aiohttp and PromptServer ship with ComfyUI). The files are only fetched once; after that they're cached on disk (they're gitignored, so an update won't wipe them). Clicking the in-node Reload button forces a re-download.
Behind the scenes, the node parses the CSV into a searchable index. The second column is the actual generation tag, so the prompt output is just that tag with parentheses escaped - \( and \) - so you can paste it straight into a positive prompt without it accidentally becoming weighting syntax. The "origin" (which series or game the character is from) is extracted from the parens in the names, with a cute safeguard: it skips things like "Windows 95" so a character tagged (...) (Windows 95) doesn't get filed under an operating system. Thumbnails are base64+gzip compressed inside that JSON and served to the UI as webp. You never touch any of that; it just works.
The inputs and outputs that matter
Despite three inputs and five outputs, this is a one-click node. The inputs exist mostly so the canvas remembers your state:
selected_character_id- set automatically when you click a card. Leave it alone.source_group- the origin dropdown, default "All". Filter by series here.auto_refresh_data- a trap. The README is explicit: it's kept for workflow compatibility and does nothing. Refresh with the Reload button instead.
The five string outputs wire straight into text nodes:
character_en/character_zh- the English and Chinese namesorigin- the source seriesprompt- the escaped tag, ready to drop into a positive promptcharacter_json- all of the above as a JSON string, handy if you want to stash metadata or parse it with another node
If you haven't clicked anything, character_json comes back as {"error": "no character selected"} - that's the node telling you to click a card, not a bug.
Install
The easy way is ComfyUI Manager - search "SAA Character Selector". Or clone it manually:
cd ComfyUI/custom_nodes
git clone https://github.com/wrt122311/ComfyUI_SAA_Character_Selector
Then restart ComfyUI. The node shows up under SAA/Character. The first time you add it to the canvas, expect a pause while the CSV and thumbnails download - that's normal, and the node shows a progress bar while it works.
Common issues
The pain points here are mostly about the data, not the code:
- No cards showing after install. The first download may have failed silently (the HTTP timeout is 120 seconds per file). Click Reload and watch the progress bar.
- "No character selected" JSON. You haven't clicked a card, or the workflow saved an empty
selected_character_id. Click something. - Prompt output looks weird with backslashes. That's intentional - the parens are escaped so the tag doesn't become a weighting token. Don't un-escape it before wiring it in.
- You want a character that isn't in the list. The dataset is what it is - it's the "wai" character list, tied to the WAI-illustrious scene. There's no built-in way to add your own characters, and the list only updates when the upstream project does and you hit Reload.
For a character-driven anime workflow it turns a minute of tag-hunting into one click, which is about the best trade you'll get out of a custom node.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| selected_character_id | STRING | — | |
| source_group | COMBO | All | 1 options: All |
| auto_refresh_data | BOOLEAN | false | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| character_zh | STRING | — |
| character_en | STRING | — |
| origin | STRING | — |
| prompt | STRING | — |
| character_json | STRING | — |