H3 Compact Director — Direction Controls
Seven dropdowns that keep your H3 prompt on the rails
- direction_context
What this node actually is
Despite the "Director" in the name, this node directs nothing. It has no LLM, no API key, no model - it is a lookup that turns seven dropdowns into a few lines of plain text. That text gets fed into the real director (H3CompactMultimodalEditDirector) through its direction_context input, and that node is where it changes anything.
You reach for it when the compact director keeps guessing wrong. You write one sentence like "she walks through a rainy market at night" and the LLM invents its own genre, its own camera energy, its own palette. Two dropdowns here (say Horror and Noir) pin the tone without you having to relearn how to write prompts for MiniMax H3 - the 33B omni-modal video model whose prompt grammar this whole pack is built around.
How it works
The mechanism is refreshingly boring, which is a compliment. For each label - Genre, Motion style, Visual look, Dialogue - the node collects your picks, throws away anything set to none, de-duplicates while keeping your order, and joins the survivors with +. Then it writes one line per category and stops. Genre and motion and look get two slots each, dialogue gets one. So look_1: VHS / Analog Tape plus look_2: Bodycam becomes:
Genre: Horror + Film Noir
Motion style: Slow Motion
Visual look: VHS / Analog Tape + Bodycam
Dialogue: No dialogue
The interesting part is on the receiving end. The director parses those lines, looks each selection up in its own tables, and pastes the full definition into its system prompt. SnorriCam / Body-Mounted Camera isn't treated as a magic phrase - it injects the paragraph saying the camera is rigidly mounted so the face holds still while the environment swings around it. Same for every entry in the look and motion lists (there are dozens: Super 8, MiniDV, Doorbell / Fixed Home Camera, Bullet Time Arc, Time Lapse, Speed Ramp, Seamless Loop Motion). Genre selections expand into a rule that the genre governs premise, performance, production design, lighting, pacing and sound through concrete choices, not just the label.
Dialogue is the field with the real trap: none leaves dialogue alone, while No dialogue is an explicit instruction for silence - speakers shut up. The rest are languages (English, Spanish, Japanese and so on), which is how you get spoken lines in something other than English.
Inputs and outputs
Everything is a combo with a default of none, so a freshly dropped node is inert:
genre_1/genre_2- two slots so you can blend, e.g.Horror + Comedy.motion_style_1/motion_style_2- pacing and camera language.look_1/look_2- the visual format/lens/grade decision.dialogue- silhouette or language, per the tooltip: "none leaves dialogue unchanged; No dialogue explicitly requests silence from speakers."
The single output is direction_context (STRING). Wire it to the director's direction_context input. Don't wire it anywhere near a CLIP text encode - this is director instruction, not a prompt. Note that Auto is a real selection in the genre/motion/look lists (meaning "infer it"), which is a different thing from none (meaning "add nothing"). Selecting Auto puts text in the block; all-none produces an empty string.
One genuinely fun trick, grounded in the director's code: in Elaborate and Continuous Elaborate modes you can leave the director's edit_request box empty and let the controls invent the concept. Set a genre, a motion style and a look, run it, and you get a fully written scene direction governed entirely by those selections.
Install
ComfyUI Manager → search Vision Prompt Assistant → install → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/elgalardi/ComfyUI-VisionPromptAssistant
# restart ComfyUI; update later with: git pull
No pip dependencies and no model downloads - the pack's pyproject.toml declares none, and core ComfyUI supplies everything this node touches. It does need ComfyUI 0.30 or newer (the pack is written against the newer node API), so on an older build the whole pack fails to load, not just this node.
Common issues
The director acts like nothing is connected. Check your output: if all seven fields are none you get an empty string, and the director treats empty exactly like an unplugged cable. This is the number-one confusion with this node.
Picks with no visible effect. Direction controls reinforce and constrain; they don't override an explicit instruction in edit_request. If your request says "slow, tranquil, one continuous take", setting Intense Dynamic Motion fights it rather than wins it.
Warning text in the director's validation output. Things like explicit <Picture 1> absent from final prompt come from the director's source-tag checks, not from this node - your reference images weren't named in the request.
Since this node makes no network calls and touches no GPU, it's also the safest thing in the pack to leave in a workflow you intend to share with someone else.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| genre_1 | COMBO | none | 85 options: none, Auto, Cinematic Drama, Action, Thriller, Horror, +79 |
| genre_2 | COMBO | none | 85 options: none, Auto, Cinematic Drama, Action, Thriller, Horror, +79 |
| motion_style_1 | COMBO | none | 48 options: none, Auto, Normal Motion, Fast Motion, Slow Motion, Time Lapse, +42 |
| motion_style_2 | COMBO | none | 48 options: none, Auto, Normal Motion, Fast Motion, Slow Motion, Time Lapse, +42 |
| look_1 | COMBO | none | 69 options: none, Auto, Cinematic, Naturalistic, Raw / Unpolished, Amateur Home Video, +63 |
| look_2 | COMBO | none | 69 options: none, Auto, Cinematic, Naturalistic, Raw / Unpolished, Amateur Home Video, +63 |
| dialogue | COMBO | none | none leaves dialogue unchanged; No dialogue explicitly requests silence from speakers. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| direction_context | STRING | — |