π± Artha Gemini Portrait
The character writer of the Artha pack
- image
- face
- body
- form
- cloth
- makeup
- response
- traits
Artha Gemini Portrait is where a character actually gets described. The face, body, form, cloth, and makeup nodes all produce typed attribute objects - this is the node that takes them and writes the character. It's the character-focused sibling of Artha Gemini Compose: Compose assembles a whole scene (subject, scenery, camera, light, style), while Portrait is specifically about a person, and it's the natural endpoint for Artha's character pipeline.
Everything else in the character set is ingredients. This is the recipe, the writing, the part that produces a sentence you can feed a text encoder. It calls Gemini on every run, so an API key is non-negotiable.
The inputs that matter
text_prompt- free-form steering, defaults to "Construct a prompt describing a character in detail."identity- FEMININE or MASCULINE. This isn't cosmetic: it picks which hair-style attribute to use, sets the pronouns (she/her vs he/his) in the system prompt, and changes how the whole description is framed.framing- headshot, portrait, medium shot, wide shot, or full body shot. Defaults to portrait. The system prompt optimizes the description for that framing, and it genuinely changes what gets emphasized.seed- passed to Gemini for reproducible output, with control-after-generate enabled.use_image+reconstruct- the vision pair. Connect animageand Portrait analyzes it instead of (or in addition to) your attribute inputs.- Optional typed inputs:
face(ARTHAFACE),body(ARTHABODY),form(ARTHAFORM),cloth(ARTHACLOTH),makeup(ARTHAMAKEUP) - all produced by their namesake Artha nodes.
Outputs: response, the finished character description, and traits, the property list assembled from your inputs - the exact list that went into the prompt, which is your best debugging friend.
The three modes
Without an image, Portrait builds a property list from whatever face/body/form/cloth/makeup inputs are connected and asks Gemini to write a cohesive description from it. If nothing's connected, the property list is empty and the node returns an empty response - so wire in at least one character node or give it a real text_prompt.
With an image and reconstruct off, the image is the authority: Gemini analyzes it and describes the features directly, and your property list mostly takes a back seat.
With an image and reconstruct on, your properties win on conflict. The pack's own example: if the photo has green eyes but your face input says blue, blue wins, and any properties missing from the photo get added. That's your "keep the person, change the look" workflow - the same trick Artha Gemini Compose does for whole scenes.
Gotchas and honest notes
Type discipline matters: only ARTHAFACE-typed objects plug into face, and so on - raw strings won't connect. Vision mode costs an API call per run and swallows errors into an empty response with the failure printed to the ComfyUI console. And the identity/framing choices aren't just labels - they're active parts of the generation prompt, so set them deliberately. Key resolution is pack-standard: api_key field β api.json β GEMINI_API_KEY, with api.json being the version that won't leak into a shared workflow.
Install
One install for the whole π± pack:
cd ComfyUI/custom_nodes
git clone https://github.com/Cyrostar/ComfyUI-Artha-Nodes
cd ComfyUI-Artha-Nodes
pip install -r requirements.txt
Restart ComfyUI, or install "Artha" via ComfyUI Manager. Get a key from Google AI Studio - Portrait runs on API calls and won't do anything without one.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| text_prompt | STRING | Construct a prompt describing a character in detail. | β |
| identity | COMBO | FEMININE | 2 options: FEMININE, MASCULINE |
| framing | COMBO | portrait | 5 options: headshot, portrait, medium shot, wide shot, full body shot |
| 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. |
| seed | INT | 00β18446744073709550000 | β |
| use_image | BOOLEAN | false | β |
| reconstruct | BOOLEAN | false | β |
| imageopt | IMAGE | β | |
| faceopt | ARTHAFACE | β | |
| bodyopt | ARTHABODY | β | |
| formopt | ARTHAFORM | β | |
| clothopt | ARTHACLOTH | β | |
| makeupopt | ARTHAMAKEUP | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| response | STRING | β |
| traits | STRING | β |