🔱 Gemini Camera
Lens, film stock, motion, and every shot in between
- camera
- markdown
If you've read the modern guidance on LLM-encoded models, you know the single highest-leverage phrase you can put in a prompt is the name of a physical camera. Gemini Camera takes that idea and builds it a UI: 16 dropdowns that cover everything a film student would specify - camera type, shot size, lens, angle, focal length, depth of field, aspect ratio, sensor type, framing, and even a camera model dropdown that goes from Leica M6 to ARRI Alexa Mini to GoPro. There's a motion dropdown (push-in, dolly zoom, whip pan, steadicam, orbiting…) that's clearly there for video work, and a filmstock dropdown full of Kodak and Fuji emulsions. If you want your image to look shot on Portra 400, you no longer have to remember the recipe - it's a menu item.
It's one of the 🔱 Artha-Gemini nodes (Artha/LLM/GEMINI), and it lives on the composition side of the family: camera (type ARTHACAM) wires into Gemini Compose, alongside subject, style, light and scene. That's the node that merges the composition pieces into a single prompt, the way Gemini Portrait merges the character pieces.
How it works
Standard Artha two-mode pattern. With use_image off, no API call happens - your selections are packed into a dict and sent down the camera wire for Compose to consume. randomize fills every field with a random pick from its options, which is actually a nice way to generate variations when you want to batch a look. With use_image on, the node hands your image to Gemini Vision with a camera-analysis agent that returns a CAMERA … bullet list of what it thinks the photo was shot with. The agent has one fun rule baked in: if it detects the image is a painting or illustration, it returns CAMERA: NONE rather than inventing settings - so feeding it anime art doesn't produce garbage about apertures.
Like Gemini Style, it also emits a markdown output: the entire option catalog (all 16 categories and their descriptions) rendered as a reference document you can view with the pack's Gemini Markdown display node. Given there are 24 camera models and 15 film stocks, the reference actually earns its place on the canvas.
The inputs that matter
type- the camera body category (DSLR, mirrorless, phone, drone, 360…).lenses+focal_length- the pair that sells the look hardest. A 50mm portrait read is worth a paragraph of prose.motion- skip it for stills, set it for video. This is where the "or video prompting" in the pack's description comes from.aspect_ratioandframing- decide the shape of the frame before anything downstream.camera_models+filmstock- the named-physics pair. Leica M6 + Portra 400 says everything about color and grain.
Everything else - context, shot, angles, depth_of_field, sensor_type, camera_style, color, texture - is refinement you add when the basics aren't enough. Then the standard pack cluster: api_key, model (gemini-2.5-flash), max_tokens, temperature, randomize, use_image, image.
Install & gotchas
Same pack, one install, every 🔱 node:
cd ComfyUI/custom_nodes
git clone https://github.com/Cyrostar/Artha-Gemini
cd Artha-Gemini
pip install -r requirements.txt
Restart ComfyUI (or let ComfyUI Manager handle it - search "Artha-Gemini"). No model downloads; the only external need is a Gemini API key from Google AI Studio, and only use_image mode spends it.
The usual two traps apply: image is a file dropdown (upload a file or pick one from ComfyUI/input), not an IMAGE tensor socket - and image mode bills a Gemini call every run. If you put your key in the api_key field it sits in plain text in the workflow JSON; the pack's api.json (gemini_api_key) or a GEMINI_API_KEY env var keeps it out of your saved files. And note the dropdown mode needs no key at all, so you can build camera specs entirely offline if you're only feeding your own choices to Compose.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| type | COMBO | NONE | 13 options: NONE, DSLR, MIRRORLESS, PHONE, FILM CAMERA, DIGITAL CINEMA CAMERA, +7 |
| context | COMBO | NONE | 11 options: NONE, PROFESSIONAL, CONSUMER, HOBBYIST, SURVEILLANCE, CINEMATIC, +5 |
| shot | COMBO | NONE | 8 options: NONE, CLOSE UP SHOT, EXTREME CLOSE UP SHOT, MEDIUM SHOT, MEDIUM CLOSE UP SHOT, MEDIUM LONG SHOT, +2 |
| lenses | COMBO | NONE | 6 options: NONE, WIDE ANGLE LENS, STANDARD LENS, TELEPHOTO LENS, MACRO LENS, FISHEYE LENS |
| angles | COMBO | NONE | 6 options: NONE, OVER THE SHOULDER, HIGH ANGLE, LOW ANGLE, TILTED ANGLE, AERIAL ANGLE |
| motion | COMBO | NONE | 16 options: NONE, PUSH IN, PULL BACK, DOLLY IN/OUT, ZOOM IN/OUT, TRACKING (FOLLOW), +10 |
| focal_length | COMBO | NONE | 8 options: NONE, 14MM, 24MM, 35MM, 50MM, 85MM, +2 |
| depth_of_field | COMBO | NONE | 4 options: NONE, SHALLOW DOF, DEEP DOF, SELECTIVE FOCUS |
| aspect_ratio | COMBO | NONE | 14 options: NONE, 1:1, 4:3, 3:2, 5:4, 6:4.5, +8 |
| sensor_type | COMBO | NONE | 7 options: NONE, FULL FRAME, APS-C, MICRO FOUR THIRDS, MEDIUM FORMAT, DIGITAL CINEMA CAMERA, +1 |
| camera_style | COMBO | NONE | 7 options: NONE, HANDHELD, TRIPOD, DRONE, ROBOTIC ARM, STABILIZED GIMBAL, +1 |
| framing | COMBO | NONE | 6 options: NONE, CENTERED, LEFT THIRD, RIGHT THIRD, LOW FRAME, HIGH FRAME |
| camera_models | COMBO | NONE | 24 options: NONE, LEICA M6, CANON AE-1, NIKON F3, FUJI X100V, SONY A7S III, +18 |
| filmstock | COMBO | NONE | 16 options: NONE, KODAK VISION3 500T, KODAK VISION3 250D, KODAK EKTACHROME, KODAK PORTRA 400, KODAK GOLD 200, +10 |
| color | COMBO | NONE | 16 options: NONE, WARM TONE, COOL TONE, HIGH SATURATION, LOW SATURATION, MONOCHROME, +10 |
| texture | COMBO | NONE | 9 options: NONE, FILM_GRAIN, VIGNETTE, BLOOM, HALATION, CHROMATIC_ABERRATION, +3 |
| 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 (2)
| Name | Type | Description |
|---|---|---|
| camera | ARTHACAM | — |
| markdown | STRING | — |