按官方约定放 web/docs/<节点>/<语言>.md,前端「信息」面板直接展示; WEB_DIRECTORY 声明与目录同时提交,不留下「声明了但文件还没到」的中间态。
6.5 KiB
Rolling Character
Draws characters at random from a character CSV (default danbooru_character_001.csv) and outputs
one line per character in the form character tag, copyright tag, character description
(comma + newline separated), plus a structured JSON result and the tested count. The node is an output
node, so it runs even when nothing consumes its outputs.
- Output 1
prompt: one line per character, e.g.No weights: you will never see thehakurei_reimu,touhou,1girl,brown eyes,long hair, ganyu_\(genshin_impact\),genshin_impact,1girl,horns(name:weight)form here. Multiple characters are separated by a comma plus a newline: every line ends with a comma except the last one, so flattening the output into a single line never glues two characters' tags together - Output 2
characters_json:{"characters": [{"name","copyright","top","count","core_tags"}], "status": "OK"} - Output 3
tested_count: number of character combinations recorded in the current database (as a string, so it can be wired straight into a text node)
Data source and trigger layout
The node reads the trigger column by default. Verified across all 34,416 rows, that column is a
fixed two-segment structure:
| Segment | Content | Verification |
|---|---|---|
| 1 | Character tag (already escaped, ready to use) | == escaped character column: 34,416/34,416 |
| 2 | Copyright tag (e.g. touhou) |
== escaped copyright column: 34,416/34,416 |
The column is fixed to trigger (not configurable): it always has the two-segment shape above, so no
column-selection parameter is needed.
Output format
One line per character, fields joined by a single comma:
character tag,copyright tag,character description
With "Enable Character Description" turned off it becomes:
character tag,copyright tag
- Empty parts are omitted, so no stray commas appear when a character has no copyright or no description
- The character description (
core_tags) is deduplicated within the line (the source data lists some tags twice) - Multiple characters are separated by a comma plus a newline: every line ends with a comma except the last one (a single character carries no trailing comma). The line order is the sampling order
Parameters
| Parameter | Type / range | Description |
|---|---|---|
character_count |
INT 1-10 | Characters generated per run, one line each |
character_top_ratio |
FLOAT 0.01-1.0 | Top pool ratio: the first ceil(candidates × ratio) rows; candidates = characters left after the work filter |
character_top_count |
INT 1-10 | Minimum number of Top-pool characters per run |
seed |
INT | Random seed |
use_top_priority |
BOOLEAN | Draw from the Top pool first |
exclude_characters |
STRING | Exclude list, comma separated |
force_include |
STRING | Characters that must appear; names not in the CSV still work but carry no tags |
copyright_pick |
COMBO | Work dropdown listing every work in the CSV (about 3,460 with the default data, sorted by popularity = the sum of the count column, descending); the first entry is (不限). Searchable as you type, case-insensitively |
describe_character |
BOOLEAN | Whether to append each character's fixed appearance tags (core_tags, i.e. the character description) to its line; on by default |
custom_csv_path |
STRING | Custom character CSV path; empty uses danbooru_character_001.csv |
tested_db_path |
STRING | Records database path; empty uses rollingcharacter.sqlite (separate from the artist node) |
This node performs no weight assignment (hence no weight parameters), no exhaustion (characters are single tags) and has no dedup mode parameter (repeats are avoided with a fixed-rule window, see below).
Work filter: a single dropdown
- The dropdown lists every work in the CSV (about 3,460 with the default data), sorted by
popularity: the
countcolumn summed over the work's characters, descending. That reflects "how popular the work is overall" instead of "how many characters it has"; ties are broken by name ascending, so the order is stable and reproducible - The first entry
(不限)means no filtering - It is searchable as you type, case-insensitively — typing
akeeps works starting with a, typingabnarrows it further - Both the raw
copyrightform (fate_(series)) and the escapedtriggerform (fate_\(series\)) are accepted - The options come from the default CSV (
danbooru_character_001.csv): pointingcustom_csv_pathat another file does not change them - If nothing is left after filtering the node errors out instead of silently emitting an empty prompt
Repeat avoidance: no repeat within the last 10 outputs
There is no dedup mode any more; instead a fixed-rule in-memory window is used:
- The window holds the last 10 output records, where one record = one generation (possibly several characters)
- Before sampling, the window's character names are removed from the candidates, so drawing 1 character ten
times in a row yields ten different characters; with
character_count=3it means "no repeat within the last 30 characters" - The window lives in the node instance's memory: restarting ComfyUI clears it, and several character nodes in one workflow each keep their own
- To clear it from a script, call
node.reset_recent();node.recent_names()shows the current window - When the window covers every candidate (for example when a very small work is selected), the node falls back to allowing repeats and logs a WARNING — it never errors out or gets stuck
Records database (SQLite)
- The default database lives in the node directory:
rollingcharacter.sqlite, separate from the artist node (records carry akind=charactermark, so they never impersonate artist records even in a shared file) - It only stores the output history (for
tested_countand later inspection); repeat avoidance does not depend on it, so changingtested_db_pathdoes not reset the window - The default database is cleared on every ComfyUI startup
Notes
- About 22% of characters have no character description (
core_tagsempty); those lines carry only the character and copyright tags - About 10 description tags per character on average, so lines get noticeably longer with many characters
- Character names are unique (no duplicates across 34,416 rows), so a name maps directly to its record
- The weight column in stored records is a
1.0placeholder (characters carry no weights); it only exists to keep record keys distinct