H3 Studio · Image Director
The control panel that makes MiniMax H3 behave like an image model
- media
- h3_bundle
- media_1
- media_2
- media_3
- media_4
- media_5
- media_6
- media_7
- media_8
- media_9
- studio_context
- compiled_prompt
- state_json
- width
- height
- seed
- diagnostics
MiniMax H3 is a video model. It does images, but only through paths the lab never actually polished for stills - which is why doing H3 image generation in raw ComfyUI means building a graph of routing, reference conditioning, sampler profiles, frame selection and VAE handling by hand. The Director is the node that hides all of that machinery behind one big control panel. If H3 Studio is the point of this pack, this is the point of H3 Studio.
It's the front-end for everything: your prompt, up to nine ordered reference images, resolution, seed, enhancement mode, and which H3 route and sampling profile to take. You type a prompt, connect a few images, pick a profile, and queue - the Director compiles all of it into a typed studio_context that the downstream Condition & Route node consumes.
The part beginners under-use: ordered references
The Director's superpower is how references work. Wire images into media_1 through media_9, and each gets a card with a role (identity, pose, outfit, style, composition, environment, and more) and a retention policy (fully_preserved, attribute_transfer, partially_preserved, reference_only). In your prompt you just write @Image1, @Image2, and so on - the node compiles those friendly mentions into H3's native <Picture N> conditioning under the hood. The cards survive workflow reloads with their descriptions and thumbnails intact.
That's the mechanism worth understanding: H3 Studio keeps four jobs separate - factual analysis of what's in each reference, ownership (which image owns which attribute), prompt direction, and deterministic compilation of @ImageN into <Picture N>. If you only use one, make it this: give each reference one narrow job and say so explicitly. "Keep the identity and pose from @Image1, transfer only the jacket from @Image2" beats a vague paragraph every time, because reference editing here is semantic regeneration, not pixel-locked compositing.
The inputs that matter
The required list is long but most of it has sane defaults you can ignore. The ones you'll actually touch:
- prompt - write the visual objective naturally; use
@ImageNonly where a connected reference has a concrete job. - sampling_profile - the 11-choice speed/quality ladder, from
base_quality_20(safest) through the LightX 8-steplightx_v1_fl2v_8(the default) down to 4-step LightX and PDD profiles. The LightX labels are intentionally artifact-specific: v1.0 follows the published adapter, v0.1 recipes are empirical. - frame_profile - 5/9/13/20 temporal frames (
recommended_5is the default), plus the experimental one-frameimage_vae_1. H3 denoises the whole temporal packet jointly, so more frames mean more candidates to pick from but a much slower run. - resolution / aspect_ratio / megapixels - the Director shows the real aligned dimensions and marks draft vs recommended vs experimental ranges. Direct mode spans roughly 0.2–8.5 MP, but treat anything above ~1 MP as an experiment; H3 is not a dedicated super-resolution model and big canvases buy you VRAM pain faster than detail.
- route -
autois the smart default; it picks FL2VA for text-to-image and image-to-image and REF2VA for reference editing, and rejects impossible combinations before sampling starts. - seed - capped at 2^50-1 so ComfyUI's LiteGraph never clamps two randomized seeds onto the same boundary value. That tooltip is there because it's a real footgun.
- enhance_mode -
off,single_prompt,compile_only(default), orvlmfor the optional Qwen3-VL prompt pipeline.
Outputs and next steps
The Director returns studio_context (feed this into Condition & Route), compiled_prompt (worth a glance the first few times to see what H3 actually receives), state_json, width, height, seed, and diagnostics. The recommended wiring in the maintained workflow is Loader → Director → Condition → sampling → decode → frame select.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/thaakeno/ComfyUI-MiniMax-H3-Studio.git
cd ComfyUI-MiniMax-H3-Studio
python -m pip install -r requirements.txt
Restart and hard-refresh the frontend. Models are not auto-downloaded - set them up via the Model Setup node or the README's links first. It's alpha, so expect rough edges, and remember the H3 weights themselves are geofenced out of the US/EU/UK/Korea by the community license.
Inputs (78)
| Name | Type | Default | Description |
|---|---|---|---|
| mode | COMBO | image | 2 options: image, reference |
| prompt | STRING | — | |
| resolution | COMBO | Custom | 4 options: 480P, 768P, 1024P, Custom |
| aspect_ratio | COMBO | 1:1 | 11 options: 1:1, 4:5, 5:4, 3:4, 4:3, 2:3, +5 |
| width | INT | 102432–16384 | — |
| height | INT | 102432–16384 | — |
| seconds | FLOAT | 55–5 | — |
| advanced | BOOLEAN | false | — |
| fps | FLOAT | 2424–24 | — |
| keyframe_role | COMBO | first | 2 options: first, last |
| ref_image_size | COMBO | 2k | 2 options: 1k, 2k |
| reference_mention_mode | COMBO | index | 2 options: index, filename |
| megapixels | FLOAT | 1.500.2–8.5 | — |
| seed | INT | 00–1125899906842623 | H3 Studio seed. Values are limited to 2^50-1 so LiteGraph/ComfyUI never clamps different randomized seeds to the same 2^50 boundary value. |
| enhance_mode | COMBO | compile_only | 4 options: off, single_prompt, compile_only, vlm |
| adherence | FLOAT | 0.850–1 | — |
| route | COMBO | auto | 3 options: auto, fl2va, ref2va |
| sampling_profile | COMBO | lightx_v1_fl2v_8 | 11 options: base_quality_20, base_balanced_12, lightx_v1_fl2v_8, lightx_v1_fl2v_8_pruned, lightx_v1_fl2v_4_pruned, lightx_er_sde_4, +5 |
| frame_profile | COMBO | recommended_5 | 5 options: image_vae_1, recommended_5, balanced_9, quality_13, maximum_20 |
| analyzer_model | STRING | — | |
| studio_state | STRING | — | |
| mediaopt | * | — | |
| media_filenameopt | STRING | — | |
| h3_bundleopt | H3_STUDIO_BUNDLE | — | |
| media_1opt | * | — | |
| media_type_1opt | STRING | image | — |
| media_filename_1opt | STRING | — | |
| role_1opt | COMBO | auto | 15 options: auto, identity, character, face, style, composition, +9 |
| retention_1opt | COMBO | attribute_transfer | 4 options: attribute_transfer, fully_preserved, partially_preserved, reference_only |
| description_1opt | STRING | — | |
| media_2opt | * | — | |
| media_type_2opt | STRING | image | — |
| media_filename_2opt | STRING | — | |
| role_2opt | COMBO | auto | 15 options: auto, identity, character, face, style, composition, +9 |
| retention_2opt | COMBO | attribute_transfer | 4 options: attribute_transfer, fully_preserved, partially_preserved, reference_only |
| description_2opt | STRING | — | |
| media_3opt | * | — | |
| media_type_3opt | STRING | image | — |
| media_filename_3opt | STRING | — | |
| role_3opt | COMBO | auto | 15 options: auto, identity, character, face, style, composition, +9 |
| retention_3opt | COMBO | attribute_transfer | 4 options: attribute_transfer, fully_preserved, partially_preserved, reference_only |
| description_3opt | STRING | — | |
| media_4opt | * | — | |
| media_type_4opt | STRING | image | — |
| media_filename_4opt | STRING | — | |
| role_4opt | COMBO | auto | 15 options: auto, identity, character, face, style, composition, +9 |
| retention_4opt | COMBO | attribute_transfer | 4 options: attribute_transfer, fully_preserved, partially_preserved, reference_only |
| description_4opt | STRING | — | |
| media_5opt | * | — | |
| media_type_5opt | STRING | image | — |
| media_filename_5opt | STRING | — | |
| role_5opt | COMBO | auto | 15 options: auto, identity, character, face, style, composition, +9 |
| retention_5opt | COMBO | attribute_transfer | 4 options: attribute_transfer, fully_preserved, partially_preserved, reference_only |
| description_5opt | STRING | — | |
| media_6opt | * | — | |
| media_type_6opt | STRING | image | — |
| media_filename_6opt | STRING | — | |
| role_6opt | COMBO | auto | 15 options: auto, identity, character, face, style, composition, +9 |
| retention_6opt | COMBO | attribute_transfer | 4 options: attribute_transfer, fully_preserved, partially_preserved, reference_only |
| description_6opt | STRING | — | |
| media_7opt | * | — | |
| media_type_7opt | STRING | image | — |
| media_filename_7opt | STRING | — | |
| role_7opt | COMBO | auto | 15 options: auto, identity, character, face, style, composition, +9 |
| retention_7opt | COMBO | attribute_transfer | 4 options: attribute_transfer, fully_preserved, partially_preserved, reference_only |
| description_7opt | STRING | — | |
| media_8opt | * | — | |
| media_type_8opt | STRING | image | — |
| media_filename_8opt | STRING | — | |
| role_8opt | COMBO | auto | 15 options: auto, identity, character, face, style, composition, +9 |
| retention_8opt | COMBO | attribute_transfer | 4 options: attribute_transfer, fully_preserved, partially_preserved, reference_only |
| description_8opt | STRING | — | |
| media_9opt | * | — | |
| media_type_9opt | STRING | image | — |
| media_filename_9opt | STRING | — | |
| role_9opt | COMBO | auto | 15 options: auto, identity, character, face, style, composition, +9 |
| retention_9opt | COMBO | attribute_transfer | 4 options: attribute_transfer, fully_preserved, partially_preserved, reference_only |
| description_9opt | STRING | — |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| studio_context | H3_STUDIO_CONTEXT | — |
| compiled_prompt | STRING | — |
| state_json | STRING | — |
| width | INT | — |
| height | INT | — |
| seed | INT | — |
| diagnostics | STRING | — |