(GoRi) Camera Director Skills
Stop Writing 'Cinematic' — This Node Picks the Lens for You
- clip
- vae
- latent_image
- positive
- negative
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- image_7
- image_8
- image_9
- image_10
- positive_out
- negative_out
- prompt_out
What this thing is for
Most bad prompts aren't badly written. They name no equipment. The KB's prompt-engineering essay is blunt about this: emotional modifiers do nothing, and "name a physical piece of equipment" is the highest-leverage move in a photorealism prompt. 85mm at f/1.4, shallow depth of field moves pixels. cinematic doesn't.
(GoRi) Camera Director Skills automates that. Type one line - Korean is fine - and it hands back an English prompt with a shot, lens, angle, composition, lighting setup and grade, plus a camera-move clause for video models. It's plumbing: it touches no pixels, writes text, and encodes it.
How it works
The automation dropdown hides three tiers, and the default is the smart one.
llm (AI 판단) sends your topic - and any reference images - to OpenAI, Anthropic, or a local Ollama server, which expands the scene and picks camera values. The interesting part is what it does with the reply: the model can only return labels that already exist in the node's own tables, and if fewer than three validate, the entire camera set is thrown away. That's the fix for the two classic in-graph-LLM failures - chat scaffolding leaking into your prompt, and the enhancer inventing detail you never asked for (the KB's LLM-in-ComfyUI doc calls those the defining ones). No key, no network, wrong model name? It logs a fallback and drops to the rules tier. The run still succeeds.
auto (규칙) is the offline tier: a Korean/English keyword dictionary (keywords_ko_en.json, editable) maps things like 네온, 노을, 제품 onto the camera tables. Fast, free, dumber.
manual (수동) uses your dropdowns as-is - for pasting a finished prompt and appending only camera clauses, or for a storyboard where every cut must match.
Priority order, worth internalising: a named preset beats your dropdowns; your explicit dropdown values beat the tier; anything left on 자동 (auto) is decided by the LLM or the rules engine.
Then it encodes. Put your final model's text encoder on clip and its VAE on vae; on Qwen-family checkpoints the node attaches references as reference_latents on the conditioning - the same path ComfyUI's own Qwen image-edit text-encode node uses. The negative is encoded as text only, deliberately, so vision doesn't run twice and the sampler doesn't see your reference twice. References are downscaled to a 1MP cap, so feeding it a 4K original buys you nothing but time.
Identity handling lives there too: the first connected image is the main person, later ones only fill the roles you asked for (background, outfit, prop, style), and guards stop a garment swap from fusing clothing into skin. Two named people switch to a duo path.
The inputs you'll actually set
topic- your one line, Korean or English. Ignored whileprompt_inis connected; disconnect and it comes back.automation-llmwith a key,autooffline,manualfor nothing-changes mode.preset- five presets (cinematic portrait, product hero, vertical ad, docu handheld, dramatic long shot), plus자동 (auto)and직접 설정.clip/vae- required, and they must belong to your final model, not your prompt rewriter.latent_image- optional, but connect it so the 1MP reference matches your sampling aspect ratio.image_1…image_10- optional references; slot numbers are preserved (image_3staysimage_3), and nothing is output from them.negative- preserved and appended to, never replaced.positive- accepted and ignored.
provider, model, api_key only matter on the LLM tier. Leave model blank for the provider default (gpt-4o-mini, claude-3-5-haiku-latest, or your Ollama model name).
Outputs: positive_out and negative_out to the KSampler, prompt_out - the exact string that was encoded - to Show Text. That string is also worth pasting into KREA 2 or MiniMax H3 by hand; the author suggests exactly that.
Install
Registry install: ComfyUI Manager → search GoRi Custom Nodes → install → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/kwonhyukdal/ComfyUI_GoRi_custom_nodes
# restart, then add from HF Skills / Camera
Look for the (GoRi) prefix in node search. There's no pip step and nothing to download - pyproject.toml declares zero dependencies, and the code leans on the PIL/torch/numpy already in your ComfyUI environment. The root __init__.py scans the pack's subfolders and registers each node, since ComfyUI won't recurse into nested custom_nodes folders. Copying just the GoRi-Camera-Director subfolder in works too; the layouts don't collide.
Where people get burned
Wiring positive instead of prompt_in. The most common mistake, and it's silent. That socket is legacy - the node logs that it's ignoring it. The intended path is your prompt rewriter's string output into prompt_in, and the final model's CLIP into clip. Bridge two different encoders there and your faces change.
Typing into prompt_in. You can't - it's forceInput, so it only exists as a socket. For the other direction, right-click the target's text widget and Convert widget to input to receive prompt_out.
Putting the key in api_key. That widget serialises into workflow JSON, so it travels with every share and backup. Use OPENAI_API_KEY / ANTHROPIC_API_KEY. Ollama needs no key.
Ignoring the console. When llm behaves like rules, that line says why: no key, Ollama down, or a model name auto-corrected for the provider.
Blaming the node for plastic skin. That's the grade table doing its job - 시네마틱 필릭 and 35mm 필름 carry grain - and if upstream prompts still say flawless, fix those first.
Re-feeding your own output as a reference. A generated PNG chained back into image_1 for the next cut is a copy of a copy. Keep the original, keep the same slots, pin manual, hold resolution fixed.
Honestly: this is a young one-author pack with no community footprint, so the list above comes from the shipped source and the README rather than a crowd of users. The risk profile is small - no dependencies, no daemon, no downloads, and nothing touches the network unless you pick llm.
Inputs (31)
| Name | Type | Default | Description |
|---|---|---|---|
| topic | STRING | — | |
| preset | COMBO | 7 options: 자동 (auto), 시네마틱 인물, 제품 히어로, CF 버티컬, 다큐 핸드헬드, 드라마틱 롱샷, +1 | |
| automation | COMBO | 3 options: llm (AI 판단), auto (규칙), manual (수동) | |
| shot | COMBO | 8 options: 자동 (auto), 극접 (ECU), 근접 (CU), 중근접 (MCU), 중경 (MS), 전신 (FS), +2 | |
| lens | COMBO | 9 options: 자동 (auto), 14mm 초광각, 24mm 광각, 35mm 스냅, 50mm 표준, 85mm f/1.4, +3 | |
| angle | COMBO | 9 options: 자동 (auto), 수평, 로우앵글, 하이앵글, 편각 (Dutch), 탑다운 (오버헤드), +3 | |
| composition | COMBO | 9 options: 자동 (auto), 삼분할, 중앙 대칭, 리딩라인, 대칭, 프레임 인 프레임, +3 | |
| lighting | COMBO | 11 options: 자동 (auto), 3점 스튜디오, 골든아워, 블루아워, 흐린 부드러움, 창가빛, +5 | |
| grade | COMBO | 9 options: 자동 (auto), 시네마틱 필릭, 비비드 포스터, 절제된 프리미엄, 틸-오렌지, 35mm 필름, +3 | |
| motion | COMBO | 22 options: 자동 (auto), 없음, 정지, 슬로우 푸시인, 풀백, 돌리 인, +16 | |
| speed | COMBO | 4 options: 자동 (auto), 느림, 보통, 빨름 | |
| amplitude | COMBO | 4 options: 자동 (auto), 약간, 보통, 강하게 | |
| clip | CLIP | — | |
| vae | VAE | — | |
| prompt_inopt | STRING | — | |
| provideropt | COMBO | OpenAI | 3 options: OpenAI, Anthropic, Ollama |
| modelopt | STRING | gpt-4o-mini | — |
| api_keyopt | STRING | — | |
| latent_imageopt | LATENT | — | |
| positiveopt | CONDITIONING | — | |
| negativeopt | CONDITIONING | — | |
| image_1opt | IMAGE | Reference image #1 | |
| image_2opt | IMAGE | Reference image #2 | |
| image_3opt | IMAGE | Reference image #3 | |
| image_4opt | IMAGE | Reference image #4 | |
| image_5opt | IMAGE | Reference image #5 | |
| image_6opt | IMAGE | Reference image #6 | |
| image_7opt | IMAGE | Reference image #7 | |
| image_8opt | IMAGE | Reference image #8 | |
| image_9opt | IMAGE | Reference image #9 | |
| image_10opt | IMAGE | Reference image #10 |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| positive_out | CONDITIONING | — |
| negative_out | CONDITIONING | — |
| prompt_out | STRING | — |