π± Gemini Face
19 dropdowns for every feature, or let Gemini read a photo
- face
Gemini Face is the node that stops a character's face from being a coin flip. Every other prompt you write describes a face in prose and hopes the sampler agrees; this one breaks the face into 19 dropdowns - head type, hair color and length, eye type and size, nose, lips, cheeks, chin, the works - and hands that list to Gemini to be turned into a precise description. Same idea the LLM-encoder models reward anyway: structured, blocky, unambiguous prompts, except you don't have to compose them by hand. It lives in the π±-prefixed Artha family from Cyrostar/Artha-Gemini, category Artha/LLM/GEMINI, and it's a building block for the pack's Gemini Portrait node.
The name overstates a little: "Gemini" is optional. With no image connected, this node never calls the API at all. Pick your values, leave everything else on NONE (the default for every field), and it assembles a Python dict of your selections and pushes it out its face output - free, instant, offline. Flip randomize on and it fills every field with a random pick from the valid options, which is a fun way to spin up a face for a character you don't care about yet.
Where it earns the Gemini name is use_image. Set that true, pick a file in the image dropdown (or drag one into it - it's an upload widget, not an IMAGE tensor), and the node sends your photo to the Gemini Vision API with a face-analysis agent prompt and gets back a markdown bullet list describing the face it sees. That output is still typed ARTHAFACE, so it wires exactly where the manual dict went. This is the reverse of the usual workflow: instead of describing a face to get an image, you hand it an image and get the description back.
The inputs that actually matter
You will not tweak all 19. The pattern is: pick the fields that matter for the character, leave the rest NONE, and the Portrait node downstream ignores the empties. The high-signal ones are face_shape, face_age, face_eye_color, face_lip_type, and the two hair styles - hair_style_fem for feminine characters, hair_style_mas for masculine ones (Portrait drops the one that doesn't match your identity choice).
The shared controls at the bottom appear on every node in this pack:
api_key,model(defaultgemini-2.5-flash),max_tokens(5000),temperature(0.7) - only used in image mode.randomize- random values for everything, no API call.use_image+image- flip to vision mode.
Output is a single face wire of type ARTHAFACE. Its only sane destination is the face optional input on Gemini Portrait, which merges it with Body, Form, Makeup and Cloth into one character description.
Installing it
It ships inside the Artha-Gemini pack, so install once for all the π± Gemini nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/Cyrostar/Artha-Gemini
cd Artha-Gemini
pip install -r requirements.txt
Then restart ComfyUI. ComfyUI Manager also finds it if you search "Artha-Gemini". The dependencies are light - google-genai, Pillow, numpy, torch, soundfile - no model files to download, but you do need a Gemini API key from Google AI Studio. Only needed for image mode; the dropdown mode is fully offline.
Where people get burned
The image input is a file list, not an image socket. Beginners wire a Load Image node into it, get nothing, and assume the node is broken - you have to pick a file from the dropdown or upload one into it. Second gotcha: leave use_image false unless you actually want the vision call, because every run in image mode bills tokens to your key. And if you ever type your key into the api_key field, it's stored in plain text inside the saved workflow - the author's tooltip says as much. Putting it in the pack's api.json (gemini_api_key) or setting GEMINI_API_KEY as an environment variable keeps it out of your PNGs.
One thing to know: if image mode returns NONE for fields Gemini couldn't confidently identify from the photo, that's by design - the agent prompt tells it to drop anything it can't see. You're left with a partial face spec, which is still a better starting point than a blank canvas.
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| head_type | COMBO | NONE | 4 options: NONE, SMALL HEADED, AVERAGE PROPOTION, LARGE HEADED |
| hair_color | COMBO | NONE | 13 options: NONE, BLACK, BROWN, DARK BROWN, MEDIUM BROWN, LIGHT BROWN, +7 |
| hair_length | COMBO | NONE | 7 options: NONE, BALD, VERY SHORT, SHORT, MEDIUM, LONG, +1 |
| hair_style_fem | COMBO | NONE | 29 options: NONE, BALD, STRAIGHT, WAVY, CURLY, COILY, +23 |
| hair_style_mas | COMBO | NONE | 28 options: NONE, BALD, STRAIGHT, WAVY, CURLY, COILY, +22 |
| face_appeal | COMBO | NONE | 6 options: NONE, VERY ATTRACTIVE, ATTRACTIVE, AVERAGE, BELOW AVERAGE, UNATTRACTIVE |
| face_age | COMBO | NONE | 11 options: NONE, BABY, TODDLER, TWEEN, TEEN, EARLY TWENTIES, +5 |
| face_shape | COMBO | NONE | 8 options: NONE, OVAL, ROUND, SQUARE, OBLONG, HEART, +2 |
| face_eyebrow_type | COMBO | NONE | 4 options: NONE, THIN, MEDIUM, THICK |
| face_eyebrow_shape | COMBO | NONE | 6 options: NONE, ROUND, FLAT, S-SHAPED, HARD ANGLED, SOFT ANGLED |
| face_eye_type | COMBO | NONE | 11 options: NONE, ROUND, ALMOND, DROOPY, HOODED, ASIAN, +5 |
| face_eye_size | COMBO | NONE | 4 options: NONE, NORMAL, BIG, SMALL |
| face_eye_color | COMBO | NONE | 7 options: NONE, BROWN, BLUE, HAZEL, GREEN, GRAY, +1 |
| face_nose_type | COMBO | NONE | 11 options: NONE, GREEK, ROMAN, BUTTON, SNUB, NUBIAN, +5 |
| face_lip_type | COMBO | NONE | 8 options: NONE, FULL, WIDE, ROUND, THIN, OVAL SHAPED, +2 |
| face_lip_color | COMBO | NONE | 11 options: NONE, NATUREL, NUDE BEIGE, NUDE PINK, PEACHY NUDE, SOFT PINK, +5 |
| face_ear_type | COMBO | NONE | 4 options: NONE, ROUND, OVAL, ELF |
| face_cheek_type | COMBO | NONE | 7 options: NONE, HIGH CHEEKBONES, LOW CHEEKBONES, ROUNDED CHEEKS, HOLLOW CHEEKS, CHISELED CHEEKS, +1 |
| face_chin_type | COMBO | NONE | 3 options: NONE, STRAIGHT, CLEFT |
| api_key | STRING | API key will be visible in plain text. Consider adding your api to the api.json located inside this custom node folder. | |
| model | COMBO | gemini-2.5-flash | 5 options: gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite, gemini-2.0-flash, gemini-2.0-flash-lite |
| max_tokens | INT | 50001β8192 | For Gemini models, a token is equivalent to about 4 characters. 100 tokens is equal to about 60-80 English words. |
| temperature | FLOAT | 0.70β2 | A temperature of 0 means only the most likely tokens are selected, and there's no randomness. Conversely, a high temperature injects a high degree of randomness into the tokens selected by the model, leading to more unexpected, surprising model responses. |
| randomize | BOOLEAN | false | β |
| use_image | BOOLEAN | false | β |
| image | COMBO | 1 options: example.png |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| face | ARTHAFACE | β |