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 2 months ago·Updated 2 months ago· 5
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