Nox Prompt Builder
The formula-driven Wan 2.2 prompt assembler at the heart of the pack
- prompt
- negative_prompt
- aesthetic_notes
- dynamic_notes
- preset_status
This is the node the whole pack is built around. Nox Prompt Builder is described in the README as a "formula-driven Wan 2.2 builder," and that's the honest pitch: it takes a subject, a scene, and a motion arc, then assembles them into a structured prompt using one of four formulas, with curated vocabulary for lighting, camera, color, motion, and style - plus inline overrides and seeded randomization. If you've been typing the same "cinematic, highly detailed" preamble into every prompt, this is the node that turns prompt writing into filling in a form.
How it works
The four formula options in constants.py define the assembly order: Basic is Subject + Scene + Motion; Advanced adds aesthetic controls and stylization; Story Spotlight focuses subject, environmental beat, camera language, and emotional tone; Trailer Teaser opens on the hook. The builder resolves your dropdowns (light source, light quality, time of day, shot size, lens, color tone, motion type, emotion, visual style, special effect) against the shared vocabulary dictionaries, then formats the result according to keyword_style.
keyword_style is the control that matters for model fit: auto emits labeled clauses, inline flows as natural prose, compact produces dense strings - which is the Wan-style format the pack is tuned for. There's also randomize_missing: leave dropdowns at "None" and it fills them from its curated vocabularies using random_seed, which is genuinely great for idea batches where you want a loose family of variations. palette_overrides and custom_keywords let you inject output from Nox Prompt Palette Mixer, and lighting_prompt / camera_prompt (plus their summary and notes siblings) are pass-throughs for Nox Prompt Lighting Master and Nox Prompt Camera Master - that's the pack's whole "centralized lighting/camera control" story.
Inputs and outputs that matter
The required four are formula, subject_focus, scene_setting, and motion_arc. After that, set keyword_style, pick your aesthetic dropdowns, and enable randomize_missing with a seed if you want batch variation. Outputs: prompt (the goods - straight to positive conditioning), negative_prompt, aesthetic_notes and dynamic_notes (human-readable summaries, useful for review), and preset_status. Standard preset_action/preset_name save/load applies.
Installing it
Pack install, once. ComfyUI Manager: search "Nox Prompter", install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/jamesk9526/NoxPrompter-ComfyUI-CustomNode
Restart and the NoxPrompter category appears. No requirements.txt, no model downloads - pure stdlib.
Where people get burned
The Wan 2.2 framing cuts both ways. The pack's compact style and block structure are exactly what an LLM-encoded video model wants, but a few habits leak in from SDXL days that do nothing on Wan: the default model_emphasis ("cinematic aesthetic control, precise semantic adherence") is flavor text that an LLM encoder mostly ignores, and any (word:1.3)-style weights you add elsewhere get silently discarded. If you're feeding this into an SDXL-lineage checkpoint instead, the compact style reads worse - that family wants tag-style prompting, and you'll want keyword_style on inline. Also note the README's python test_nodes.py verification step doesn't ship in the repo, and its old ComfyNoxPrompter URL is stale - use the clone command above.
Inputs (42)
| Name | Type | Default | Description |
|---|---|---|---|
| formula | COMBO | Advanced Formula | 4 options: Basic Formula, Advanced Formula, Story Spotlight, Trailer Teaser |
| subject_focus | STRING | Battle-hardened warrior drenched in rain, wearing leather armor and fur | — |
| scene_setting | STRING | Muddy battlefield at night, lightning in the distance, flames flickering | — |
| motion_arc | STRING | Charges forward roaring, swings blade in a slow-motion crash zoom | — |
| narrative_hookopt | STRING | Camera locks onto her determined eyes as thunder cracks overhead | — |
| model_emphasisopt | STRING | Cinematic aesthetic control, precise semantic adherence | — |
| light_sourceopt | COMBO | Daylight | 48 options: None, Daylight, Artificial Light, Moonlight, Practical Light, Firelight, +42 |
| light_qualityopt | COMBO | Soft Light | 30 options: None, Soft Light, Hard Light, Top Light, Side Light, Backlight, +24 |
| time_of_dayopt | COMBO | Dusk | 24 options: None, Daytime, Nighttime, Dusk, Sunset, Dawn, +18 |
| shot_sizeopt | COMBO | Medium Close-up | 21 options: None, Close-up, Medium Close-up, Medium Shot, Medium Long Shot, Long Shot, +15 |
| compositionopt | COMBO | Balanced | 20 options: None, Centered, Balanced, Right-weighted, Left-weighted, Symmetrical, +14 |
| lens_focalopt | COMBO | Medium | 18 options: None, Medium, Wide Angle, Long, Telephoto, Fisheye, +12 |
| lens_angleopt | COMBO | None | 20 options: None, Over-the-shoulder, High Angle, Low Angle, Tilted Angle, Aerial Shot, +14 |
| lens_typeopt | COMBO | Single Shot | 19 options: None, Single Shot, Two Shot, Three Shot, Group Shot, Establishing Shot, +13 |
| camera_basicopt | COMBO | None | 24 options: None, Dolly In, Push-in, Pull-out, Pan Right, Pan Left, +18 |
| camera_advancedopt | COMBO | None | 32 options: None, Handheld, Compound, Following, Orbit, Steadicam Glide, +26 |
| color_toneopt | COMBO | Warm Tone | 18 options: None, Warm Tone, Cool Tone, High Saturation, Low Saturation, Pastel Tone, +12 |
| motion_typeopt | COMBO | Running | 28 options: None, Running, Skateboarding, Soccer, Tennis, Ping Pong, +22 |
| emotionopt | COMBO | Joy | 23 options: None, Anger, Pleasure, Slight sadness, A Little Fear, Fear, +17 |
| visual_styleopt | COMBO | Anime | 34 options: None, Felt Style, 3D Cartoon, Pixel Art, Puppet Animation, 3D Game, +28 |
| special_effectopt | COMBO | None | 20 options: None, Tilt-shift, Time-lapse, Light Trails, Chromatic Bloom, Particle Swarm, +14 |
| keyword_styleopt | COMBO | auto | 3 options: auto, inline, compact |
| quality_profileopt | COMBO | Balanced | 4 options: Balanced, Cinematic, Minimal, Narrative |
| randomize_missingopt | BOOLEAN | false | — |
| random_seedopt | INT | 00–1000000 | — |
| palette_overridesopt | STRING | — | |
| extra_descriptorsopt | STRING | Model feature emphasis: complex & dynamic motion | — |
| lighting_promptopt | STRING | — | |
| lighting_summaryopt | STRING | — | |
| lighting_technical_notesopt | STRING | — | |
| custom_keywordsopt | STRING | — | |
| negative_promptopt | STRING | — | |
| prompt_prefixopt | STRING | — | |
| prompt_suffixopt | STRING | — | |
| camera_promptopt | STRING | — | |
| camera_summaryopt | STRING | — | |
| camera_notesopt | STRING | — | |
| camera_directivesopt | STRING | — | |
| prompt_filter_enabledopt | BOOLEAN | true | — |
| prompt_filter_profileopt | COMBO | balanced | 4 options: balanced, cinematic, minimal, narrative |
| preset_actionopt | COMBO | none | 4 options: none, save, load, list |
| preset_nameopt | STRING | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |
| negative_prompt | STRING | — |
| aesthetic_notes | STRING | — |
| dynamic_notes | STRING | — |
| preset_status | STRING | — |