Apex Character Prompt
Stop retyping your character bible every run
- combined_prompt
- gender
- age
- ethnic
- face
- eye_color
- skin_tone
- hair
- headwear
- top
- bottom
- shoes
- hand_accessory
You found a character you like. Now you get to retype the same forty-token description for the next thirty generations, and the moment you reorder it or drop a word, the face drifts. Apex Character Prompt turns that description into pick-lists.
It writes no pixels and runs no model - it just hands you the descriptor paragraph, assembled from 221 bundled presets across 12 categories, so your "long wavy brunette hair, oversized cream knit hoodie" is typed once and reused forever.
Why this earns a slot in your graph
Diffusion models have no internal concept of "this character." Each generation samples from a distribution conditioned on your prompt, so consistency lives entirely outside the model - in prompts, reference images, LoRAs, or an instruction editor. Prompt-side consistency is the cheapest of those approaches and the one you can start using today without training anything or having a reference image - which is why the consistency problem is such a rabbit hole.
It's also where the mechanical wins are. Word order binds attributes, so the order you list descriptors in genuinely decides what attaches to whom, and attention starts drifting somewhere past 75–100 effective tokens. The node's fixed order - gender, age, ethnicity, face, eye color, skin tone, hair, headwear, top, bottom, shoes, hand accessory - gives you a stable sequence and a per-category cap on length.
For batch variety it's the honest tool: Random across all twelve categories plus one seed is a whole casting call, and the same seed gives you the same person back.
How it works
Every category is a dropdown built from character_presets.json inside the pack. Its options are Disabled, Random, then the preset names. The node resolves each selection to that preset's text, not its name - so the hair output carries "long silver blonde wispy bangs", not "Long Silver Blonde Wispy Bangs".
Random is weighted (weight per preset in the JSON) and seeded per category: the node runs Random(seed + offset) with offsets 1 through 12. That's the detail worth internalising, because it means changing one category doesn't re-roll the other eleven. Pick a stranger you like, then flip hair_preset to a preset you actually want next time - everything else stays exactly as it was.
The free-text input_text box leads the combined prompt, and it is deliberately not copied into any per-category output. It also supports [option a, option b] bracket picks - a small random-choice syntax the preset texts can use too.
Inputs and outputs that matter
You set three things:
seed- drives everyRandomselection. Same seed, same character.- the twelve
_presetdropdowns -Disabled,Random, or a named preset. Start with everything onRandomto browse, then pin the categories you care about. input_text- your own text, placed first, for anything the categories don't cover (pose, scene, camera, expression).
Thirteen outputs, all STRING. combined_prompt is the one you'll usually wire: into a CLIP Text Encode (positive), or into an LLM/prompt node if you like a rewrite pass. The other twelve - gender, age, ethnic, face, eye_color, skin_tone, hair, headwear, top, bottom, shoes, hand_accessory - exist so you can use one attribute somewhere else, or feed a captioning pipeline a fixed clothing description while the face stays free.
Anything left on Disabled returns an empty string and is dropped from combined_prompt, so a mostly-disabled node gives you a short prompt instead of commas with nothing between them.
Install
ComfyUI Manager: search Apex Artist (the registry entry also shows up under the pack title Apex Artist - Image Resize, from an earlier incarnation of the project). Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/ApexArtist/comfyui-apex-artist.git
pip install -r comfyui-apex-artist/requirements.txt
Then restart ComfyUI - not just refresh the tab. No models to download, and this node doesn't need the pack's one dependency (opencv-python, for the HDRI node). Nodes land under Apex Artist → Text.
Traps
Your preset edits live inside the pack. character_presets.json is in the repo, and a category in that file overrides the built-in library wholesale when it's non-empty. That's what makes editing it work; it's also what makes a reinstall or update able to overwrite your work. Copy your version somewhere safe first.
Random across all twelve is a lot of prompt. It's fun once. For actual output, disable the categories you don't care about - the combined prompt can otherwise add up to well past the point where attention starts drifting.
Editing presets re-runs the node. It hashes the presets file rather than ignoring it, so you don't have to fight ComfyUI's output cache - but it also means a saved workflow re-run against someone else's presets file gives you different text on the same seed.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| seed | INT | 00–18446744073709550000 | — |
| gender_preset | COMBO | Random | 10 options: Disabled, Random, Female, Male, Androgynous, Non-Binary, +4 |
| age_preset | COMBO | Random | 13 options: Disabled, Random, Teens 13-17, Young Adult 18-21, Early Twenties 22-25, Mid Twenties 26-29, +7 |
| ethnicity_preset | COMBO | Random | 19 options: Disabled, Random, European Caucasian, Nordic Scandinavian, Mediterranean Southern European, Slavic Eastern European, +13 |
| face_preset | COMBO | Random | 20 options: Disabled, Random, Universal Beauty, American Beauty, K-Idol Soft, Editorial High Fashion, +14 |
| eye_color_preset | COMBO | Random | 16 options: Disabled, Random, Dark Brown, Medium Brown, Hazel, Amber, +10 |
| skin_tone_preset | COMBO | Random | 16 options: Disabled, Random, Porcelain, Fair Cool, Fair Warm, Light Ivory, +10 |
| hair_preset | COMBO | Random | 31 options: Disabled, Random, Long Wavy Brunette, Silky Straight Black, Blunt Bob, Collarbone Lob, +25 |
| headwear_preset | COMBO | Random | 19 options: Disabled, Random, Classic Baseball Cap, Backwards Snapback, Ribbed Beanie, Fisherman Beanie, +13 |
| top_preset | COMBO | Random | 33 options: Disabled, Random, Oversized Cream Knit Hoodie, Cropped Graphic Tee, Fitted Ribbed Tank Top, Silky Slip Blouse, +27 |
| bottom_preset | COMBO | Random | 28 options: Disabled, Random, High-Waisted Skinny Jeans, Ripped Straight Jeans, Cargo Pants, Tapered Chinos, +22 |
| shoes_preset | COMBO | Random | 22 options: Disabled, Random, White Sneakers, High-Top Canvas Sneakers, Chunky Platform Sneakers, Combat Boots, +16 |
| hand_accessory_preset | COMBO | Random | 18 options: Disabled, Random, Chronograph Wristwatch, Smartwatch, Stacked Gold Bangles, Silver Signet Ring, +12 |
| input_text | STRING | — |
Outputs (13)
| Name | Type | Description |
|---|---|---|
| combined_prompt | STRING | — |
| gender | STRING | — |
| age | STRING | — |
| ethnic | STRING | — |
| face | STRING | — |
| eye_color | STRING | — |
| skin_tone | STRING | — |
| hair | STRING | — |
| headwear | STRING | — |
| top | STRING | — |
| bottom | STRING | — |
| shoes | STRING | — |
| hand_accessory | STRING | — |