π± Gemini Vision
Turn any image into a detailed caption your workflow can actually use
- image
- system_instruction
- response
Gemini Vision is the pack's "describe this picture" node, and it's the one you'll reach for when you've got an image you want to feed back into the generation loop. You plug in an image, it sends it to Gemini, and you get back a rich, structured text description - not a one-line caption, but a proper breakdown of composition, lighting, style, mood, and details. If you've ever looked at a reference image and wished it came with its own prompt, this is the node that writes it for you.
It sits in the Artha-Gemini pack (the π± Gemini nodes), a family of nodes that call Google's hosted Gemini API rather than running anything on your GPU. That means no model download, no VRAM hit - just an API key and a network call.
How it works
Mechanically it's simple: the node takes your image as a standard ComfyUI IMAGE tensor (straight from a Load Image node), converts it to a PIL image, and sends it to Gemini alongside your text_prompt. What makes the output good is the default system instruction - a bundled "vision agent" that tells the model to organize its answer into headers like Overall Description, Composition and Layout, Colors and Lighting, Style and Aesthetic, and Emotions and Mood.
That structured output is the point. A raw "describe this" call gives you a paragraph of prose; this gives you something you can actually mine for prompt material. After the call, the node strips * and # characters from the result, so the description doesn't come back full of markdown noise.
Inputs and outputs
- image - the input tensor. One image per call.
- text_prompt - defaults to
Describe this image in detail., but this is your lever. Ask for specifics: "describe the lighting and the lens," "list every prop," "describe the character's face in detail." - system_instruction (optional) - a slot that accepts the
ARTHAINSTRUCTtype from the pack's Gemini Instruct node, so you can override the built-in agent with your own role/task prompt.
Shared API block: api_key, model, max_tokens, temperature, with gemini-2.5-flash as the sensible default. Output is a single response string - wire it into a text display, a prompt encoder, or another Gemini node like Prompter for enrichment.
Installing it
Install the pack via ComfyUI Manager (search Artha-Gemini) or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Cyrostar/ComfyUI-Artha-Gemini
cd ComfyUI-Artha-Gemini
pip install -r requirements.txt
Dependencies are light (google-genai, Pillow, numpy, torch, soundfile) - no weights to fetch. Restart, grab an API key from Google AI Studio, and you're set.
Where people get burned
The API key, as with every node in this pack. Don't paste it into the node's api_key field - it ends up plain text in the saved workflow JSON. Put it in the pack's api.json (gemini_api_key) or set GEMINI_API_KEY as an environment variable.
Two more things worth knowing. First, this is a paid API call; captioning batches of images costs real money, so don't hook a Vision node into a big batch loop without thinking about your bill. Second, if the call fails you'll get a response string that starts with Error: rather than a red error block - the actual message lands in the ComfyUI console. And keep in mind the output is a description, not a spec: it's remarkably good, but it's an LLM's reading of the image, so treat long technical details (exact camera gear, precise hex colors) with a little skepticism before you trust them in a prompt.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | β | |
| text_prompt | STRING | Describe this image in detail. | β |
| 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. |
| system_instructionopt | ARTHAINSTRUCT | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| response | STRING | β |