π± Artha Gemini Body
Describe a character's body without fumbling for words
- image
- body
Artha Gemini Body is a character-description builder that focuses on one slice of a person: their physical structure. It hands back a typed ARTHABODY object that feeds into Artha Gemini Portrait, which is the node that actually turns a stack of attributes into a flowing, grammatically correct character prompt for your image model. On its own this node is just a very opinionated checklist - wired up, it's how you get "tall, athletic build, broad shoulders, medium skin tone, upright confident posture" without once staring at a blank prompt box.
It belongs to the Artha pack's character pipeline: Artha Gemini Face, Body, Form, Cloth, and Makeup each produce a typed attribute object, and Portrait merges them all into one description. Body is the one that covers height, weight, build, frame, shoulders, chest, torso, waist, hips, legs, skin tone, and posture.
What you actually set
Fourteen combo boxes, every one defaulting to NONE (skip it):
body_type, body_height, body_weight, body_build, body_frame, body_shoulder, body_chest, body_breasts, body_torso, body_waist, body_hip, body_legs, body_skin_tone, body_posture.
Each dropdown is populated from a profile.json that ships in the pack - so body_height gives you presets from VERY_SHORT up to EXTREMELY TALL, and body_skin_tone gives you named tones rather than RGB hexes. You pick values, or you don't: leave everything NONE and the node hands Portrait an effectively empty body block, which Portrait simply skips.
Two toggles sit at the bottom of the node:
randomize- picks a random preset per category. Great for generating character batches or for when you want variety without curating every box.use_image- the interesting one. Connect animageand the node asks Gemini to describe the body structure from the photo, returning that description as thebodyvalue. This is the only mode that needs an API key and a network call; the pure picker mode is local Python.
How it fits
The body output (type ARTHABODY) goes into Artha Gemini Portrait's body input, alongside face, form, cloth, and makeup. Portrait then merges everything into prose. One honest caveat: since Portrait's system prompt reads the body attributes verbatim into a property list, the dict keys get humanized (BODY_SHOULDER becomes "body shoulder") - so think of your dropdown choices as describing the category, and let the value carry the specifics.
The trap to watch
If you set use_image without an image connected, the node just falls through to the picker path - fine. If you do use an image and the body output comes back empty, it's almost always the API: these nodes swallow errors and print them to the ComfyUI console, then return an empty string. Check the console, and check that your key is in place. The key resolution order is: the node's api_key field β api.json in the pack folder β the GEMINI_API_KEY environment variable. Put it in api.json and leave the field blank, so you don't end up with a plaintext key baked into a workflow you'll share.
Install
One install gets you the whole π± pack, Body included:
cd ComfyUI/custom_nodes
git clone https://github.com/Cyrostar/ComfyUI-Artha-Nodes
cd ComfyUI-Artha-Nodes
pip install -r requirements.txt
Then restart ComfyUI. Or use ComfyUI Manager and search "Artha." The pack pulls in google-genai plus some heavier companions like opencv-python and scikit-learn, so give the pip step a moment. The picker mode needs no key at all; only use_image mode calls Google.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| body_type | COMBO | NONE | 9 options: NONE, ECTOMORPH, MESOMORPH, ENDOMORPH, PEAR, APPLE, +3 |
| body_height | COMBO | NONE | 9 options: NONE, VERY_SHORT, SHORT, BELOW_AVERAGE, AVERAGE, ABOVE_AVERAGE, +3 |
| body_weight | COMBO | NONE | 6 options: NONE, SKINNY, THIN, AVARAGE, OVERWEIGHT, OBESE |
| body_build | COMBO | NONE | 9 options: NONE, SLIM, ATHLETIC, MUSCULAR, AVERAGE, CURVY, +3 |
| body_frame | COMBO | NONE | 4 options: NONE, SMALL BONED, MEDIUM BONED, LARGE BONED |
| body_shoulder | COMBO | NONE | 5 options: NONE, REGULAR, BROAD, NARROW, SLOPING |
| body_chest | COMBO | NONE | 5 options: NONE, BROAD CHEST, NARROW CHEST, BARREL CHEST, FLAT CHEST |
| body_breasts | COMBO | NONE | 18 options: NONE, ROUND, TEARDROP, BELL-SHAPED, SIDE SET, CLOSE SET, +12 |
| body_torso | COMBO | NONE | 8 options: NONE, SHORT TORSO, LONG TORSO, BALANCED TORSO, NARROW TORSO, WIDE TORSO, +2 |
| body_waist | COMBO | NONE | 8 options: NONE, DEFINED WAIST, STRAIGHT WAIST, HIGH WAIST, LOW WAIST, TAPERED WAIST, +2 |
| body_hip | COMBO | NONE | 8 options: NONE, STRAIGHT HIPS, SQUARE HIPS, TRIANGLE HIPS, HEART HIPS, ROUND HIPS, +2 |
| body_legs | COMBO | NONE | 9 options: NONE, LONG LEGS, SHORT LEGS, STRAIGHT LEGS, CURVY LEGS, BOW LEGS, +3 |
| body_skin_tone | COMBO | NONE | 10 options: NONE, VERY_FAIR, FAIR, LIGHT, MEDIUM, OLIVE, +4 |
| body_posture | COMBO | NONE | 6 options: NONE, UPRIGHT, SLOUCHED, CONFIDENT, RELAXED, RIGID |
| randomize | BOOLEAN | false | β |
| use_image | BOOLEAN | false | β |
| 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. Higher values increase randomness. |
| imageopt | IMAGE | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| body | ARTHABODY | β |