Portrait Prompt
Face, hair, build, age, all of it
- text
Describing a face is where prompts get vague. "Attractive woman" - what does the model do with that? Portrait Prompt is the opposite of vague: it hands you forty dropdowns covering lens angle, nationality, gender, age, body type, face shape, eyes, brows, lashes, nose, hair, mouth, lips, and beard, and assembles your choices into a weighted portrait prompt. It's the flagship of ComfyUI-PromptWrapper, a mostly Chinese-audience pack that flies under the radar in English discussions but puts real work into its prompt datasets.
How it works
Every dropdown is backed by a JSONL file in the pack's assets/ folder, in your choice of Chinese or English (the language input swaps the whole set). Most fields follow the same pattern: -- omits it, random 🎲 picks one via seed % dataset_length, and the weight slider (0–2) controls how strongly it lands - weight 1 is bare text, anything else becomes (word:1.3). A few fields are weight-only, like pretty_face_weight, ordinary_face_weight, and ugly_face_weight, which pull fixed phrases and let you dial realism up or down.
The one genuinely clever input is nationality: nationality_1 and nationality_2 with nationality_mix_weight. Pick two and the node emits the [a:b:0.5] blend syntax, so you can mix ethnicities rather than pick one.
The inputs that matter
You can't set forty fields every run. The ones that carry the image:
- gender, age, hair_style, hair_color - the big four. Everything else at
--still gives you a recognizable portrait. - lens_angle - 128 options, and it's the highest-leverage input for shot composition.
- seed - reproduces random picks deterministically.
- preset_prompt + optional input_prompt - both prepend your own text, so you can say "cinematic, 8k" without losing the generated part.
The single text output goes straight into a CLIP Text Encode.
Install
ComfyUI Manager → Custom Nodes Manager → search ComfyUI-PromptWrapper → Install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/clouddreamfly/ComfyUI-PromptWrapper
All the datasets ship with the pack - nothing to download.
Where people get burned
The weighting caveat applies loudly here: (word:1.3) and [a:b:0.5] are CLIP-encoder syntax. On SDXL-lineage checkpoints (Illustrious, Pony, SD 1.5) they work as intended. On 2026's LLM-encoded models - Flux's T5, Z-Image, Anima - those weights are silently discarded, so the node degrades to a phrase picker and the mix-weight feature does nothing. Also default language is Chinese; flip it to English for clean output on Western models. And a sanity note: this builds the description, not the pose - for stance and movement you'll want the pack's Portrait Pose Prompt wired into the same prompt.
Inputs (43)
| Name | Type | Default | Description |
|---|---|---|---|
| language | COMBO | Chinese | 2 options: Chinese, English |
| lens_angle | COMBO | -- | 128 options: --, random 🎲, 前视图, 侧视图, 后视图, 仰视图, +122 |
| lens_angle_weight | FLOAT | 1.000–2 | — |
| nationality_1 | COMBO | -- | 196 options: --, random 🎲, 中国人, 俄罗斯人, 美国人, 英国人, +190 |
| nationality_2 | COMBO | -- | 196 options: --, random 🎲, 中国人, 俄罗斯人, 美国人, 英国人, +190 |
| nationality_mix_weight | FLOAT | 0.500–1 | — |
| gender | COMBO | -- | 5 options: --, random 🎲, 女性, 男性, 双性 |
| androgynous_weight | FLOAT | 0.000–2 | — |
| age | COMBO | -- | 113 options: --, random 🎲, 婴儿, 幼儿, 小孩, 小男孩, +107 |
| age_weight | FLOAT | 1.000–2 | — |
| body_part | COMBO | -- | 11 options: --, random 🎲, 肖像, 头像, 头部, 脸部肖像, +5 |
| body_part_weight | FLOAT | 1.000–2 | — |
| body_type | COMBO | -- | 28 options: --, random 🎲, 瘦身材, 正常身材, 超重身材, 骨感身材, +22 |
| body_type_weight | FLOAT | 1.000–2 | — |
| face_shape | COMBO | -- | 120 options: --, random 🎲, 椭圆形脸, 椭圆形脸, 卵圆形脸, 倒卵圆形脸, +114 |
| face_shape_weight | FLOAT | 1.000–2 | — |
| pretty_face_weight | FLOAT | 0.000–2 | — |
| ordinary_face_weight | FLOAT | 0.000–2 | — |
| ugly_face_weight | FLOAT | 0.000–2 | — |
| facial_asymmetry_weight | FLOAT | 0.000–2 | — |
| facial_expression | COMBO | -- | 26 options: --, random 🎲, 开心, 伤心, 生气, 惊讶, +20 |
| facial_expression_weight | FLOAT | 1.000–2 | — |
| eyes_shape | COMBO | -- | 196 options: --, random 🎲, 眼袋, 缠着绷带的单眼, 遮眼|眼罩, 眼罩, +190 |
| eyes_color | COMBO | -- | 11 options: --, random 🎲, 棕色的眼睛, 蓝色的眼睛, 绿色的眼睛, 红色的眼睛, +5 |
| eyebrows_style | COMBO | -- | 14 options: --, random 🎲, 眉毛, 柳叶眉, 狐眉, 浓眉, +8 |
| eyebrows_color | COMBO | -- | 13 options: --, random 🎲, 黑色的眉毛, 蓝色的眉毛, 红色的眉毛, 棕色的眉毛, +7 |
| eyelashs_style | COMBO | -- | 7 options: --, random 🎲, 睫毛, 羽扇形睫毛, 飞扬型睫毛, 典雅型睫毛, +1 |
| eyelashs_color | COMBO | -- | 7 options: --, random 🎲, 黑色的睫毛, 灰色的睫毛, 棕色的睫毛, 褐色的睫毛, +1 |
| nose_shape | COMBO | -- | 118 options: --, random 🎲, 正常鼻, 蒜头鼻, 肉鼻子, 朝天鼻, +112 |
| hair_style | COMBO | -- | 450 options: --, random 🎲, 长发, 很短的头发, 短发, 后短发,前长发, +444 |
| hair_color | COMBO | -- | 61 options: --, random 🎲, 浅灰色头发, 番茄色头发, 酸橙色头发, 海洋绿头发, +55 |
| hair_length | COMBO | -- | 9 options: --, random 🎲, 长发, 短发, 很短的头发, 后短发,前长发, +3 |
| disheveled_weight | FLOAT | 0.000–2 | — |
| mouth_shape | COMBO | -- | 47 options: --, random 🎲, 张嘴, 张大嘴喘气, 嘴巴微微张开, 波浪嘴, +41 |
| lips_shape | COMBO | -- | 111 options: --, random 🎲, 小嘴唇, 大嘴唇, 樱桃嘴唇, 薄唇, +105 |
| lips_color | COMBO | -- | 106 options: --, random 🎲, 黑色的嘴唇, 红色的嘴唇, 粉色的嘴唇, 紫色的嘴唇, +100 |
| beard_style | COMBO | -- | 23 options: --, random 🎲, 胡子, 胡茬胡子, 山羊胡, 全蓄胡子, +17 |
| beard_color | COMBO | -- | 9 options: --, random 🎲, 黑色的胡子, 灰色的胡子, 白色的胡子, 白灰色胡子, +3 |
| beard_length | COMBO | -- | 5 options: --, random 🎲, 短胡子, 中等胡子, 长胡子 |
| seed | INT | 00–18446744073709550000 | — |
| enable | BOOLEAN | true | — |
| preset_prompt | STRING | — | |
| input_promptopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |