comfyui_dagthomas

August 29, 2026 Β· View on GitHub

Advanced Prompt Generation & Multi-Model AI Integration for ComfyUI

A comprehensive suite of nodes for ComfyUI featuring multi-provider LLM support (OpenAI, Gemini, Claude, Grok, Groq, QwenVL), local model inference (Phi, MiniCPM, Ollama), professional image effects, and advanced prompt generation tools.


πŸ“¦ Installation

Search for "comfyui_dagthomas" in ComfyUI Manager and click Install.

Method 2: Manual Installation

cd ComfyUI/custom_nodes
git clone https://github.com/dagthomas/comfyui_dagthomas
cd comfyui_dagthomas
pip install -r requirements.txt

πŸ”‘ API Key Configuration

Set your API keys as environment variables:

# OpenAI GPT
set OPENAI_API_KEY=sk-your-key-here

# Google Gemini
set GEMINI_API_KEY=your-key-here

# Anthropic Claude
set ANTHROPIC_API_KEY=your-key-here
# or
set CLAUDE_API_KEY=your-key-here

# xAI Grok
set XAI_API_KEY=your-key-here
# or
set GROK_API_KEY=your-key-here

# Groq
set GROQ_API_KEY=your-key-here

# OpenRouter (one key, every model - https://openrouter.ai/keys)
set OPENROUTER_API_KEY=sk-or-your-key-here

The H3 writers can also take the key on the canvas: the APNext H3 LLM Backend node has an api_key field that overrides the environment for that node (saved in plain text inside the workflow JSON, so prefer the environment variable on a shared machine).


🧩 Node Categories

πŸ“ Universal Nodes (Model-Agnostic)

APNext Universal Generator

Display Name: APNext Universal Generator

A model-agnostic prompt generator that automatically detects available API keys and supports all major LLM providers.

InputDescription
input_textBase text to enhance
modelSelect provider:model or "auto-detect"
generation_modeCreative, Balanced, Focused, or Custom
seedSeed for reproducible variations
style_preferenceCinematic, Photorealistic, Artistic, etc.
detail_levelBrief to Very Detailed output

Supported Models:

  • gpt:gpt-4o, gpt:gpt-4o-mini, gpt:gpt-4-turbo
  • gemini:gemini-2.5-flash, gemini:gemini-2.5-pro
  • claude:claude-sonnet-4.5, claude:claude-3-5-sonnet
  • grok:grok-beta, grok:grok-2-vision
  • groq:llama-3.3-70b-versatile

Returns: (generated_prompt, model_used, seed_used)


APNext Universal Vision Cloner

Display Name: APNext Universal Vision Cloner

Analyze images with any supported vision model to generate detailed descriptions or clone image styles.

InputDescription
imagesOne or more images to analyze
modelVision model to use (auto-detect available)
fade_percentageBlend percentage for multiple images
analysis_modeDetailed Analysis, Style Cloning, Scene Description, Creative Interpretation
output_formatText Only, JSON Structure, or Formatted Prompt

Returns: (formatted_output, raw_response, faded_image, model_used)


πŸ€– Google Gemini Nodes

Gemini Prompt Enhancer

Display Name: APNext Gemini Prompt Enhancer

Enhances prompts with cinematic terminology and LLM refinement for video/image generation.

InputDescription
base_promptOriginal prompt to enhance
enhancement_modeRandom Mix, Cinematic/Lighting/Camera/Motion/Style Focus, Full Enhancement, or LLM Only
use_llmEnable Gemini LLM enhancement
intensityEnhancement intensity (0.1-2.0)
Optional dropdownsvisual_style, lighting_type, camera_angle, shot_size, lens_type, color_tone, etc.

Returns: (enhanced_prompt, random_enhanced, llm_enhanced)


Gemini Custom Vision

Display Name: APNext Gemini Custom Vision

Analyze multiple images with custom prompts. Supports dynamic prompt templates with variable substitution.

InputDescription
imagesInput images
custom_promptCustom analysis prompt
dynamic_promptEnable ##TAG##, ##SEX##, ##PRONOUNS##, ##WORDS## substitution
fade_percentageBlend multiple images together

Returns: (output, clip_l, faded_image)


Gemini Text Only

Display Name: APNext Gemini Text Only

Pure text generation with Gemini models. Supports dynamic prompt templates.

Returns: (output, clip_l)


Gemini Next Scene

Display Name: APNext Gemini Next Scene

Generate cinematic transitions for visual narratives. Creates the "next scene" based on a previous prompt and current frame.

InputDescription
imageCurrent frame image
original_promptPrevious scene description
focus_onCamera Movement, Framing Evolution, Environmental Reveals, Atmospheric Shifts
transition_intensitySubtle, Moderate, or Dramatic

Returns: (next_scene_prompt, short_description)


πŸ’¬ OpenAI GPT Nodes

GPT Mini Generator

Display Name: APNext GPT Mini Generator

Efficient text generation using GPT-4o-mini.

InputDescription
input_textText to enhance
happy_talkEnthusiastic vs professional tone
compressEnable output compression
posterMovie poster style formatting

GPT Vision Cloner

Display Name: APNext GPT Vision Cloner

Clone image styles using GPT-4o vision capabilities with custom prompts.


GPT Custom Vision

Display Name: APNext GPT Custom Vision

Full custom vision analysis with GPT-4o.


🧠 Anthropic Claude Nodes

Claude Text Generator

Display Name: APNext Claude Text Generator

Text generation with Claude models (Claude 3.5 Sonnet, Claude Sonnet 4.5).

InputDescription
input_textText to process
claude_modelModel selection
happy_talk, compress, posterOutput style controls
variation_instructionCustom instruction for creative variations

Claude Vision Analyzer

Display Name: APNext Claude Vision Analyzer

Image analysis with Claude's multimodal capabilities.


⚑ xAI Grok Nodes

Grok Text Generator

Display Name: APNext Grok Text Generator

Text generation using xAI's Grok models.


Grok Vision Analyzer

Display Name: APNext Grok Vision Analyzer

Image analysis with Grok vision models.


πŸš€ Groq Nodes (Ultra-Fast Inference)

Groq Text Generator

Display Name: APNext Groq Text Generator

Lightning-fast text generation using Groq's optimized infrastructure with Llama and Mixtral models.

InputDescription
groq_modelllama-3.3-70b-versatile, llama-3.1-8b-instant, etc.
Other standard LLM inputs

Groq Vision Analyzer

Display Name: APNext Groq Vision Analyzer

Fast image analysis with Groq vision models.


πŸ” QwenVL Nodes (Local Vision)

QwenVL Vision Analyzer

Display Name: APNext QwenVL Vision Analyzer

Local vision analysis using Qwen-VL models. Downloads models automatically.

InputDescription
imagesInput images
qwen_modelQwen3-VL-4B-Instruct, etc.
max_tokensMaximum response length
keep_model_loadedCache model in memory

QwenVL Vision Cloner

Display Name: APNext QwenVL Vision Cloner

Clone image styles locally without API calls.


QwenVL Video Analyzer

Display Name: APNext QwenVL Video Analyzer

Analyze video content frame-by-frame.


QwenVL Next Scene

Display Name: APNext QwenVL Next Scene

Generate cinematic scene transitions locally using QwenVL models. Takes a previous scene description and 1-5 frame images, then creates natural camera movements, framing evolution, and atmospheric shifts. Multiple frames help the model understand motion/progression.

InputDescription
images1-5 frame images (batch)
original_promptPrevious scene description
qwen_modelQwenVL model to use
prompt_fileCustom prompt template file
custom_promptOverride with inline prompt (optional)
max_framesMax frames to use from batch (1-5)
focus_onCamera Movement, Framing Evolution, Environmental Reveals, Atmospheric Shifts
transition_intensitySubtle, Moderate, or Dramatic
keep_model_loadedCache model in memory

Returns: (next_scene_prompt, short_description)

Custom Prompts: Create your own prompt templates in data/custom_prompts/. Use ##ORIGINAL_PROMPT## as placeholder for the previous scene description. Included templates:

  • next_scene.txt - Default detailed cinematography prompt
  • qwen_next_scene_simple.txt - Simplified version
  • qwen_next_scene_video.txt - Optimized for AI video generation

QwenVL Frame Prep

Display Name: APNext QwenVL Frame Prep

Utility node to prepare multiple images for QwenVL Next Scene. Accepts up to 5 individual images or a batch, scales them to max dimensions, and outputs a batched tensor.

InputDescription
max_widthMaximum width (default 1024)
max_heightMaximum height (default 1024)
image_1 - image_5Individual image inputs
image_batchPre-batched images (optional)

Returns: (images, frame_count)


QwenVL Z-Image Vision

Display Name: APNext QwenVL Z-Image Vision

Analyzes images and outputs in Z-Image TurnBuilder chat format with <|im_start|>/<|im_end|> tokens.


πŸ¦™ Ollama Nodes (Local LLM)

Ollama Node

Display Name: APNext OllamaNode

Local LLM inference using Ollama. Supports any model installed in your Ollama instance.

InputDescription
input_textText to process
model_nameAny Ollama model (llama3, mistral, etc.)
happy_talk, compressOutput controls

Ollama Vision

Display Name: APNext OllamaVision

Local vision analysis with Ollama multimodal models (llava, bakllava, etc.).


πŸ“Έ MiniCPM Nodes (Local Vision)

MiniCPM Image Node

Display Name: APNext MiniCPM Image

Image understanding with MiniCPM-V 4.5 (OpenBMB). Supports thinking mode for complex reasoning.

InputDescription
imagesInput images
questionQuestion about the image
enable_thinkingDeep reasoning mode
precisionbfloat16 or float16
unload_after_inferenceFree memory after use

MiniCPM Video Node

Display Name: APNext MiniCPM Video

Video understanding and analysis.


πŸ”¬ Phi Nodes (Microsoft Vision)

Phi Model Loader

Display Name: APNext Phi Model Loader

Load Microsoft Phi-3.5-vision-instruct model.

InputDescription
model_versionPhi-3.5-vision-instruct
image_crops4 or 16 crops for detail
attention_mechanismflash_attention_2, sdpa, or eager

Phi Model Inference / Custom Inference

Display Name: APNext Phi Model Inference

Run inference with loaded Phi model.


🎨 Image FX Nodes

Professional image effects using optimized tensor operations.

APNext Bloom FX

Creates a bloom/glow effect on bright areas.

InputDescription
intensityBloom strength (0-5)
thresholdBrightness threshold (0-1)
blur_radiusGlow spread (1-50)
blend_modeadditive, screen, or overlay

APNext Color Grading FX

Professional color grading with LUT support or manual controls.

InputDescription
methodmanual or lut_file
lut_file.cube, .3dl, or image LUT
exposure-3 to +3 stops
contrast, saturationStandard adjustments
highlights, shadowsTone controls
temperature, tintWhite balance

Supported LUT Formats: .cube (Adobe/Blackmagic), .3dl (Autodesk/Flame), Image LUTs (.png, .jpg)


APNext Sharpen FX

Intelligent image sharpening.


APNext Noise FX

Add film grain and noise effects.


APNext Rough FX

Add texture and roughness.


APNext Cross Processing FX

Film cross-processing color effects.


APNext Split Toning FX

Separate color toning for highlights and shadows.


APNext HDR Tone Mapping FX

HDR-style tone mapping.


APNext Glitch Art FX

Digital glitch and databending effects.


APNext Film Halation FX

Classic film halation (light bleeding) effect.


πŸ“ Latent Generators

APNext Latent Generator

Display Name: APNext Latent Generator

Generate latent tensors with intelligent dimension calculation.

InputDescription
width, heightBase dimensions (0 = auto-calculate)
megapixel_scaleTarget megapixels (0.1-2.0)
aspect_ratio1:1, 3:2, 4:3, 16:9, 21:9
is_portraitPortrait orientation

Returns: (LATENT, width, height)


PGSD3 Latent Generator

Display Name: APNext PGSD3LatentGenerator

Optimized latent generation for Stable Diffusion 3 pipelines.


πŸ“ Resolution Planning

H3 Resolution Planner (Crop Only)

Display Name: APNext H3 Resolution Planner (Crop Only) - by gabbo

Original node and algorithm by gabbo. Ported into this pack with the planning logic unchanged.

Plans a two-stage generate β†’ upscale resolution pair and center-crops the input image to the exact aspect ratio of that plan, so nothing in the chain has to resample or pad. Step sizes are chosen so both stages always land on clean multiples of 32:

UpscaleStage 1 stepsStage 2 steps
2x3264
1.5x6496
InputDescription
imageSource image; only its dimensions drive the plan
resolution_modetarget_megapixels, max_stage1_from_input, max_final_from_input
stage1_megapixelsTarget stage 1 size in MP (0.05–4.00). target_megapixels mode only
upscale_mode2x or 1.5x
max_crop_percentMax share of input area croppable (0–25%). The two max_* modes only; falls back to the least-lossy candidate if nothing fits

Modes

  • target_megapixels β€” hits the requested stage 1 megapixels while staying as close as possible to the input aspect ratio.
  • max_stage1_from_input β€” largest stage 1 the input can feed natively within the crop budget.
  • max_final_from_input β€” largest stage 2 (final) the input can feed natively within the crop budget.

Returns: (cropped_image, stage1_width, stage1_height, stage2_width, stage2_height, upscale_factor, plan_info)

plan_info is a human-readable summary of the chosen plan:

mode: target_megapixels @ 2x
input: 1920x1080
crop: 1917x1065 at (1,7) - 1.54% of area removed
aspect: 9:5
stage 1: 864x480 (0.40 MP)
stage 2: 1728x960 (1.58 MP)

πŸ€– Claude Code Node

Runs prompts through the Claude Code CLI installed on the machine, using its login. Nothing to configure in ComfyUI: if claude is on PATH and you have run it once to log in, it works. Install it, or point CLAUDE_CODE_PATH at the binary. No API key, no key field, no per-node authorisation step.

Why bother when there is already a claude: provider? Because this one uses your subscription seat instead of API billing, and because it is agentic β€” it can search the web and read files while it writes.

Subscription, not API. The node hides ANTHROPIC_API_KEY from the CLI (use_subscription, on by default) so the call authenticates with your Claude Code login. Usage then counts against your plan's rolling window β€” the CLI reports it as rateLimitType: five_hour β€” rather than being metered as API spend. The cost=$… figure in the info output is the CLI's estimate of equivalent API cost, not a charge. Heavy batches can still exhaust the window, and the node prints a clear warning when the limit is reached.

Under the hood it speaks Claude Code's bidirectional streaming protocol (--input-format stream-json --output-format stream-json), so images go inline as base64 blocks, progress appears in the ComfyUI console while the model works, and the process is killed the moment you cancel the queue.

APNext Claude Code

Display Name: APNext Claude Code

InputDescription
promptWhat to ask
modelsonnet, opus, haiku, fable, or default (whatever the CLI is set to)
enable_researchLets it use WebSearch, WebFetch, Glob, Grep and Read while answering. Off = answers from the prompt alone. Reaches the internet when on
use_subscriptionHides ANTHROPIC_API_KEY from the CLI so your login is used. Off bills the API key instead
timeout_secondsGive research runs room β€” 600s default
seedClaude Code has no seed; this only controls ComfyUI caching. -1 re-runs every queue
image (optional)Reference frame(s), written to a scratch folder and read by the CLI
system_prompt (optional)Replaces Claude Code's own system prompt
resume_session_id (optional)Feed a previous node's session_id to continue that conversation
working_dir (optional)Run inside a real folder so it can read those files. Empty = throwaway scratch folder

Returns: (text, session_id, info) β€” info carries model, duration, turns and cost.

Refinement chains. Wire session_id into a second node's resume_session_id and it keeps the whole conversation, images included: node 1 writes the prompt, node 2 says "make shot 2 wilder and cut the dialogue" without re-sending any of it.

Notes and limits

  • No temperature, seed or max_tokens. The CLI owns sampling. Vary the prompt to vary the output.
  • Slower than an API call β€” 5–30s typical, longer with research on, because it is a full agent loop.
  • More tokens per call. Claude Code carries its own tool preamble (~35k cached tokens), so a call costs more than hitting the API directly with the same prompt. The subscription seat is the trade.
  • Your ~/.claude/CLAUDE.md, skills and hooks are deliberately ignored (--setting-sources ""). A personal "always apply Go best practices" rule has no business rewriting a video prompt.
  • No tools at all by default. Images need none β€” they are sent inline. Only enable_research grants any, and only the read-only set. Bash, Write and Edit are never granted.
  • Cancelling the queue kills the CLI instead of leaving it running against your quota.

πŸŽ₯ MiniMax-H3 Prompt Nodes

Both nodes take a short idea, an image, or both and expand it into a complete, spec-compliant MiniMax-H3 video prompt. The official MiniMax writing guides ship verbatim in data/h3/ and are used as the system prompt, so the model follows the real spec rather than a paraphrase β€” edit those files to tune behaviour globally.

Any provider works β€” cloud, local, or the Claude Code CLI. auto-detect picks the first of Claude β†’ GPT β†’ Gemini β†’ Grok β†’ Groq that has an API key set, then the Claude Code CLI, then a running local server. When an image is connected it is sent as vision input, so the model describes the frame itself instead of you writing the description.

Claude Code. Pick claudecode:sonnet (or opus / haiku) in the model dropdown and the prompt is written by your locally installed Claude Code CLI, using its own login β€” no API key in ComfyUI, and the work counts against your Claude Code subscription seat rather than API billing. Images are handed over as real files for the CLI to read, so vision works exactly as it does with the other providers. The entries only appear when the CLI is installed. See Claude Code Node for the details and the standalone node.

Local models. Any OpenAI-compatible server works: Ollama, LM Studio, vLLM, llama.cpp server, LocalAI, TabbyAPI, text-generation-webui. Whatever is running when the ComfyUI page loads is listed at the bottom of the model dropdown as ollama:…, lmstudio:… or local:… β€” start a server or pull a new model, refresh the page, and it appears (no ComfyUI restart). Use a vision-capable model, e.g. ollama:qwen3-vl:8b, if you want to connect images.

PrefixDefault URLEnv override
ollama:http://localhost:11434/v1OLLAMA_BASE_URL, OLLAMA_HOST
lmstudio:http://localhost:1234/v1LMSTUDIO_BASE_URL
local:http://localhost:8000/v1LOCAL_LLM_BASE_URL

The optional local_base_url input points a single node somewhere else (a LAN box, a different port) β€” 192.168.1.10:11434 is enough, the scheme and /v1 are filled in. The optional model_override input takes an exact provider:model string and wins over the dropdown, which is how you reach a model the dropdown has not discovered, e.g. ollama:qwen3:8b. Set APNEXT_LOCAL_LLM_DISCOVERY=0 to skip the local probe entirely.

Writing the Claude Code H3 nodes with Ollama instead (APNext H3 LLM Backend). The six Claude Code H3 nodes (Claude Code Writer, Reference Writer, Refiner, Continue Writer, Crossover Writer, Scenes Writer) default to the Claude Code CLI, but each has an optional llm socket. Drop an APNext H3 LLM Backend (Ollama / local / API) node, pick a model (the dropdown lists every ollama: / lmstudio: / local: model your servers were serving at page load, the cloud API models, or custom with a free model_name such as qwen3:8b), optionally set base_url, temperature, max_tokens, and drag its llm output into any number of H3 nodes β€” they then write with that model through the shared LLM router. The node's own model dropdown also lists the discovered local models directly, so a quick switch needs no extra node. What changes off-CLI: research is ignored (no web tools), the director skills are pasted into the system prompt (turn on inline_skill_references on the backend node to paste their whole reference library too β€” much better prompts, but the system prompt passes 45k tokens, so raise num_ctx to match), and session_id / resume_session_id still work through a text-only local session kept under ComfyUI's temp folder (a Claude Code session id cannot be resumed with a local model and vice versa β€” the error says so). Everything else β€” wardrobe/location locks and their repair turn, template variables, outputs β€” is identical.

Sizing an Ollama run (num_ctx, thinking, and the πŸ“ button). An H3 system prompt is β‰ˆ9k tokens for a text-only run and β‰ˆ15k with reference images, before your song, cast and lyrics β€” and Ollama picks its own context window from free VRAM, as little as 4k, then silently truncates everything past it. Nothing errors; the model simply never sees the rules it is supposed to follow. So the backend node carries num_ctx (default 32768 β€” set it, don't leave it to the server) and thinking (default off: a reasoning pass costs wall-clock time and the H3 rules are already in the prompt; any <think> block that does arrive is stripped before parsing). Press πŸ“ Show 1024 tokens on the node to see what a token actually is β€” a real 1024-token block cut from the H3 guide and counted with your model's tokenizer β€” what an H3 run spends against your num_ctx, and, for every model you have pulled, its KV-cache cost per token, how much context fits in this machine's VRAM versus its RAM, whether it has vision / thinking / tools, and a benchmark button that measures real tokens/sec and the GPU/CPU split. Three ready workflows, one per answer to does the writing model have eyes: h3_music_video_masked_audio_ollama.json (prompt_mode = Ref2VA β€” the photo is bound as <Picture 1> and shown to the writer, so it needs a vision model), h3_music_video_masked_audio_ollama_blindref.json (Ref2VA blind β€” the photo still reaches the video model and renders identically, but the writer never sees it and takes who is in it from image_notes, so any text model works and you keep face consistency), and h3_music_video_masked_audio_ollama_textonly.json (FL / T2VA β€” no images anywhere, you write the wardrobe and locations yourself).

Cutting on the music (APNext H3 Sound Events). A new node next to Load Audio finds where the hits are and labels them with the second they land at β€” BASS HIT, IMPACT, DROP, STOP, BUILD, SECTION β€” using the detectors fitted against real tracks in graphgen's AudioEngine, ported from real-time Web Audio to a whole-song torch pass (band-limited spectral flux against an adaptive median for kicks, waveform RMS-rise for slams, signed loudness novelty for drops and stops). Wire its events output into the Music Video Writer's sound_events socket β€” already done in every masked-audio example β€” and each piece's brief carries only the hits inside that clip, timed from the clip's own start ([+2.10s] BASS HIT (heavy)), with a directive to land the cut, the camera hit or the light change on them. Roughly half a second to analyse a 200-second song, pure torch, no librosa.

Simple vs. advanced form. Every H3 node shows a short form by default; the rarely‑touched inputs are marked advanced and appear behind the node's Show advanced inputs toggle (ComfyUI's native mechanism). See H3_NODES.md for the per-node split.

