Nodes/ComfyUI_RandomPerson/Random Person AIO (All-In-One)
ComfyUI Node

Random Person AIO (All-In-One)

Your batch is full of the same face. Fix it with one node.

By bradsec·Created 4 months ago·Updated 3 months ago· 6
Random Person AIO (All-In-One)
    • full_description
    • sex
    • age
    • nationality
    • complexion
    • face
    • hair
    • facial_hair
    • body_type
    • expression
    • accessories
    • makeup
    • shoulders
    • chest
    • bust
    • clothing
    • footwear
    • seed
    ◄seed0►
    ◄randomizetrue►
    ◄sexrandom►
    ◄nationality_moderandom►
    ◄nationality_allow_list►
    ◄nationality_fixed(none)►
    ◄complexion_moderandom►
    ◄complexion_allow_list►
    ◄complexion_fixed(none)►
    ◄skin_texture_modeoff►
    ◄skin_texture_allow_list►
    ◄skin_texture_fixed(none)►
    ◄eyes_moderandom►
    ◄eyes_allow_list►
    ◄eyes_fixed(none)►
    ◄eye_shape_moderandom►
    ◄eye_shape_allow_list►
    ◄eye_shape_fixed(none)►
    ◄eyebrows_modeoff►
    ◄eyebrows_allow_list►
    ◄eyebrows_fixed(none)►
    ◄face_shape_moderandom►
    ◄face_shape_allow_list►
    ◄face_shape_fixed(none)►
    ◄nose_shape_moderandom►
    ◄nose_shape_allow_list►
    ◄nose_shape_fixed(none)►
    ◄mouth_shape_moderandom►
    ◄mouth_shape_allow_list►
    ◄mouth_shape_fixed(none)►
    ◄face_feature_modeoff►
    ◄face_feature_allow_list►
    ◄face_feature_fixed(none)►
    ◄hair_color_moderandom►
    ◄hair_color_allow_list►
    ◄hair_color_fixed(none)►
    ◄hair_style_moderandom►
    ◄hair_style_allow_list►
    ◄hair_style_fixed(none)►
    ◄hair_length_moderandom►
    ◄hair_length_allow_list►
    ◄hair_length_fixed(none)►
    ◄facial_hair_modeoff►
    ◄facial_hair_allow_list►
    ◄facial_hair_fixed(none)►
    ◄body_type_moderandom►
    ◄body_type_allow_list►
    ◄body_type_fixed(none)►
    ◄shoulders_modeoff►
    ◄shoulders_allow_list►
    ◄shoulders_fixed(none)►
    ◄chest_modeoff►
    ◄chest_allow_list►
    ◄chest_fixed(none)►
    ◄bust_size_modeoff►
    ◄bust_size_allow_list►
    ◄bust_size_fixed(none)►
    ◄bust_shape_modeoff►
    ◄bust_shape_allow_list►
    ◄bust_shape_fixed(none)►
    ◄expression_modeoff►
    ◄expression_allow_list►
    ◄expression_fixed(none)►
    ◄accessories_modeoff►
    ◄accessories_allow_list►
    ◄accessories_fixed(none)►
    ◄makeup_modeoff►
    ◄makeup_allow_list►
    ◄makeup_fixed(none)►
    ◄clothing_modeoff►
    ◄clothing_allow_list►
    ◄clothing_fixed(none)►
    ◄footwear_modeoff►
    ◄footwear_allow_list►
    ◄footwear_fixed(none)►
    ◄age_moderandom►
    ◄age_min0►
    ◄age_max0►
    ◄age_fixed0►
    ◄extra_attributes►

    Prompt a model with just "a person" and it will lean on its trained default face. Generate a batch of five and you get the same person five times in slightly different poses - that "everyone looks the same" complaint is one of the oldest in the character-consistency threads, and it's not going away on its own. The fix is specificity: the model needs a concrete face, build, and outfit before it will stop recycling its own idea of a person.

    That's the whole pitch of ComfyUI_RandomPerson, and Random Person AIO (All-In-One) is the flagship node in the pack. One node, on every run, hands you a complete comma-separated description covering nationality, age, complexion, skin texture, eyes, eyebrows, face shape, nose, mouth, distinctive features, hair, facial hair, build, shoulders, chest, bust, expression, accessories, makeup, clothing, and footwear. And the name is a half-lie: there's no AI in it. No API call, no model download, no key, no GPU. It's a curated JSON database plus a random picker, which is honestly the best thing about it.

    A real female example straight from the docs:

    43 year old Russian female, angular face, light medium complexion, smooth skin, natural grey eyes, button nose, wide-set lips, a faint scar through one eyebrow, red very short hair worn twist out, muscular build, reading glasses, bold lipstick
    

    How it works

    Every attribute is drawn from a bundled JSON file in data/, split into shared/, male/, and female/. Pick sex (or leave it random), and the node resolves to one list per category, then picks an entry. The descriptions are written to be unambiguous for diffusion - "muted natural green eyes" instead of a bare "green" - which is exactly the difference between this and a sloppy wildcard.

    Each of the ~24 attributes gets three widgets, and this is the core loop of the whole pack:

    • <attr>_mode - random (any value), allow_list (a subset you type), fixed (the dropdown value), or off (skip it entirely).
    • <attr>_allow_list - comma-separated values for allow_list. Unknown values are kept as literal descriptors, so you can type things like auburn, fire engine red.
    • <attr>_fixed - the exact value to always use in fixed mode.

    Core identity categories default to random; the "flair" categories (skin texture, eyebrows, distinctive features, facial hair, expression, accessories, makeup, shoulders, chest, bust, clothing, footwear) default to off so your base person stays clean until you opt in. extra_attributes is free text appended verbatim - pose, props, setting, whatever.

    randomize defaults on, which means the seed widget is ignored and you get a fresh person every run. Flip it off and the same seed reproduces the same person. Age lives here too: age_mode (random/fixed/off), age_min/age_max (0 = no bound, effectively 21–90), and age_fixed. Below 21 gets clamped - the author isn't generating minors, and neither should you.

    Outputs and wiring

    First pin is full_description, ready to feed straight into a CLIP Text Encode (or your text node of choice). Then a pin per attribute - sex, age, nationality, complexion, face, hair, facial_hair, body_type, expression, accessories, makeup, shoulders, chest, bust, clothing, footwear - plus seed as an INT. Route a single trait elsewhere if you need to, or concatenate the full description with your scene prompt using any string node.

    Install

    ComfyUI Manager is easiest: open Manager → Custom Nodes Manager, search for ComfyUI_RandomPerson, install, restart. Manual works the same as always:

    cd ComfyUI/custom_nodes
    git clone https://github.com/bradsec/ComfyUI_RandomPerson
    

    Then restart ComfyUI. It appears under Add Node → Random Person. No pip dependencies, Python 3.10+ is all it asks, and it registers on both the legacy V1 and new V3 schema APIs, so it loads on old and new ComfyUI alike.

    Gotchas

    The node is tall - every category is exposed at once, so you'll scroll. That's the trade for the AIO. If it gets unwieldy, the pack ships segment nodes (Identity, Face, Hair, Body, Style) that each cover a slice. And remember: mode off makes a category vanish from the description, so if your output looks thin, check you haven't left the flair categories off. Edit the JSON under data/ to add your own values - but new entries need a ComfyUI restart to load. If randomize is on, the seed output is whatever it picked this run, not the number you typed, so use randomize: off when you want to reproduce a face exactly.

    CategoryRandom Person

    Inputs (80)

    NameTypeDefaultDescription
    seedINT00–18446744073709550000Seed for reproducibility. With randomize off, the same seed reproduces the same person.
    randomizeBOOLEANtrueOn: pick a new random person every run, ignoring the seed widget. Off: use the seed.
    sexCOMBOrandomrandom, male, or female. male/female filter the sex-specific dropdowns in the UI.
    nationality_modeCOMBOrandomHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    nationality_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    nationality_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    complexion_modeCOMBOrandomHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    complexion_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    complexion_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    skin_texture_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    skin_texture_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    skin_texture_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    eyes_modeCOMBOrandomHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    eyes_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    eyes_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    eye_shape_modeCOMBOrandomHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    eye_shape_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    eye_shape_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    eyebrows_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    eyebrows_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    eyebrows_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    face_shape_modeCOMBOrandomHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    face_shape_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    face_shape_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    nose_shape_modeCOMBOrandomHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    nose_shape_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    nose_shape_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    mouth_shape_modeCOMBOrandomHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    mouth_shape_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    mouth_shape_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    face_feature_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    face_feature_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    face_feature_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    hair_color_modeCOMBOrandomHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    hair_color_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    hair_color_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    hair_style_modeCOMBOrandomHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    hair_style_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    hair_style_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    hair_length_modeCOMBOrandomHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    hair_length_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    hair_length_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    facial_hair_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    facial_hair_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    facial_hair_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    body_type_modeCOMBOrandomHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    body_type_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    body_type_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    shoulders_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    shoulders_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    shoulders_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    chest_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    chest_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    chest_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    bust_size_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    bust_size_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    bust_size_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    bust_shape_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    bust_shape_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    bust_shape_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    expression_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    expression_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    expression_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    accessories_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    accessories_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    accessories_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    makeup_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    makeup_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    makeup_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    clothing_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    clothing_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    clothing_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    footwear_modeCOMBOoffHow this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it).
    footwear_allow_listSTRINGComma-separated values used when mode=allow_list. Unknown values are added as literal descriptors.
    footwear_fixedCOMBO(none)Exact value used when mode=fixed. (none) falls back to random.
    age_modeCOMBOrandomHow to pick the age: random within range, fixed value, or off (no age in the description).
    age_minINT00–90Minimum age. 0 = no lower bound (defaults to 21). Cannot go below 21.
    age_maxINT00–90Maximum age. 0 = no upper bound (defaults to 90). Minimum is always 21.
    age_fixedINT00–90Exact age when mode=fixed. 0 = ignored. Values below 21 are clamped to 21.
    extra_attributesSTRINGFree text appended to the description as-is, comma-separated. Pose, setting, props, extra detail, etc.

    Outputs (18)

    NameTypeDescription
    full_descriptionSTRING—
    sexSTRING—
    ageSTRING—
    nationalitySTRING—
    complexionSTRING—
    faceSTRING—
    hairSTRING—
    facial_hairSTRING—
    body_typeSTRING—
    expressionSTRING—
    accessoriesSTRING—
    makeupSTRING—
    shouldersSTRING—
    chestSTRING—
    bustSTRING—
    clothingSTRING—
    footwearSTRING—
    seedINT—