Script Picker (JSON dropdown)
Hand your H3 chain a saved script from a dropdown
- prompts_json
- path
- speakers
The ComfyUI-H3-Multishot pack is built around one idea: MiniMax-H3 natively only makes 10–15 second blocks, so it chains those blocks into one unbroken take. And what drives the chain is a script - one prompt per shot, in order. The full workflow normally has a local LLM (Ollama, qwen3:14b) write that script for you, which is great until you've found a script you like and want to reuse it, or you want to skip the LLM entirely. That's what Script Picker (JSON dropdown) is for: it turns a folder of saved JSON scripts into a single dropdown, so you pick the shot list instead of re-running the writer or pasting JSON into a text box on the canvas.
Think of it as the manual-transmission version of the pack's prompt lane. The CORE workflow ships the same no-LLM philosophy - feed the sampler a hand-written script and it renders. This node is the ergonomic wrapper: a {"prompts": [...]} file in the right folder, one dropdown, done.
How it works
The node scans <ComfyUI>/input/joyecho_prompts/ for every *.json file and presents them as the script dropdown (the old input/joyecho_prompts name is a JoyEcho-ancestry hangover - the pack's writer, JoyEcho_LLMEnhance, is a bundled and modified copy of that stack). When you pick one, it reads the file, checks it's valid JSON, and requires a non-empty prompts array (a shots key works too) - if the JSON is malformed or the array is missing, it fails with a message that names the exact problem instead of dying deep inside the text encoder twenty minutes later.
Two details make it feel alive. First, it tracks the file's modification time via ComfyUI's IS_CHANGED mechanism, so editing the file on disk automatically re-triggers the node - no reselecting, no clearing the cache. Second, it stashes what the downstream generator needs: it works out who speaks in each shot and stashes the speaker order (plus any voice_refs voice-casting map) so the sampler's audio memory can tag slots by character. You don't have to wire that - it's a module-level handoff, so a saved graph that never knew about this node picks it up anyway.
The inputs and outputs that matter
Honestly, there's one input and it's the whole node: script, the dropdown of your JSON files. New file added? Press R (or the refresh button) to repopulate the list.
The three outputs:
prompts_json- the raw file contents. Wire this into the H3 sampler'sscriptinput (or JoyEcho_TextEncode'sprompts). This is the one that matters.path- the absolute path to the file. Mostly for debugging, or if another node wants the location itself.speakers- a space-joined list of the per-shot speaker tags derived from the script. Feed it somewhere that wants to know who's talking; if you don't, the generator falls back to the stashed values anyway.
Worth knowing about the script format while you're here: each element of prompts is one shot, and you can attach a speakers array or a voice_refs map - {"Character": "path/to/clip.mp4"} - to cast a character's voice from an actual audio clip instead of rolling it from text. That's the H3 way to keep a specific voice across the chain.
Installing it
You don't install this node alone - it ships in the pack. ComfyUI-Manager, search H3 Multishot (it's on the Registry as comfyui-h3-multishot), or:
cd ComfyUI/custom_nodes
git clone https://github.com/jlucasmcrell/ComfyUI-H3-Multishot
Restart ComfyUI. Requirements: ComfyUI v0.30.0+ (that's when native MiniMax-H3 support landed), plus the H3 model files - the diffusion checkpoint, the text encoder, and the video + audio VAEs - in the usual models/ folders. This node itself has zero third-party dependencies; it's json + pathlib plus ComfyUI's own folder_paths. The pack famously declares an empty dependency list, and the picker is a good example of why that works.
Where people get burned
The failure modes are self-explanatory once you know them, and the node prints the fix:
- Empty dropdown. There's no
.jsonininput/joyecho_prompts/. The folder is created for you; put a script in it and hitR. not valid JSON/ "must contain a non-empty 'prompts' (or 'shots') array". Your file isn't a script the sampler can eat. Check it withpython -m json.toolif you're unsure - and note the file must be an array of shot prompts, not a single blob.- File deleted or renamed mid-workflow. Saved graphs remember the filename; if it vanishes, the node errors with the missing path. Refresh and re-pick.
One thing that's not a bug: if you don't want the LLM writer at all, you don't need to install Ollama or pull qwen3:14b - that's exactly the path this node exists to make painless. The writer is for generating scripts; this is for reusing the ones you already like.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| script | COMBO | 1 options: (no .json in input/joyecho_prompts) |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| prompts_json | STRING | — |
| path | STRING | — |
| speakers | STRING | — |