Template variables in the text boxes. Every H3 writer expands {variables} in its free-text inputs (idea, direction, extra_instructions, wardrobe, locations, image_notes, extra_cast, instruction, custom style/language) from what is wired into the node, before the text is sent to the model: {character1} {actor1} {franchise1} {cast1} for the first H3 Characters node feeding the node (numbered in socket order β€” cast_1 sockets first, then context_1..8; chained cast_in characters count oldest-first), {characters} ("A, B and C"), {cast} (every cast line), and {context_1} / {cast_1} for the raw text on a socket. So {character1} barges into {character2}'s kitchen works with two Characters nodes connected. A read-only {vars} strip under each writer's inputs lists what is currently available (click a chip to copy it), typing { in any multiline text box pops up an autocomplete of those variables (keep typing to filter, ↑/↓, Enter/Tab or click to insert, Esc to dismiss), and the console prints what was available and used on every run. Chained Characters nodes (A β†’ cast_in of B β†’ cast_1) give {character1} = A and {character2} = B; Characters nodes on separate sockets number in socket order. Unknown {names} are left as they are.

APNext look + wire styles (optional). Settings β†’ APNext β†’ APNext theme (also in the top menu under APNext and the canvas right-click menu) restyles ComfyUI like graphgen: the Dark Botanical palette (warm near-black, tan accent, dusty-pink highlight, muted botanical port colours β€” installed as a normal custom colour palette named APNext Graphgen), graphgen's 22 px dot grid on the plain near-black canvas (opaque, no glows), IBM Plex Sans / Cormorant / JetBrains Mono, and β€” with Graphgen node look on β€” graphgen's node shell: rounded header corners on an otherwise square box with a 1 px panel border, a header that carries the node's hue as a faint tint plus a hued bottom border (body stays neutral), white semibold title text, and port tabs pinned to the node edge that extend outward when connected or hovered instead of circles; with Recolour coloured nodes & groups (on by default) every node or group that carries its own colour β€” right-click β†’ Colors, or packs that pre-colour their nodes β€” is drawn in the nearest botanical hue and the node-colour menu swatches become botanical, so the whole canvas matches; Off restores the previous palette, font, radius and the original node colours (they are never modified, only drawn differently). Wire style is a separate setting with graphgen's edge styles: ComfyUI default, Bezier, Smooth step, Step, Straight and Cable (a springy wire that sags and wobbles after a drag β€” cable.svelte.ts); Gravity wires (a hanging verlet rope β€” rope.svelte.ts; Wire slack / weight / segments tune it) is its own on/off toggle that overrides the wire style, off by default. When a physics style is not selected its simulation is fully stopped (no loop, no extra redraws); when selected it sleeps as soon as nothing moves. The APNext panels (H3 Prompt Preview, {vars} strip, autocomplete, thumbnails) use the Dark Botanical colours by default, theme on or off. Three canvas helpers live under Settings β†’ APNext β†’ Canvas helpers, all on by default and independent of the theme: Highlight drop targets (while you drag a link, every slot that can take it pulses with a ring β€” pink when it is already connected and would be replaced; works from outputs and from inputs), Connect sparks (a particle burst in the link's colour at the input when a connection is made β€” graphgen's Sparks), and Colour-code APNext nodes (every node of this pack gets a family colour in the palette hues: sage writers, rose Characters, pink LLM Backend β€” the same pink as the llm link β€”, slate previews, gold scene utilities, mauve context generators, teal vision/caption nodes, terracotta the rest; only nodes you have not coloured yourself, and turning it off removes them again).

APNext H3 Prompt Writer

Display Name: APNext H3 Prompt Writer

Writes the base format β€” integrated_multimodal_description, overall_soundscape, non_diegetic_music β€” per VIDEO_PROMPT_WRITING_GUIDE_base_en.md.

InputDescription
ideaYour short prompt or image description β€” the thing being expanded
task_typeT2VA (text only), I2VA (first frame), FL2VA (first + last), L2VA (last frame). Non-T2VA emits the exact reference-alignment instruction line
duration_secondsDrives cut times and the S.SS value in the alignment line
shot_planAuto, or force 1–4 shots
visual_styleAuto, one of the guide's styles (Cinematic, live-action, 2D-animated, 3D CG, claymation, watercolor, vintage film), or anything from the APNext Cinematic vocabulary (film stock/format, colour grading, the aesthetics list). Pick Custom and type your own in custom_visual_style - a filled-in custom box always wins over the dropdown
wildness0 = literal, 100 = fully unhinged. See below
camera_motion / camera_amplitude / camera_speedThe guide's full camera vocabulary. Medium amplitude and normal speed are omitted from the output, as the spec requires
include_dialogueOff β‡’ no (Sx) IDs and no <d> blocks at all
dialogue_languageWhat the characters actually speak β€” 36 languages, or Auto to let the model pick one that fits the setting
custom_dialogue_language (optional)Anything not in the list β€” Norwegian (Bergen dialect), Latin. Overrides the dropdown
include_on_screen_textWhether readable signs/banners/subtitles appear
include_soundscape / include_non_diegetic_musicOff writes N/A into that field
model, temperature, seedProvider selection and sampling β€” cloud models plus any local server that answered
image (optional)Reference frame(s), sent as vision input
extra_instructions (optional)Free-form extra direction
model_override (optional)Exact provider:model string, beats the dropdown β€” e.g. ollama:qwen3:8b
local_base_url (optional)Where the local server lives, e.g. 192.168.1.10:11434. Empty = the default for the prefix

Returns: (h3_prompt, integrated_multimodal_description, overall_soundscape, non_diegetic_music, model_used) β€” the full prompt plus each field split out for separate wiring.


APNext H3 Reference Prompt Writer

Display Name: APNext H3 Reference Prompt Writer

Writes the six-section full-reference format per VIDEO_PROMPT_WRITING_GUIDE_ref_en.md. Shares every option above, plus:

InputDescription
task_typeThe [bracketed] summary prefix: keyframe completion, reference generation, video editing, video continuation, audio reuse, audio reference. Auto lets the model combine them with +
reference_roleHow attached images get labelled: auto, <Subject N>, standalone <Picture N>, style-only, or storyboard
word_targetTarget length of detailed_description (guide recommends 350–500)
image_1 … image_9 (optional)Up to nine reference images β€” the same limit as ComfyUI's MiniMax H3 Reference to Video node. Sockets grow as you connect them: plug in image_1 and image_2 appears
reference_notes (optional)Per-reference notes, one per line β€” also how you describe video/audio references you can't attach

Returns: (h3_prompt, subject_definitions, summary, retention_analysis, detailed_description, overall_soundscape, non_diegetic_music, model_used, image_1 … image_9)

Attached image k is <Picture k> in the prompt, and it comes straight back out on the image_k output. Wire those outputs into the H3 video node's image_1 … image_9 and the numbering in the prompt and the numbering the video model sees can never drift apart. The base writers do the same with first_frame / last_frame: frame 0 and the last frame of whatever you connected to image come back out for the video node's first/last-frame sockets.


H3 Γ— Claude Code

Four nodes that write H3 through the local Claude Code CLI instead of an API key. They inherit every rule from the writers above β€” same guides, same camera vocabulary, same wildness bands β€” and swap model/temperature for the CLI's own controls. Use these instead of picking claudecode: in the dropdown when you want research or refinement; the dropdown is fine for a plain one-shot.

NodeDisplay nameWrites
BaseAPNext H3 Claude Code WriterThe base format (T2VA / I2VA / FL2VA / L2VA)
ReferenceAPNext H3 Claude Code Reference WriterThe six-section full-reference rewrite
RefinerAPNext H3 Claude Code RefinerA revision of an existing prompt
ContinueAPNext H3 Claude Code Continue WriterThe prompt for the next clip, from the last frames of the previous one

Shared inputs on all four: model (sonnet/opus/haiku/fable/default), research, director, use_subscription, timeout_seconds, seed, plus optional working_dir. The writers also take resume_session_id. Both writers return session_id and info in place of model_used.

director (on by default) loads the H3 director skills that ship in data/h3/skills/. Each is a Claude Code-style SKILL.md β€” short instructions always in context β€” plus a references/ library opened on demand with the Read tool. They are written around how these nodes work (the node's task type, duration, shot plan, camera, dialogue toggles and wildness band are treated as decisions already made; attached image k is <Picture k>; the exact field labels the node parses), so they complement the numbered directives instead of second-guessing them.

SkillLoaded byAlways in contextRead on demand
h3-prompt-directorall threeobeying the node's directives, output boundary, timeline & continuity, speech / <d> tags, soundscape vs music, resumed-session revisions, silent validationprompt grammar, edge cases, quick examples, H3/ComfyUI facts
h3-base-formatWriter, Refiner (base)the three-field contract, verbatim I2VA / FL2VA / L2VA alignment lines, how the image batch maps to first/last frameT2VA gold examples, keyframe gold examples, condensed official guide
h3-ref2vaReference Writer, Refiner (ref)six-section contract, image_1..9 β†’ <Picture 1..9>, what each reference_role means, roles, retention vocabulary, HOW-vs-WHATRef2VA gold examples, full-reference guide, video style-transfer lab
h3-style-craftall threeexpanding visual_style into observable craft, one pack per layer, translating named references, animation timing without frame-rate claims, wildness scalingstyle picker, pack catalogue, style anchors, temporal animation techniques

The node grants read access to data/h3/skills with --add-dir, so it works with an empty working_dir and without touching your own Claude settings. The official MiniMax guide stays authoritative for format; the skills add craft. Edit a SKILL.md or drop new .md files into a references/ folder to tune behaviour, and any of the four folders can be symlinked into ~/.claude/skills/ for interactive use.

research sends Claude Code to the web before it writes β€” how the real location looks, period-correct wardrobe, how the light behaves there, how the physical event actually unfolds β€” and folds what it finds in as concrete visual detail. It is instructed never to cite anything or add commentary, so the output stays a clean H3 prompt.

Images on the Claude Code Writer. The image socket carries the keyframes β€” the picture(s) the video model will actually get, per task_type: I2VA β†’ <Picture 1> first frame; L2VA β†’ <Picture 1> last frame; FL2VA β†’ batch two, frame 0 = <Picture 1>, last = <Picture 2>; T2VA β†’ context only, no <Picture N> (the node prints a warning). first_frame / last_frame hand them back for the H3 video node.

Nine typed reference sockets β€” subject_1..3, scenery_1..3, object_1..3 β€” take pictures that should only be described. The video model never sees them; Claude puts what matters into words and ignores the rest:

SocketCarries overIgnored
subject_Nwho they are β€” face, hair, build, wardrobe, marks; described precisely in [Shot 1] and kept identical across shotsthe photo's backdrop, light, framing, mood β€” the scene comes from your idea
scenery_Nthe place β€” architecture/terrain, light, weather, palette, layout, as the settingany people in the picture
object_Na prop/product β€” shape, colour, material, markings, scalewhere it sits in the photo

Any sizes mix freely; numbering follows connection order per kind. With references but nothing on image, the prompt is written as T2VA whatever task_type says (there is nothing to align), and the node says so. Typical use: a character sheet on subject_1, a location photo on scenery_1, β€œshe walks into the bar and orders” as the idea.

The refiner is the reason sessions matter. Wire a writer's session_id into it and describe the change in plain language β€” "use two shots instead of one, and set it at night". Resuming means the guide, the reference images and the model's own reasoning are still in context, so it edits surgically rather than rewriting from scratch, and you send only the instruction. Leave session_id empty and it still works, re-sending the prompt with the matching guide; it auto-detects which format it is looking at. Its 10 outputs cover both formats, and fields the format does not use come back empty.

[Load Image] ──► [H3 Claude Code Writer] ──h3_prompt──► [Preview as Text]
                          └──session_id──► [H3 Claude Code Refiner] ──► [Preview as Text]
                                             instruction: "make shot 2 wilder"

The continue writer chains clips. Wire the decoded frames of a generated clip into frames; it keeps the last frame_count frames, frame_stride apart (default 4 frames, one every 6 β€” the final frame is always included), and shows them to Claude Code together with the previous_prompt and your idea for what happens next. It writes an I2VA prompt for a new clip of duration_seconds where the last frame is <Picture 1> at 0.00 s, and hands that frame back out as first_frame for the video node; the sampled frames come out as context_frames so you can preview what it saw. The earlier frames are context only β€” they show which way the camera and the action were moving, so the continuation does not reverse a pan or freeze mid-swing. Switch continuation_mode to T2VA to cut to a new scene of the same story instead of continuing seamlessly. Feed it the previous node's session_id (the writer's, or the previous Continue Writer's) and Claude Code still has every prompt and frame so far in context, so characters, speaker IDs and the soundscape stay consistent over a long chain; without it, paste every prompt so far into previous_prompt, oldest first. Same directive set as the base writer (shot plan, style, camera, dialogue toggles, wildness), with visual_style Auto meaning keep the previous clip's look.

[H3 Claude Code Writer] ──h3_prompt──► [MiniMax H3 video] ──► [Decode] ──frames──► [H3 Claude Code Continue Writer] ──h3_prompt──► [MiniMax H3 video]
          └──h3_prompt───────────────────────────────────────────────previous_promptβ”€β”€β”˜        └──first_frameβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          └──session_id──────────────────────────────────────────────resume_session_idβ”˜

APNext context sockets (all writer nodes)

Every H3 writer β€” APNext H3 Prompt Writer, APNext H3 Reference Prompt Writer, all the Claude Code H3 nodes (Writer, Reference Writer, Refiner, Continue Writer, Crossover Writer, Scenes Writer) and the generic APNext Claude Code node β€” has context_1..context_8 sockets (they grow as you connect them). Wire any other APNext node into them: Time, Scene, Poses, Plots, Feelings, Cinematic, Photography, Science, Geography, Architecture, Fashion, People, Interaction, Stuff, Vehicle, Typography, Brands, Art/Artist, Keywords, Video Game, Human, Character, or H3 Characters (cast) and another writer's h3_prompt.

The node looks up which node type feeds each socket (via ComfyUI's hidden graph inputs), labels the socket in the UI (context: time), and hands the model a block like:

CONTEXT FROM CONNECTED APNEXT NODES
1. [time] from APNext Time (fields: eras=Victorian, time (Random))
   Input: Victorian era, dusk,
   Use it as: Period, era, decade or time of day. Make it visible: period-correct wardrobe, props, ... State the time of day in every shot's opening line ...
2. [feelings] from APNext Feelings (fields: creepy (Multiple Random))
   Input: a creeping dread, flickering candles,
   Use it as: Emotional tone. Express it through performance, delivery, body language, lighting ... not by naming the emotion.

The per-kind instructions live in utils/apnext_context.py (CATEGORY_GUIDANCE) β€” edit them to change how a category steers the scene. Unknown sources are passed through as generic context. Example workflows: examples/h3/h3_context_claude_code.json and h3_context_ollama_qwen.json (same sockets on the plain writer with model_override = ollama:qwen3:8b).

APNext H3 Characters

Display Name: APNext H3 Characters

A lookup node for the character reference set. It reads data/h3/characters.tsv (Relative File Path, Character / Subject Name, Real Actor / Actress, Franchise / Show) and outputs the pieces as separate strings plus a ready-made cast line.

InputDescription
characterDropdown of every unique Character β€” Actor (Franchise) entry, 🎲 random, or ✏️ custom (describe your own in custom_character)
franchise_filterOnly used with random: restrict the pool to one franchise/show
seedDrives the random pick, so it stays stable per queue
custom_character (optional)Your own character, free text; used with ✏️ custom (or whenever filled in). Lena: a middle-aged woman with a limp and a silver bob keeps Lena as the name the writers and {characterN} use; Name (played by Actor) from Show also works
wardrobe (optional)This character's wardrobe lock: 3–5 exact anchors, comma separated. It travels with the cast line (`…
cast_in (optional)Cast lines from an upstream Characters node; this node's line is appended, so several chain into one cast list
OutputDescription
character / actor / franchiseThe three columns (franchise verbatim, including any appended look description)
file_pathThe reference clip's relative path
castCharacter (played by Actor) from Show (+ `
wardrobeThe wardrobe text, passed through

Edit the TSV to add or remove entries; duplicates (same character, actor and franchise) are collapsed automatically.

APNext H3 Crossover Writer

Display Name: APNext H3 Crossover Writer

Takes a cast (from H3 Characters nodes, or typed by hand) and your steer, and has the local Claude Code CLI write 1–10 crossover scenes β€” characters from different shows sharing one story β€” each a complete four-section T2VA prompt (subject_definitions: / integrated_multimodal_description: / overall_soundscape: / non_diegetic_music:). The rules come from data/h3/guide_crossover_en.md, distilled from rendered crossover productions: actor pinning, <Subject 1> speaker binding, silence mandates, not in frame isolation, positioned two-shots, no dead air, grounded entrances, hand-offs between scenes. No title cards are written unless you ask.

InputDescription
directionYour creative brief: premise, tone, where it happens, what must happen, who should clash
extra_castExtra characters typed by hand, one per line
cast_1..cast_4 (optional)cast outputs from Characters nodes (chain several through cast_in, or use several sockets)
scene_count1–10 scenes
duration_mode / scene_durationFixed length per scene, or let Claude pace each scene 5–15 s (scene_duration is the fallback)
continuity_modeIndependent clips (each scene its own T2V clip, hard cuts, already speaking openers) or Continuous chain β€” scenes written for C2V / motion-context chaining per data/h3/guide_chain_en.md: scene N+1 opens on scene N's last frame, one continuous take with no the shot cuts to, a 2 s silent hand-off before a new speaker's first line, outgoing person kept as a tagged subject, rotating moving closers, one lighting string
shots_per_scene, visual_style, dialogue_language, wildnessSame meaning as on the other writers
wardrobe (optional)Wardrobe lock, one line per character (Sheldon: dark-brown corduroy jacket, forest-green cotton T-shirt, small silver ring in the LEFT nostril), copied word-for-word into every shot the character is on screen in. Empty = Claude fixes one outfit per character in the synopsis's Wardrobe: lines and repeats it. Anchors are exact phrases β€” precise colour + material + garment, accessories and marks with their side β€” no synonyms, nothing extra, nothing dropped. The Scenes Writer has the same input
locations (optional)Location lock, one line per recurring place (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), copied word-for-word into the first shot of every scene set there, so the same room looks the same in every scene. Empty = the model names each place used in more than one scene and fixes 3–6 anchors in the synopsis's Locations: lines, then repeats them. Anchors are fixed features with colour/material and position (LEFT/RIGHT from the main camera side), openings, surfaces and practical light β€” no synonyms (sofa never becomes couch), nothing dropped or moved. The Scenes Writer has the same input
enforce_wardrobe (optional, default on)After writing, the node parses the synopsis Wardrobe: and Locations: lines and checks that every shot a character is on screen in restates all of their anchors verbatim (off-screen mentions don't count), and that every scene set in a locked place restates all of that place's anchors. Any miss triggers one combined repair turn in the same session; the result is in info (`wardrobe: ok (2 locked)
image_1..image_9 (optional)Reference images, <Picture 1>..<Picture N> in connection order. Downscaled copies go to Claude so it can recognise who/what each picture is (add image_notes like Image 1: Sheldon, Image 3: the diner); pictured characters are bound to their picture in subject_definitions and the wardrobe lock is taken from the picture. The originals come back out on the matching image_N outputs β€” wire them to the same slots on MiniMax H3 Reference to Video
model, research, director, use_subscription, timeout_seconds, seedThe Claude Code block; director loads the h3-crossover skill with verified gold examples
OutputDescription
scenes (list)One prompt per scene β€” a downstream video node runs once per element
durations (list)The matching seconds per scene; wire into your frame-count math
scenes_textAll scenes with `=== SCENE NN
synopsis, cast, scene_count, session_id, infoStory summary, the merged cast, how many scenes parsed, and the Claude Code session for the refiner
image_1..image_9The reference images passed straight through, same order as the inputs β€” wire to MiniMax H3 Reference to Video

APNext H3 Claude Code Scenes Writer

Display Name: APNext H3 Claude Code Scenes Writer

The Claude Code prompt writer, but for a run of scenes: one idea in, 1–10 consecutive T2VA prompts out in the base three-field format, each with its own duration, forming one continuous story. Same director skills, camera vocabulary, dialogue toggles and wildness bands as APNext H3 Claude Code Writer. Optional image and subject_/scenery_/object_ sockets are described into every scene for consistency (nothing becomes <Picture N>). Has the same continuity_mode switch (independent clips vs continuous chain). Outputs mirror the crossover writer: scenes and durations are lists.

APNext H3 Music Video Writer

Display Name: APNext H3 Music Video Writer

Turns a song into a whole music video. The node cuts the audio into consecutive pieces no longer than H3 renders in one clip (5–15 s), choosing the cut points on the music β€” onsets, energy steps, section changes, and (with timed lyrics) right before a lyric line β€” with every piece length snapped to H3's frame grid (5 + 17k frames at 24 fps) so each rendered clip is exactly as long as its audio slice and the stitched video never drifts. It then writes one scene per piece (four-section H3 prompt): the piece is <Audio 1>, reused 1:1 as the clip's soundtrack; in Performance mode the singer lip-syncs the piece's lyric lines on camera (<Subject 1> sings <d>[English] exact line</d> in sync with <Audio 1>), Narrative mode answers the lyric with pictures, Mixed alternates; quiet pieces get long intimate shots, loud/peak pieces more cuts and the chorus look. Long songs are written in chunks of 6 scenes that continue one session (same synopsis, wardrobe and location locks).

InputDescription
audioThe song (Load Audio)
directionThe concept: performer, place, look, arc, motifs, what the chorus looks like
lyricsOne line per line. [0:15] line, 0:15 line or LRC [00:15.20] line make the sync exact; [Chorus]-style tags are kept; untimed lines are spread evenly (approximate). Empty = instrumental
performance_modePerformance / Narrative / Mixed
segment_mode, max_segment_seconds, min_segment_secondsAuto cuts on the music inside the allowed range, Fixed takes the longest allowed piece each time, Lyric lines tries hardest to cut before a line
shots_per_scene, visual_style, dialogue_language (lyric language)As on the other writers - there is no wildness dial here: the lyrics and direction steer the video
cast_1..4, extra_castThe performer(s): H3 Characters (✏️ custom + wardrobe is made for this) or typed lines such as Lena: a singer in her 30s with a platinum pixie cut
wardrobe, locations, enforce_wardrobeLocks as on the Crossover Writer (cast-carried wardrobe is merged in). For runs of more than 6 scenes the locks are checked and reported but not re-emitted
image_1..9, image_notesReference pictures (the performer's face, the place); passed through to the video node
Claude Code block, llmAs on the other writers; an APNext H3 LLM Backend makes it run on Ollama
OutputDescription
scenes (list)One prompt per piece β†’ the H3 video node's prompt
durations (list) / lengths (list)Seconds / H3 frame counts per piece β†’ length (no math node needed)
audio_segments (list)The matching AUDIO slice per piece β†’ ref_audio_1 (<Audio 1>)
segment_tableThe cut list: 01 0:00.00 – 0:15.08 (15.08s, 362 frames) energy: peak lyrics: …
scenes_text, synopsis, cast, scene_count, song_seconds, session_id, info, image_NAs on the Crossover Writer
[Load Audio] ─AUDIO─┬─► [H3 Music Video Writer] ─scenes/lengths/audio_segments─► [MiniMax H3 Reference to Video] … [VAE Decode]
                    β”‚                                                                                                β”‚
                    └─────────────────────────── replace_audio ──► [H3 Scenes Join] ◄─ IMAGE list β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                                        └─► [Create Video] ─► [Save Video]   (one music video)

examples/h3/h3_music_video.json is this graph end to end (song β†’ pieces β†’ clips β†’ one video with the original track).

APNext H3 Scene Pick

Display Name: APNext H3 Scene Pick

Collapses a scenes list to one element by index (0-based, clamped) and returns that scene, its duration, the resolved index and the list count. Fix the writer's seed, then step the index to render scenes one at a time.

[H3 Characters] ─cast─► [H3 Characters] ─cast─► [H3 Crossover Writer] ─scenes (list)──► [MiniMax H3 video]   (renders every scene)
                                                                      └─durations (list)─► [duration β†’ frames]
                                                                      └─scenes_text──────► [H3 Prompt Preview]

[H3 Crossover Writer] ─scenes/durations─► [H3 Scene Pick index=2] ─scene/duration─► [MiniMax H3 video]   (renders one)

APNext H3 Prompt Preview

Display Name: APNext H3 Prompt Preview

Output node that renders any H3 prompt colour-coded (<Subject N>, <Picture N>, <Video N>, <Audio N>, <d> dialogue, [Shot N], speaker IDs, section headers, camera vocabulary) with a Copy button, and passes the text through. Connect the reference images to image_1..image_9 and a small thumbnail of each appears in a strip above the prompt and inline next to every <Picture N> tag (click to enlarge; pictures not referenced in the text are marked (unused)). The Thumbs button in the panel bar toggles the thumbnails on/off; the choice is saved with the node.

APNext H3 Scenes Join

Display Name: APNext H3 Scenes Join

In the batch workflows ComfyUI renders every scene as its own clip (one Save Video per list element). Drop this node between the per-scene VAE Decode / VAE Decode Audio and a single Create Video β†’ Save Video to get one continuous video of all scenes instead. Takes the per-scene IMAGE (and optional AUDIO) lists, concatenates frames in order and joins the audio tracks (sample rate / channel count unified to the first scene), outputs one images batch + one audio track plus frame_count / scene_count. crossfade_frames blends the cut between scenes (0 = hard cut); size_mismatch resizes stray scenes to the first scene's resolution or errors; replace_audio swaps the joined per-scene audio for one track of your own (the original song from the Music Video Writer). h3_scenes_batch.json and h3_crossover_batch.json ship with it wired in; for true scene-to-scene continuity use the Contex Loop route below.

[per-scene VAE Decode] ─IMAGE list─► [H3 Scenes Join] ─images/audio─► [Create Video] ─► [Save Video]   (one file)
[per-scene VAE Decode Audio] ─AUDIO listβ”€β”˜

APNext H3 Scenes β†’ Contex Loop Plan

Display Name: APNext H3 Scenes β†’ Contex Loop Plan

For continuity across scenes (the last frames and audio of scene N carried into scene N+1). Converts the scenes / durations lists into the plan JSON that ComfyUI-MiniMaxH3-Contex-Loop's MiniMax H3 Contex Loop Plan node accepts on plan_json_input (shots[] with id, prompt, duration_seconds, seed, plus optional prompt_prefix and defaults.steps). That pack's loop body then renders every scene in order with the previous tail as motion/audio context, checkpoints and final assembly. Alternatives for one-scene-per-run chains: core MiniMaxH3AddGuide, ComfyUI-H3-Motion-Context, or this repo's APNext H3 Claude Code Continue Writer (last frame β†’ I2VA first frame).

Example workflows in examples/h3/: h3_crossover_batch.json (render every scene in one queue, stitched by H3 Scenes Join into one video), h3_crossover_pick_one.json (Scene Pick + incrementing index, one scene per run), h3_scenes_batch.json (every scene rendered then stitched by H3 Scenes Join into one video), h3_scenes_pick_one.json, h3_music_video.json (song β†’ H3 Music Video Writer β†’ clips β†’ one video with the original track), h3_llm_backend_crossover.json (the crossover batch written by a local model: an H3 LLM Backend set to ollama:qwen3:14b on the writer's llm socket), h3_llm_backend_writer_refiner.json (one LLM Backend feeding both the Claude Code Writer and the Refiner, session_id chained so the refiner resumes the local session; draft and refined prompt previewed side by side, the refined one rendered), and h3_crossover_contex_chain.json β€” the Contex-Loop T2V – Normal example with the crossover writer in continuous-chain mode feeding Scenes β†’ Contex Loop Plan into plan_json_input, so the whole run renders scene after scene with the previous tail carried forward. Every example has an H3 Prompt Preview wired to the writer's prompt / scenes text output so the generated prompt is visible on the canvas.


Dialogue, <d> tags and language

<d>[English] …</d> in the output is not stray markup β€” it is how H3 marks spoken audio, and the guide requires it. The speaker's identifying phrase, (S1) ID, action and delivery stay outside the tag; only the language tag and the words actually said go inside:

the young, gravel-voiced warrior (S1) grits his teeth and shouts:
<d>[English] Stand still, you overgrown worm!</d>

Strip the tags before generating and H3 will treat those words as narration to depict rather than speech to voice.

  • Don't want speech at all? include_dialogue β†’ off. No <d> blocks, no (Sx) IDs.
  • Want another language? Pick it in dialogue_language. The characters then genuinely speak it β€” the node instructs the model to write the lines in that language rather than write English and label it otherwise, which matters for smaller local models that would happily do the latter.
  • Auto picks a language that fits the scene: "two market traders haggle over spices in old Cairo" comes back in Egyptian colloquial Arabic.
  • custom_dialogue_language takes anything the dropdown lacks, dialects included β€” Norwegian (Bergen dialect) yields <d>[Norwegian (Bergen dialect)] Det kjem til Γ₯ regne heile dagen, du.</d>.

Narration, action and camera language always stay English; only the spoken words change.


The wildness slider

One dial from conservative to unhinged. Above 40 it also injects concrete surreal events (not mood words) drawn from a 40-entry pool β€” selection is driven by seed, so the same seed gives the same weirdness.

The Music Video Writer and Music Video (Minimal) have no wildness dial at all - their story, setting and any surreal beats come from the lyrics and direction only.

RangeBandBehaviourRandom elements
0–15ConservativeStrictly literal, no invented events0
16–40GroundedBelievable, well-directed embellishment0
41–65BoldStrong authorial choices, physics still holds1
66–85WildSurreal juxtapositions, dreamlike logic2
86–100UnhingedScale, gravity and continuity all negotiable3

Injected elements are filmable, e.g. "the subject's shadow moves a beat out of sync", "a doorway opens onto a completely different biome", "rain falls upward into the sky".


🎲 Prompt Generators

Auto Prompter

Display Name: Auto Prompter

Generate random prompts from extensive category databases.

InputDescription
subjectMain subject (can include LoRA triggers)
customPrefix text for styling
artformPhotography, digital art, etc.
Various category selectionsRandom or specific choices

APNext Node

Display Name: APNext Node

Advanced prompt building with category-based enhancements.

Overview

Node Family Overview

The system includes numerous nodes that can be chained together to create complex workflows:

Node Chaining Example

Supports 24 main categories with subcategories:

  • Architecture: styles, buildings, interiors, materials
  • Art: painting, sculpture, techniques, palettes
  • Artist: concept artists, illustrators, painters
  • Character: anime, fantasy, sci-fi, superheroes
  • Cinematic: directors, genres, effects, color grading
  • Fashion: designers, outfits, accessories
  • Feelings: emotional modifiers
  • Geography: countries, nationalities
  • Human: jobs, hobbies, groups
  • Interaction: individual, couple, group, crowd interactions
  • Keywords: modifiers, genres, trending terms
  • People: archetypes, body types, expressions
  • Photography: cameras, lenses, lighting, film types
  • Plots: action, romance, horror, sci-fi scenarios
  • Poses: portrait and action poses
  • Scene: weather, textures, environments
  • Science: astronomy, mathematics, medical
  • Stuff: seasonal objects, gadgets, fantasy items
  • Time: eras, decades, centuries
  • Typography: fonts, word art styles
  • Vehicle: cars, classic cars, vehicle types
  • Video Game: games, engines, actions

πŸ”§ Utility Nodes

String Merger

Display Name: APNext String Merger

Combine multiple strings with separators.


Flexible String Merger

Display Name: APNext Flexible String Merger

Advanced string combining with custom formatting.


Sentence Mixer

Display Name: APNext Sentence Mixer

Shuffle and mix sentences from multiple inputs for creative variations.


Custom Prompt Loader

Display Name: APNext Custom Prompts

Load prompt templates from the data/custom_prompts/ directory.

Included templates:

  • promptcreator.txt - Full creative prompt generation
  • image_analyze.txt - Image analysis prompts
  • gemini_video.txt - Video generation prompts
  • cloner.txt - Style cloning prompts
  • Various LoRA-specific templates (ohwx, t5xxl, etc.)

Local Random Prompt

Display Name: APNext Local random prompt

Load random prompts from local text files.


Random Integer Generator

Display Name: APNext Random Integer Generator

Generate random integers with min/max range.


πŸ“ Adding Custom Categories

Create your own categories for APNextNode:

  1. Create a folder in data/next/ (e.g., data/next/mycategory/)
  2. Add JSON files for each field

Simple Format

["item1", "item2", "item3"]

Advanced Format

{
  "preprompt": "with",
  "separator": " and ",
  "endprompt": "visual effects",
  "items": ["motion blur", "lens flare", "particle effects"],
  "attributes": {
    "motion blur": ["dynamic", "cinematic"],
    "lens flare": ["bright", "atmospheric"]
  }
}

πŸ“ Custom Prompt Templates

Create your own prompt templates for use with the Custom Prompt Loader node.

Location

Place .txt files in: data/custom_prompts/

Creating a Template

Templates are plain text files containing instructions for LLM nodes. They support dynamic variable substitution:

VariableDescription
##TAG##Replaced with the tag input (e.g., "ohwx man")
##SEX##Replaced with the sex input (e.g., "male", "female")
##PRONOUNS##Replaced with pronouns (e.g., "him, his")
##WORDS##Replaced with target word count

Example Template

Create a file data/custom_prompts/my_style.txt:

As a professional art critic, describe the provided image in detail.
Focus on creating a cohesive scene as if describing a movie still.

If the subject is ##TAG##, use ##PRONOUNS## pronouns appropriately.
The subject is ##SEX##.

Include:
- Main subject description with clothing, accessories, position
- Setting and environment details
- Lighting type, direction, and atmosphere
- Color palette and emotional tone
- Camera angle and composition

Output approximately ##WORDS## words.
Do not use JSON format. Provide a single cohesive paragraph.

Included Templates

TemplatePurpose
promptcreator.txtDetailed image analysis (~150 words)
promptcreator_small.txtConcise image analysis
image_analyze.txtGeneral image description
cloner.txtStyle cloning prompts
gemini_video.txtVideo generation prompts
gemini_ohwx.txtLoRA trigger-aware prompts
t5xxl.txtT5-XXL optimized prompts
ltxv.txtLTX Video model prompts
next_scene.txtCinematic scene transitions

βš™οΈ Configuring LLM Models

Customize available models by editing JSON configuration files in the data/ folder.

Model Configuration Files

FileProviderDescription
gemini_models.jsonGoogle GeminiGemini model list
gpt_models.jsonOpenAIGPT model list
claude_models.jsonAnthropicClaude model list
grok_models.jsonxAIGrok model list
groq_models.jsonGroqGroq model list (text + vision)
qwenvl_models.jsonQwenVLLocal Qwen vision models

QwenVL Models - Adding Private/Custom Models

QwenVL nodes support loading additional models from private configuration files. This allows you to add custom or uncensored models without modifying the main configuration.

How to add private models:

  1. Create a JSON file in data/ with a name matching private_*qwenvl*.json

    • Examples: private_qwenvl_models.json, private_uncensored.qwenvl_models.json
  2. Use the same format as qwenvl_models.json:

{
    "models": [
        "huihui-ai/Huihui-Qwen3-VL-4B-Instruct-abliterated",
        "huihui-ai/Huihui-Qwen3-VL-8B-Instruct-abliterated",
        "another-namespace/custom-model"
    ]
}
  1. Restart ComfyUI - the models will appear in the QwenVL node dropdowns

Notes:

  • Private files are loaded in addition to the main qwenvl_models.json
  • Duplicate models are automatically filtered out
  • Supports full HuggingFace repo paths (namespace/model-name)
  • Models are downloaded to ComfyUI/models/LLM/Qwen-VL/ on first use

Basic Format

Most model files use a simple array format:

{
    "models": [
        "model-name-1",
        "model-name-2",
        "model-name-3"
    ]
}

Example: Adding New Gemini Models

Edit data/gemini_models.json:

{
    "models": [
        "gemini-2.5-pro",
        "gemini-2.5-flash",
        "gemini-flash-latest",
        "gemini-flash-lite-latest",
        "gemini-2.5-flash-lite",
        "gemini-exp-1206"
    ]
}

Example: Adding New Claude Models

Edit data/claude_models.json:

{
    "models": [
        "claude-sonnet-4.5",
        "claude-sonnet-4",
        "claude-sonnet-3.7",
        "claude-opus-4.1",
        "claude-opus-4",
        "claude-haiku-3.5",
        "claude-haiku-3"
    ]
}

Groq Models (Advanced Format)

Groq supports separate text and vision model lists:

{
    "text_models": [
        "llama-3.3-70b-versatile",
        "llama-3.1-8b-instant",
        "groq/compound",
        "qwen/qwen3-32b"
    ],
    "vision_models": [
        "meta-llama/llama-4-scout-17b-16e-instruct",
        "meta-llama/llama-4-maverick-17b-128e-instruct"
    ],
    "note": "Edit this file to add/remove models"
}

Notes

  • Restart ComfyUI after editing model configuration files
  • For Groq, the system will first try to fetch models from the API, then fall back to the JSON file
  • Model names must match exactly what the provider's API expects
  • Invalid model names will cause API errors at runtime

πŸ–ΌοΈ Example Workflows

Example workflows are available in the examples/ directory:

  • APNext workflows: examples/flux/apnext/
  • Florence2 local: examples/flux/florence2/
  • GPT-4o Vision: examples/flux/gpt-4o_vision/
  • Ollama local: examples/flux/ollama_local_llm/
  • MiniCPM: examples/minicpm/

πŸ“‹ Requirements

openai>=2.54.0,<3.0.0
anthropic>=0.121.0
google-genai>=2.18.0
httpx>=0.28.1
huggingface_hub[hf_xet]>=0.34.0
chardet>=5.2.0

Anything ComfyUI already ships in its own requirements.txt β€” Pillow, requests, transformers, scipy, tqdm, numpy, torch β€” is deliberately not repeated, since re-pinning it only risks downgrading the base install.

Two constraints worth knowing about:

  • openai is capped below 3.0. v3 switched to HTTPX2 and stopped shipping httpx; the GPT/Grok/Groq nodes pass an httpx.Client as http_client=, which v3 rejects.
  • Gemini uses google-genai, not google-generativeai. The legacy SDK hard-pinned google-ai-generativelanguage==0.6.15, which forced protobuf<6 and dragged grpcio into the ComfyUI environment. The current SDK needs neither.

decord is listed but commented out: it is unmaintained and not numpy-2 safe, and the QwenVL/MiniCPM video nodes fall back to OpenCV automatically. Uncomment it in requirements.txt if you specifically want decord-based frame decoding.


πŸ”„ Model Support Matrix

ProviderTextVisionVideoLocal
OpenAI GPTβœ…βœ…βŒβŒ
Google Geminiβœ…βœ…βœ…βŒ
Anthropic Claudeβœ…βœ…βŒβŒ
Claude Code CLIβœ…βœ…βŒβš™οΈ local CLI, own login
xAI Grokβœ…βœ…βŒβŒ
Groqβœ…βœ…βŒβŒ
QwenVLβœ…βœ…βœ…βœ…
Ollamaβœ…βœ…βŒβœ…
LM Studio / vLLM / llama.cppβœ…βœ…βŒβœ…
MiniCPMβœ…βœ…βœ…βœ…
Phi-3.5βœ…βœ…βŒβœ…

Ollama and the other OpenAI-compatible servers are selectable directly in the H3 prompt writers via the ollama: / lmstudio: / local: prefixes β€” see MiniMax-H3 Prompt Nodes. Vision depends on the loaded model being multimodal.


πŸ“ License

MIT License β€” see LICENSE.

Third-party data: the MIT grant covers the code in this repository. data/h3/guide_base_en.md and data/h3/guide_ref_en.md are MiniMax's official H3 prompt-writing guides, shipped verbatim from MiniMaxAI/MiniMax-H3, and data/h3/dataset_visual_styles.json is derived from the ostris/minimax_h3_1k dataset β€” those files keep whatever terms their sources carry.


πŸ™ Acknowledgments

Built for the ComfyUI community. Special thanks to all contributors and users providing feedback.

Shoutout to malcolmrey for the crossover ideas and for finding valid characters β€” see his various dataset on Hugging Face. The H3 Crossover Writer and the character casting owe him a beer. 🍻

Shoutout to ostris for the minimax_h3_1k dataset β€” 1,000 MiniMax-H3 prompts with the videos they rendered. The writers' word budgets, shot counts, sound-field rules and the visual_style list (327 openers in the dataset's own words) are measured from it; see scripts/h3_dataset_survey.py and data/h3/h3_1k_survey.md. πŸ™

The example workflows stand on these excellent node packs:

  • ComfyUI-H3-Motion-Context-MultiRef by seitanism β€” the masked-audio latent technique behind the h3_music_video_masked_audio workflow (the song written into the H3 audio latent and protected from denoising, for structural lip-sync).
  • audio-separation-nodes-comfyui by christian-byrne β€” the vocal-stem separation feeding that same workflow.
  • Nvidia RTX Nodes by Comfy-Org / NVIDIA β€” the RTX Video Super Resolution finishing pass used across the example workflows.
  • ComfyUI-MiniMaxH3-Contex-Loop by ethanfel β€” the continuity-chain renderer targeted by the h3_crossover_contex_chain workflow.
  • dagre (MIT) β€” vendored for the canvas auto-layout tools.