Random Person: Identity
Who is this person? The Identity node builds the answer.
- full_identity_description
- sex
- age
- nationality
- complexion
- seed
If your prompt just says "a woman in a cafe", the model answers with its default woman - the same one it answers with for everyone else. Random Person: Identity is the part of ComfyUI_RandomPerson that pins down who the person is before anything else is decided: sex, age, nationality, complexion, and skin texture. It's the opening clause of the person description, the part that establishes that this is a specific 43-year-old Russian with light-medium skin and not generic-face-of-the-week.
It's one of five segment nodes in the pack, all sharing the same engine. Where the AIO node shoves every attribute on one (very tall) node, Identity exposes only its slice - so if you just want a varied age/nationality/skin block and plan to hand-write the rest, this is the one you want.
What it generates
Every run it resolves sex (or picks one at random) and draws from the sex-appropriate JSON lists for:
- nationality - 66 entries, from American to Nigerian to Swedish
- complexion - fair, olive, golden brown, and everything between
- skin texture - smooth, freckled, weathered, the lot (defaults to
off; opt in) - age - the interesting control on this node
Age deserves its own paragraph because it's the most "real" thing here. Instead of a dropdown, you get age_mode (random/fixed/off), age_min, age_max, and age_fixed. Leave both bounds at 0 and you get a random age in the default 21–90 range; set age_min: 30, age_max: 40 for a tighter window. Values below 21 are clamped to 21. The ages carry descriptive detail in the data files ("skin still unlined, features not yet fully set"), and the opener is assembled as "43 year old Russian female" - age, nationality, then sex.
The inputs that matter
Like every node in this pack, each attribute gets the same three widgets: _mode (random/allow_list/fixed/off), _allow_list (comma-separated subset, unknown values kept as literal text), and _fixed (a dropdown value for fixed mode). So you can force nationality_fixed: Swedish and let age and complexion roll, or allow-list nationalities with nationality_allow_list: Japanese, Korean, Chinese. extra_attributes appends free text verbatim.
seed plus randomize works the standard way - randomize on means a new person every run and the seed is ignored; off means the same seed reproduces the same person.
Outputs and wiring
full_identity_description- the assembled fragment, e.g.43 year old Russian female, light medium complexion, smooth skinsex,age,nationality,complexion- individual trait pins for routing elsewhereseed- INT, the resolved seed
Because the segment nodes are independent generators, you can run Identity alongside the Face, Hair, Body, and Style nodes and concatenate their full-description outputs with any string node to build a complete prompt - just set the same sex on each. Wire the fragment into a CLIP Text Encode's text input (or a string concat node first).
Install and gotchas
ComfyUI Manager: search ComfyUI_RandomPerson, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/bradsec/ComfyUI_RandomPerson
It shows up under Add Node → Random Person. No pip dependencies, Python 3.10+.
Where people trip: the complexion output pin is actually complexion plus skin texture joined with a comma, so it can look like two values - that's normal. And if you set age_mode: off, the opener loses its age, so you get "Russian female" instead of "43 year old Russian female" - and if you also turn nationality off, sex drops out too, since sex only appears alongside an age or nationality. Keep age_mode on random for the full effect.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| seed | INT | 00–18446744073709550000 | Seed for reproducibility. With randomize off, the same seed reproduces the same person. |
| randomize | BOOLEAN | true | On: pick a new random person every run, ignoring the seed widget. Off: use the seed. |
| sex | COMBO | random | random, male, or female. male/female filter the sex-specific dropdowns in the UI. |
| nationality_mode | COMBO | random | How this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it). |
| nationality_allow_list | STRING | Comma-separated values used when mode=allow_list. Unknown values are added as literal descriptors. | |
| nationality_fixed | COMBO | (none) | Exact value used when mode=fixed. (none) falls back to random. |
| complexion_mode | COMBO | random | How this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it). |
| complexion_allow_list | STRING | Comma-separated values used when mode=allow_list. Unknown values are added as literal descriptors. | |
| complexion_fixed | COMBO | (none) | Exact value used when mode=fixed. (none) falls back to random. |
| skin_texture_mode | COMBO | off | How this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it). |
| skin_texture_allow_list | STRING | Comma-separated values used when mode=allow_list. Unknown values are added as literal descriptors. | |
| skin_texture_fixed | COMBO | (none) | Exact value used when mode=fixed. (none) falls back to random. |
| age_mode | COMBO | random | How to pick the age: random within range, fixed value, or off (no age in the description). |
| age_min | INT | 00–90 | Minimum age. 0 = no lower bound (defaults to 21). Cannot go below 21. |
| age_max | INT | 00–90 | Maximum age. 0 = no upper bound (defaults to 90). Minimum is always 21. |
| age_fixed | INT | 00–90 | Exact age when mode=fixed. 0 = ignored. Values below 21 are clamped to 21. |
| extra_attributes | STRING | Free text appended to the description as-is, comma-separated. Pose, setting, props, extra detail, etc. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| full_identity_description | STRING | — |
| sex | STRING | — |
| age | STRING | — |
| nationality | STRING | — |
| complexion | STRING | — |
| seed | INT | — |