Scene Maker (TJ)
Turn one idea into a shot list your sampler will actually follow
- input_image
- clip
- Scene brief
- Visual Beat
- Visual anchor
- Scene prompt
- Scene prompt line
- Translated result
- pipe
Stop writing one prompt, start writing a scene list
The single biggest quality jump in prompt-driven work isn't a better model - it's splitting a vague idea into distinct shots. Scene Maker (TJ) is an LLM prompt composer that does exactly that: you give it an idea, a style, and a mode like Product Commercial or Music Video, and it expands the idea into a structured, scene-by-scene brief with per-shot prompts. If you've ever hand-written six variants of "woman on a beach at sunset" because one long prompt made the model mush everything together, this node is aimed straight at you.
It lives in the LLM section of the TJ_NODE pack, and it's one of the few nodes in that pack that does actual generation-side thinking rather than graph plumbing. You feed it a concept, it returns a storyboard in text form.
How it works
Scene Maker has two Model_Type backends:
textencode- the default. It uses ComfyUI'sTextGeneratenode if you have it installed, otherwise falls back to loading a CLIP directly (t5xxl_fp16.safetensorsby default). No extra Python dependencies, but it's limited to text-encoder quality.llama(gguf)- a real local Vision-LLM viallama-cpp-python. This is where the interesting output comes from. You pick a GGUF model (gguf_model) plus anmmproj_filevision projector if you're feeding in aninput_image. It's also the model that can look at a reference image and write a brief about it.
The mode dropdown sets the production genre, shot_count decides how many beats to break the idea into, and translate lets you pipe the result out in KO, EN, JP, or CN (handy if your downstream CLIP was trained on a different language than the one you think in). Both brief_override and visual_beat_override exist so you can replace the LLM's copy with your own and still get the structured outputs.
The outputs that matter
The node returns seven things, and honestly you'll mostly use three:
- Scene brief - the overall creative summary.
- Visual Beat - the per-shot breakdown; this is the list you actually animate or generate against.
- Scene prompt - a merged, ready-to-use prompt (and
Scene prompt linegives it as a list for batch feeding). - Visual anchor - the fixed-elements bit that stays consistent across shots.
- pipe - a
TJ_SCENE_PIPEbundle you feed into Scene Maker Result - pipe(TJ) to unpack everything at a distance, or into any downstream node that accepts the pipe type.
Installing it
Scene Maker ships inside the TJ_NODE pack, so first install that:
cd ComfyUI/custom_nodes
git clone https://github.com/designloves2/ComfyUI-TJ_NODE.git
Or use ComfyUI Manager → Install Custom Nodes → search TJ_NODE. Then restart.
The textencode backend needs the TextGenerate node pack installed (search it in Manager). The llama(gguf) backend needs a GGUF model in ComfyUI/models/text_encoders/. The default expects the author's qwen3.5-4B-Uncensored-HauhauCS-Aggressive-Q8_0.gguf, but any GGUF you drop in shows up in the dropdown. One catch: the default pip install llama-cpp-python is CPU-only and slow, and it can't load the newest models. For GPU speed you'll want to build it from source - the pack ships build_llama_gemma4.bat for Windows and the README's LLAMA_GPU_SETUP.md walks through a CMAKE_ARGS="-DGGML_CUDA=on" build.
Where people get burned
The most common failure is a vision error on the llama(gguf) backend - that's your llama-cpp-python being too old or CPU-only. Either update/reinstall it with GPU support, or disconnect input_image and use text-only briefs. If you see "Required ComfyUI node not available," you're missing the TextGenerate pack. And remember the whole TJ_NODE thing of wireless get_name/auto_set: Scene Maker can receive an idea wirelessly and publish results under a name, so you can keep the LLM in one corner of a big workflow without dragging prompt text wires across the canvas.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| Model_Type | COMBO | textencode | 2 options: textencode, llama(gguf) |
| clip_name | COMBO | t5xxl_fp16.safetensors | 1 options: t5xxl_fp16.safetensors |
| gguf_model | COMBO | qwen3.5-4B-Uncensored-HauhauCS-Aggressive-Q8_0.gguf | 1 options: qwen3.5-4B-Uncensored-HauhauCS-Aggressive-Q8_0.gguf |
| mmproj_file | COMBO | mmproj-qwen3.5-4B-Uncensored-HauhauCS-Aggressive-BF16.gguf | 2 options: none, mmproj-qwen3.5-4B-Uncensored-HauhauCS-Aggressive-BF16.gguf |
| chat_handler | COMBO | Auto-detect | 1 options: Auto-detect |
| n_gpu_layers | INT | -1-1–999 | — |
| n_ctx | INT | 8192512–32768 | — |
| get_name | COMBO | (none) | 1 options: (none) |
| auto_set | BOOLEAN | false | — |
| mode | COMBO | Product Commercial | 3 options: Product Commercial, Music Video, Short Drama |
| translate | COMBO | KO | 4 options: KO, EN, JP, CN |
| idea | STRING | A beautiful woman is standing with her back to the camera on a beach at sunset, wearing a red bikini. | — |
| style | STRING | cinematic, high-end perfume commercial, elegant composition | — |
| fixed_elements | STRING | Golden lighting, warm tones | — |
| shot_count | INT | 61–24 | — |
| seed | INT | 10–18446744073709550000 | — |
| input_imageopt | IMAGE | — | |
| clipopt | CLIP | — | |
| brief_overrideopt | STRING | — | |
| visual_beat_overrideopt | STRING | — |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| Scene brief | STRING | — |
| Visual Beat | STRING | — |
| Visual anchor | STRING | — |
| Scene prompt | STRING | — |
| Scene prompt line | STRING | — |
| Translated result | STRING | — |
| pipe | TJ_SCENE_PIPE | — |