Nodes/ComfyUI_GoRi_custom_nodes/(GoRi) Camera Director Skills
ComfyUI Node

(GoRi) Camera Director Skills

Stop Writing 'Cinematic' — This Node Picks the Lens for You

By kwonhyukdal·Created about 10 hours ago·Updated about 8 hours ago· 0
(GoRi) Camera Director Skills
  • 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
◄topic►
◄preset▾►
◄automation▾►
◄shot▾►
◄lens▾►
◄angle▾►
◄composition▾►
◄lighting▾►
◄grade▾►
◄motion▾►
◄speed▾►
◄amplitude▾►
◄prompt_in—►
◄providerOpenAI►
◄modelgpt-4o-mini►
◄api_key►

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 while prompt_in is connected; disconnect and it comes back.
  • automation - llm with a key, auto offline, manual for 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_3 stays image_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.

CategoryHF Skills/Camera

Inputs (31)

NameTypeDefaultDescription
topicSTRING—
presetCOMBO7 options: 자동 (auto), 시네마틱 인물, 제품 히어로, CF 버티컬, 다큐 핸드헬드, 드라마틱 롱샷, +1
automationCOMBO3 options: llm (AI 판단), auto (규칙), manual (수동)
shotCOMBO8 options: 자동 (auto), 극접 (ECU), 근접 (CU), 중근접 (MCU), 중경 (MS), 전신 (FS), +2
lensCOMBO9 options: 자동 (auto), 14mm 초광각, 24mm 광각, 35mm 스냅, 50mm 표준, 85mm f/1.4, +3
angleCOMBO9 options: 자동 (auto), 수평, 로우앵글, 하이앵글, 편각 (Dutch), 탑다운 (오버헤드), +3
compositionCOMBO9 options: 자동 (auto), 삼분할, 중앙 대칭, 리딩라인, 대칭, 프레임 인 프레임, +3
lightingCOMBO11 options: 자동 (auto), 3점 스튜디오, 골든아워, 블루아워, 흐린 부드러움, 창가빛, +5
gradeCOMBO9 options: 자동 (auto), 시네마틱 필릭, 비비드 포스터, 절제된 프리미엄, 틸-오렌지, 35mm 필름, +3
motionCOMBO22 options: 자동 (auto), 없음, 정지, 슬로우 푸시인, 풀백, 돌리 인, +16
speedCOMBO4 options: 자동 (auto), 느림, 보통, 빨름
amplitudeCOMBO4 options: 자동 (auto), 약간, 보통, 강하게
clipCLIP—
vaeVAE—
prompt_inoptSTRING—
provideroptCOMBOOpenAI3 options: OpenAI, Anthropic, Ollama
modeloptSTRINGgpt-4o-mini—
api_keyoptSTRING—
latent_imageoptLATENT—
positiveoptCONDITIONING—
negativeoptCONDITIONING—
image_1optIMAGEReference image #1
image_2optIMAGEReference image #2
image_3optIMAGEReference image #3
image_4optIMAGEReference image #4
image_5optIMAGEReference image #5
image_6optIMAGEReference image #6
image_7optIMAGEReference image #7
image_8optIMAGEReference image #8
image_9optIMAGEReference image #9
image_10optIMAGEReference image #10

Outputs (3)

NameTypeDescription
positive_outCONDITIONING—
negative_outCONDITIONING—
prompt_outSTRING—