APNext H3 Presentation Writer
The APNext H3 Presentation Writer
- llm
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- image_7
- image_8
- image_9
- scenes
- durations
- lengths
- scenes_text
- synopsis
- script
- cast
- scene_count
- total_seconds
- session_id
- info
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- image_7
- image_8
- image_9
- project_name
The name undersells it. You don't write a presentation with this node - you hand it a pile of source material (findings, benchmark numbers, a changelog, release notes, code) and it directs a video of someone presenting it: a presenter on camera walks through the material scene by scene, charts and numbers on screen, script, visuals and pacing all generated. No audio input. The talk is the output.
This is one of the pack's MiniMax-H3 prompt writers, so know the division of labour. H3 is MiniMax's 33B omni-modal video model: it renders 4–15 second clips with native stereo audio, and its weights opened in August 2026 (mind the licence's fine print on who may run them). This node doesn't render anything. It writes the prompt - one complete, spec-compliant H3 prompt per scene. You feed scenes, durations and lengths into a MiniMax H3 video node, then stitch the clips with H3 Scenes Join, and that's your talk.
How it actually works
The writing is done by your locally installed Claude Code CLI, not an API call. That's the pack's whole trick: it uses Claude Code's own login, so the work counts against your Claude subscription seat rather than metered API spend, and Claude Code can be agentic about it. Under the hood the node loads the official MiniMax writing guides as the system prompt and adds a contract it calls "FACTS ARE SACRED" - every number, unit, percentage, date and proper noun spoken or shown comes verbatim from your source_material. It never rounds, extrapolates or "improves" a value. That's the point: the chart values are true to your data, because an unconstrained LLM will happily invent a nicer number.
The material is split into scene_count scenes (default 6, up to 24), each a full four-section H3 prompt with its own duration. Scene 01 hooks and names the topic, the middle scenes take one point each, the last lands the takeaway. The model writes in chunks (scenes_per_call, default 4) so a run stays inside the watchdog; a timed-out chunk is retried at half size. A 6-scene run with research on can take 10–20 minutes, so timeout_seconds (1200 by default) is worth knowing about.
The inputs that matter
source_material- your ground truth. Paste everything the talk should contain.direction- who presents, where, and the tone; empty means the model stages it to fit the material.presentation_format- how it's staged: keynote stage with a giant LED screen, whiteboard explainer, news studio, lab demo, boardroom pitch, documentary, or tech screencast.scene_countandvisual_aids- how many scenes, and how often a chart is on screen (Auto / Every scene / Key data moments / None).
Everything else - visual_style (1,100+ curated looks), dialogue_language, wardrobe/location locks, reference images - behaves like the rest of the pack's writers. One deliberate quirk: wildness here only loosens the staging (weird camera moves, surreal set dressing). The facts, chart values and on-screen text stay verbatim at every level.
Installing it
Install the pack the normal way - ComfyUI Manager, search "comfyui_dagthomas", or:
cd ComfyUI/custom_nodes
git clone https://github.com/dagthomas/comfyui_dagthomas
cd comfyui_dagthomas
pip install -r requirements.txt
Then restart. The pack's requirements.txt is just SDKs - no model downloads for this node. The real dependency is Claude Code itself: install the CLI, run it once to log in, and make sure claude is on PATH. No API key lives in ComfyUI.
Where people get burned
First, it's your subscription seat, and Claude Code's window is a rolling 5-hour rate limit (rateLimitType: five_hour). Heavy multi-scene runs can exhaust it; the node prints a clear warning. The cost=$… figure in info is the CLI's estimate of equivalent API cost, not a charge. Second, research (off by default) sends Claude Code to the web first - real location, wardrobe, light - which is genuinely better but slow and reaches the internet. Third, the director skills cost a few extra seconds and tokens per run; they're the reason the output follows the H3 spec instead of a paraphrase, so leave them on. And if you want a cheap local rewrite instead of the CLI, connect an APNext H3 LLM Backend to the llm socket - the node then writes with Ollama or any OpenAI-compatible server.
Wire scenes (list), durations (seconds per scene) and lengths (H3 frame counts) to the video node; script and synopsis are for reference, session_id chains a refiner. Attached images come back out on image_1..9, so the numbering the prompt sees and the video node sees never drift.
Inputs (60)
| Name | Type | Default | Description |
|---|---|---|---|
| source_material | STRING | The content to present - findings, benchmark numbers, a paper abstract, a changelog, data tables, code, release notes. This is the GROUND TRUTH: every number, name and claim spoken or shown on screen comes verbatim from here, and nothing is invented. | |
| direction | STRING | The presentation concept: who presents, where, the tone (enthusiastic keynote, calm lecture, playful explainer), the look, who the audience is. Free text; empty = the model stages it to fit the material. | |
| presentation_format | COMBO | Auto | How the talk is staged and where the charts live (stage screen, whiteboard, studio insets, screencast). Auto picks what fits the material; the direction text can override any of it. |
| scene_count | INT | 61–24 | How many scenes/clips the presentation is told in. Scene 01 hooks and names the topic, the middle scenes cover one point each, the last scene lands the takeaway. |
| duration_mode | COMBO | Vary 5-15s (let Claude pace each scene) | 2 options: Fixed (every scene = scene_duration), Vary 5-15s (let Claude pace each scene) |
| scene_duration | FLOAT | 12.05–15 | Seconds per scene in Fixed mode, and the fallback when the model omits a duration in Vary mode. |
| visual_aids | COMBO | Auto (a graphic wherever it helps) | How often a chart, graph, diagram, table or code panel is on screen. Every graphic shows real values from the source material with short verbatim labels. |
| continuity_mode | COMBO | Independent clips (hard cuts, T2V openers) | Independent clips: each scene is its own clip with hard cuts. Continuous chain: scenes are written for C2V / motion-context chaining - scene N+1 opens on scene N's last frame, one continuous take. |
| visual_style | COMBO | Live-action, cinematic | Opens every [Shot 1]; kept identical across the whole presentation. |
| dialogue_language | COMBO | English | The language the presenter speaks (the <d>[...] tag). |
| wildness | INT | 100–100 | How wild the STAGING may get: 0 = sober and literal, ~50 = weird and imaginary elements creep in, 100 = totally unhinged. Only the level is sent to the model - no specific surreal elements are injected - and the facts, chart values and on-screen text stay verbatim from the source material at every level. |
| model | COMBO | sonnet | Who writes the prompt. sonnet / opus / haiku / fable / default are Claude Code aliases (`default` = whatever the CLI is configured for). `codex` is the OpenAI Codex CLI with its configured model (shown when installed; `codex:<model-id>` in an H3 LLM Backend picks a specific one). ollama: / lmstudio: / local: entries are whatever your local servers were serving when the page loaded; pick one to run fully offline. Anything not listed goes in model_override. |
| research | BOOLEAN | false | Let the agent CLI (Claude Code or Codex) search the web for real references before writing - the actual location, wardrobe, lighting and physics. Slower, and it reaches the internet. |
| director | BOOLEAN | true | Load the H3 director skills (data/h3/skills): the core writing rules, the format this node emits, and style/motion craft, each with a reference library of gold examples and style anchors that Claude Code reads on demand. Costs a few extra seconds and tokens per run. |
| use_subscription | BOOLEAN | true | Hide the API key from the CLI so it uses your login and subscription seat (ANTHROPIC_API_KEY for Claude Code, OPENAI_API_KEY for Codex). Turn off to bill the API key instead. |
| timeout_seconds | INT | 120060–7200 | How long to wait PER CALL before the node gives up on the CLI (this is the node's own watchdog, not a Claude limit). Single H3 prompts take 25-60s; a multi-scene chunk with director/research on can take 10-20 minutes. The multi-scene writers retry a timed-out chunk at half size automatically. |
| seed | INT | -1-1–18446744073709550000 | Controls caching. -1 re-runs every queue; any fixed value reuses the cached result. |
| cast_1opt | STRING | A cast line or block from an H3 Characters node (its `cast` output): the presenter, a co-host, an interviewee. | |
| cast_2opt | STRING | A cast line or block from an H3 Characters node (its `cast` output): the presenter, a co-host, an interviewee. | |
| cast_3opt | STRING | A cast line or block from an H3 Characters node (its `cast` output): the presenter, a co-host, an interviewee. | |
| cast_4opt | STRING | A cast line or block from an H3 Characters node (its `cast` output): the presenter, a co-host, an interviewee. | |
| extra_castopt | STRING | Presenter(s) typed by hand, one per line, e.g. `Presenter: a woman in her 40s with grey-streaked hair and rectangular glasses`. Merged with the cast sockets. Empty = the model invents a presenter that fits the material. | |
| custom_dialogue_languageopt | STRING | — | |
| custom_visual_styleopt | STRING | Any visual style not in the dropdown; overrides the dropdown when filled in. | |
| wardrobeopt | STRING | Wardrobe lock, one line per CAST member, e.g. `Sheldon: brown corduroy jacket, green Flash T-shirt, khaki trousers, small silver ring in the left nostril`. Used word-for-word in subject_definitions and at the character's first appearance in each scene; later shots carry it on the `<Subject N>` label, as H3's guide specifies. Empty = Claude fixes one outfit per cast member itself (in the synopsis) and reuses it. Only the cast is locked - extras and background people are described where they appear and never carry an anchor set. | |
| locationsopt | STRING | Location lock, one line per recurring place, e.g. `Sheldon's living room: beige three-seat sofa facing a wall-mounted TV on the LEFT, tall bookshelf of comics behind it, bay window with white blinds on the RIGHT, warm tungsten floor lamp in the far corner`. Used word-for-word in every scene set there, so the room looks the same in every scene. Empty = the model fixes each recurring place itself (in the synopsis) and repeats it. | |
| enforce_wardrobeopt | BOOLEAN | true | After writing, check that each character's FIRST appearance in a scene states all of that character's wardrobe anchors verbatim, and that every scene set in a locked location restates that location's anchors. If anything is dropped or changed, the model gets one repair turn in the same session. Off = trust the first answer. |
| extra_instructionsopt | STRING | — | |
| image_notesopt | STRING | Per-picture notes, one per line: `Image 1: the presenter`, `Image 2: the lecture hall, use as the location`. With reference_image_use = Characters only (the default), a note like that is the ONLY way a picture may be read as a location or prop. | |
| include_soundscapeopt | BOOLEAN | true | Room tone, audience reactions, marker squeaks, keyboard clicks. Off = `N/A`. |
| include_non_diegetic_musicopt | BOOLEAN | false | A light music bed under the talk. Off (the default) keeps the voice clean, which reads as more credible for data-heavy material. |
| resume_session_idopt | STRING | Continue an earlier run by feeding it that node's session_id. The whole conversation, images included, is still in context. A session sticks to its backend: Claude Code ids resume with Claude Code, `codex-` ids with Codex, `local-` ids with the same local model. | |
| working_diropt | STRING | A folder Claude Code may read while writing - a script, a shot list, lookbook notes. Empty uses a throwaway scratch folder, which is the safe default. | |
| llmopt | APNEXT_LLM | Optional. Connect an APNext H3 LLM Backend node to write with Ollama, LM Studio, another OpenAI-compatible server or an API model instead of Claude Code. Overrides the model dropdown while connected. | |
| context_1opt | STRING | Steering input from another APNext node (Time, Scene, Poses, Plots, Feelings, Cinematic, Science, Geography, Architecture, Fashion, ...). The node detects which kind it is and tells Claude how to use it. Sockets grow as you connect them. | |
| context_2opt | STRING | Steering input from another APNext node (Time, Scene, Poses, Plots, Feelings, Cinematic, Science, Geography, Architecture, Fashion, ...). The node detects which kind it is and tells Claude how to use it. Sockets grow as you connect them. | |
| context_3opt | STRING | Steering input from another APNext node (Time, Scene, Poses, Plots, Feelings, Cinematic, Science, Geography, Architecture, Fashion, ...). The node detects which kind it is and tells Claude how to use it. Sockets grow as you connect them. | |
| context_4opt | STRING | Steering input from another APNext node (Time, Scene, Poses, Plots, Feelings, Cinematic, Science, Geography, Architecture, Fashion, ...). The node detects which kind it is and tells Claude how to use it. Sockets grow as you connect them. | |
| context_5opt | STRING | Steering input from another APNext node (Time, Scene, Poses, Plots, Feelings, Cinematic, Science, Geography, Architecture, Fashion, ...). The node detects which kind it is and tells Claude how to use it. Sockets grow as you connect them. | |
| context_6opt | STRING | Steering input from another APNext node (Time, Scene, Poses, Plots, Feelings, Cinematic, Science, Geography, Architecture, Fashion, ...). The node detects which kind it is and tells Claude how to use it. Sockets grow as you connect them. | |
| context_7opt | STRING | Steering input from another APNext node (Time, Scene, Poses, Plots, Feelings, Cinematic, Science, Geography, Architecture, Fashion, ...). The node detects which kind it is and tells Claude how to use it. Sockets grow as you connect them. | |
| context_8opt | STRING | Steering input from another APNext node (Time, Scene, Poses, Plots, Feelings, Cinematic, Science, Geography, Architecture, Fashion, ...). The node detects which kind it is and tells Claude how to use it. Sockets grow as you connect them. | |
| image_1opt | IMAGE | Reference image 1: <Picture 1> in the prompt. Connect the same image to image_1 on the MiniMax H3 Reference to Video node, or use this node's image_1 output. | |
| image_2opt | IMAGE | Reference image 2: <Picture 2> in the prompt. Connect the same image to image_2 on the MiniMax H3 Reference to Video node, or use this node's image_2 output. | |
| image_3opt | IMAGE | Reference image 3: <Picture 3> in the prompt. Connect the same image to image_3 on the MiniMax H3 Reference to Video node, or use this node's image_3 output. | |
| image_4opt | IMAGE | Reference image 4: <Picture 4> in the prompt. Connect the same image to image_4 on the MiniMax H3 Reference to Video node, or use this node's image_4 output. | |
| image_5opt | IMAGE | Reference image 5: <Picture 5> in the prompt. Connect the same image to image_5 on the MiniMax H3 Reference to Video node, or use this node's image_5 output. | |
| image_6opt | IMAGE | Reference image 6: <Picture 6> in the prompt. Connect the same image to image_6 on the MiniMax H3 Reference to Video node, or use this node's image_6 output. | |
| image_7opt | IMAGE | Reference image 7: <Picture 7> in the prompt. Connect the same image to image_7 on the MiniMax H3 Reference to Video node, or use this node's image_7 output. | |
| image_8opt | IMAGE | Reference image 8: <Picture 8> in the prompt. Connect the same image to image_8 on the MiniMax H3 Reference to Video node, or use this node's image_8 output. | |
| image_9opt | IMAGE | Reference image 9: <Picture 9> in the prompt. Connect the same image to image_9 on the MiniMax H3 Reference to Video node, or use this node's image_9 output. | |
| reference_image_useopt | COMBO | Characters only (ignore picture backgrounds) | How the reference pictures may be read. Characters only: every picture is a character/performer reference - identity (and wardrobe) carries over, the photo's background, setting and lighting are ignored, and no scene or location is ever derived from them; a picture note can still declare a specific image a location or prop. Auto: the model decides what each picture shows (a backdrop can become the scene). |
| scene_briefsopt | STRING | Manually planned scenes from chained H3 Scene Brief nodes: each brief (what happens, where, which cast members and pictures) becomes the binding plan for its scene. Pinned numbers take that scene; unpinned briefs fill in order; scenes without a brief stay the model's to invent. | |
| save_scenesopt | BOOLEAN | true | Store every successful run as a JSON bundle in output/apnext_scenes/ (scenes, synopsis, durations, cast). Reload it any time with APNext H3 Scenes Load - re-render without paying for the LLM again. |
| scenes_per_callopt | INT | 41–8 | How many scenes to ask the model for per call. Smaller chunks finish well inside timeout_seconds and fail smaller (a timed-out chunk is retried at half size automatically); larger chunks are slightly cheaper per scene. |
| prompt_modeopt | COMBO | Ref2VA (bind reference images) | Which official prompt guide the scenes follow, and whether the WRITING model is shown the reference pictures. Ref2VA (guide_ref_en.md): pictures are bound as <Picture N> and also sent to the writer, so it describes the real face. Needs a vision-capable model. Ref2VA blind: the video model still receives every picture under the same label, but the writer never sees one - it takes who is in each picture from the cast lines and image_notes. Use it with any model WITHOUT vision (a text-only local model, an uncensored fine-tune), and write an `Image 1: ...` note per picture. FL / T2VA (guide_base_en.md): everything from scratch in words. Pictures are ignored entirely and no <Picture N> label is written - they still pass through the image outputs. Auto picks Ref2VA when pictures are connected, FL otherwise. |
| draft_modelopt | COMBO | haiku | Who DRAFTS the scene chunks. The main `model` stays the director: it plans the video (synopsis, wardrobe/location locks, scene plan) and runs the continuity repair, while this model writes the scenes from that plan. haiku drafts several times faster than sonnet. `same as model` turns the split off. Ignored when the run is backed by Codex, a local server or an H3 LLM Backend override - those runs use one model throughout. |
| parallel_chunksopt | BOOLEAN | true | Write the scene chunks concurrently instead of one after another: one planning call (by `model`) fixes the synopsis, the Outline and the locks, then up to 4 chunks at a time are drafted from that plan (by `draft_model`), and one continuity pass repairs any drift. Much faster for long talks. Off = the classic serial run where every chunk continues one session. Ignored when resume_session_id is set or the whole talk fits in one call. |
| project_nameopt | STRING | A tag for this run - auto-filled with a random name like 'NeonDollyFoley-7k3q' when the node is created; type your own to rename the project. Wire the node's `project_name` output into Save Video's `filename_prefix` and every clip of the run lands in its own subfolder (output/video/<name>/), so the output folder shows at a glance which videos belong together. Saved scene bundles carry it too. Empty = a fresh random name each run (stable when `seed` is fixed). | |
| interpretationopt | COMBO | Auto (the writer decides) | How far the pictures may stray from the source material. Auto leaves it to the writer. Literal adapts it faithfully. Loose keeps the people and the events but stages the feeling, never the literal props. Metaphor builds the whole film on one image system. Counterpoint tells a different story that rhymes with it. Reframe keeps the subject but moves it into another world, era or genre. Surreal is escalating dream logic. Surprise me picks one of the non-literal readings by seed, so every re-run is a different film. |
Outputs (21)
| Name | Type | Description |
|---|---|---|
| scenes | STRING | — |
| durations | FLOAT | — |
| lengths | INT | — |
| scenes_text | STRING | — |
| synopsis | STRING | — |
| script | STRING | — |
| cast | STRING | — |
| scene_count | INT | — |
| total_seconds | FLOAT | — |
| session_id | STRING | — |
| info | STRING | — |
| image_1 | IMAGE | — |
| image_2 | IMAGE | — |
| image_3 | IMAGE | — |
| image_4 | IMAGE | — |
| image_5 | IMAGE | — |
| image_6 | IMAGE | — |
| image_7 | IMAGE | — |
| image_8 | IMAGE | — |
| image_9 | IMAGE | — |
| project_name | STRING | — |