H3 • Text to Image
Describing a picture to a video model
- models
- image_job
What it's for
This is the front half of the pack's generate workflow. You write a prompt, pick a shape and a size, and it hands a prepared job to H3 • Render Image, which does the actual sampling. Splitting it in two isn't fussiness - it's the whole point, and it's worth thirty seconds of your time to see why.
Prepare is the expensive bookkeeping: tokenising your prompt through a 32B Qwen encoder, sizing the canvas, building the latent. Sampling is the expensive compute. They don't have to happen together. Change only your seed or step count downstream and ComfyUI's graph cache reuses the prepared job instead of re-encoding your prompt. That's a free lunch on iteration, and you get it just by using the pack as designed.
How it works
MiniMax H3 is an omni-modal video model, so its latent holds a video stream and an audio stream. For a still, this node builds exactly one latent frame of video - 24 channels, one frame deep - and pairs it with a zeroed audio latent, because the sampler expects both slots to exist. Text goes through clip.tokenize(prompt, images=[]) with no references attached. One image comes out the far end. There is no frame count to set anywhere in the new interface, and no frame selection node, because there is only ever one frame.
One neat detail from the source: the still is worth sampling as a still rather than as a video packet, and H3's decoder is where that reputation for banding on lone frames came from. The fix lives in Render Image, not here - but it's the reason this node's payoff isn't a noisy single-frame artifact.
The inputs that matter
models - wire in H3 • Models, or the last H3 • LoRA in your chain. This is the one wire beginners get wrong by skipping the LoRA node entirely and also leaving the old turbo shortcut enabled upstream.
prompt - plain sentences. The Qwen encoder is LLM-based, so the CLIP-era toolkit does nothing here: (word:1.4) weighting is disabled and gets fed to the encoder as literal punctuation, BREAK has no chunk boundary to break against, and masterpiece, best quality spam just eats attention budget your description needed. Write what you want to see, name the framing and the camera if you want a photographic look, and stop.
aspect_ratio - the canvas shape. Options run 1:1 square, 4:5 portrait, 3:4 portrait, 2:3 portrait, 9:16 portrait, 16:9 landscape, 3:2 landscape, 4:3 landscape, 21:9 ultrawide, and custom pixels. Note there's no "source image" entry - that one belongs to the edit node, which has a source.
megapixels - how big, from 0.1 to 32, defaulting to 3. Sizes snap to a 32-pixel grid, and the MP figure uses ComfyUI's 1024² convention. Start at 3. Drop to 1 MP for a look-see, push to 4–8 when you've got something worth keeping. It's ignored when aspect_ratio is custom pixels.
width / height are the optional advanced pair, only read in custom pixels mode (64–16384, 32-pixel steps). Both sit in the advanced section - right-click, or drag the node wider.
One honest limit: bigger canvases cost sampling memory and time, and tiled decoding doesn't shrink the diffusion model to fit your GPU. Big MP numbers are a "do I have the VRAM" question, not a quality dial.
The output
image_job is an H3_STILL_JOB - prepared conditioning plus the one-frame latent. There's exactly one consumer: H3 • Render Image. If you're wiring this into a stock KSampler you've misread the pack; the job type only exists inside it.
Install
ComfyUI Manager, search "MiniMax H3 Image Studio", or:
cd ComfyUI/custom_nodes
git clone https://github.com/astropuzzo/ComfyUI-MiniMax-H3-Image-Studio
Restart and refresh. Needs ComfyUI 0.37.0+; no Python dependencies beyond ComfyUI's own. Then download the three H3 files - the FL2VA diffusion model, the Qwen3-VL encoder, the H3 video VAE - into diffusion_models/, text_encoders/ and vae/. The easiest start is Templates → MiniMax H3 Image Studio, which loads a wired-up Models → Text to Image → Render Image → Save Image graph with everything already connected.
Where people get burned
"Write an image description" errors. The prompt is empty or whitespace. It's a hard fail, not a warning.
Nothing happens when you change the seed. Correct - that's the cache doing its job. Change the prompt and you'll pay for a re-encode.
The 0.98 MP ceiling. There isn't one here. Older H3 workflows in the wild capped around 1 MP; this interface takes a megapixel number and goes. If you're porting habits from an older guide, you're leaving resolution on the table.
Style descriptions that do nothing. If you want a photograph, describe a camera and film stock rather than a mood. LLM-encoded models reward concrete nouns and ignore the old quality-tag vocabulary.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| models | H3_STUDIO_MODELS | Connect H3 Models directly, or the last optional H3 LoRA. | |
| prompt | STRING | Describe the final image. Your prompt is used directly without hidden preservation wording. | |
| aspect_ratio | COMBO | 1:1 square | Choose the canvas shape. Source image keeps Picture 1's ratio; custom pixels uses the advanced width/height controls. |
| megapixels | FLOAT | 3.00.1–32 | Target image size, rounded to a 32-pixel grid. Start at 3 MP; 1 MP is a preview, 4–8 MP costs more. Ignored in custom pixels mode. |
| widthopt | INT | 204864–16384 | Exact pixel width, only when aspect_ratio is custom pixels. |
| heightopt | INT | 153664–16384 | Exact pixel height, only when aspect_ratio is custom pixels. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image_job | H3_STILL_JOB | Prepared still and cached prompt conditioning. Connect to Render Image. |