Scheduled Maintenance

We're performing scheduled maintenance. Some features may be temporarily unavailable.

Choose Theme

JollyAI Default

Clean and professional dark theme

It Comes at Night New

Ultra dark JollyAI theme

Stranger Things

80s horror-sci-fi aesthetic

Batman

Dark knight, dark theme

Barbie

Bright and colorful Barbie theme

Ocean Blue

Twitter-inspired blue theme

Midnight Purple

Catppuccin-inspired purple theme

Forest Green

Matrix-style green theme

Crimson Red

Warm red-based dark theme

Amber Glow

Warm amber/orange theme

Dracula

Popular gothic-inspired theme

Monokai

Classic Sublime Text theme

Nord

Arctic-inspired cool theme

Gruvbox

Community favorite warm theme

Solarized Dark

Carefully calibrated for readability

One Dark Pro

Popular VS Code theme
Production workflow · 6 steps · Full JSON included

Best MiniMax H3 Turbo Workflow — 6 Steps The exact ComfyUI graph we run in production, with audio

MiniMax H3 generates video and synchronised audio in a single pass. Run it with the stock settings and you are looking at 20+ sampling steps. This is the turbo graph we actually run — 6 steps, a 4-step distilled LoRA, and a sampler built for that schedule. Full workflow JSON is on this page: copy it or download it.

Short answer

The MiniMax H3 turbo workflow runs at 6 sampling steps because the model is driven by a 4-step distilled turbo LoRA plus the turbo pack's own sampler, not by the base schedule. The three settings that matter are BasicScheduler at simple / 6 / denoise 1.0, MiniMaxH3TurboLoRA at strength 1.0, and MiniMaxH3SigmaShift at shift_video 12.0 / shift_audio 3.0. The LoRA must be loaded by the turbo pack's own node — loading it through core's LoraLoaderModelOnly fails silently and you render the base model at 6 steps, which looks broken. Raising steps above 6 does not improve quality, because a distilled checkpoint is trained for a fixed short schedule. Resolution is not typed in directly: a ResolutionSelector node derives width and height from an aspect ratio plus a megapixel budget, snapped to a multiple of 32.

The full workflow JSON

This is the API-format graph, pulled out of a real render's metadata and sanitised — 24 nodes, image-to-video with audio. Drop it into ComfyUI with Workflow → Open (or paste into the API input), then point LoadImage at your own image and edit the prompt.

minimax-h3-turbo-6step.json · 24 nodes ⬇ Download
{
  "92": {
    "inputs": {
      "frame_rate": 24.0,
      "loop_count": 0,
      "filename_prefix": "video/MiniMax_H3_i2v",
      "format": "video/h264-mp4",
      "pix_fmt": "yuv420p",
      "crf": 20,
      "save_metadata": true,
      "trim_to_audio": false,
      "pingpong": false,
      "save_output": true,
      "images": [
        "105:10",
        0
      ],
      "audio": [
        "105:23",
        0
      ]
    },
    "class_type": "VHS_VideoCombine",
    "_meta": {
      "title": "Video Combine 🎥🅥🅗🅢"
    }
  },
  "115": {
    "inputs": {
      "aspect_ratio": "1:1 (Square)",
      "megapixels": 0.4,
      "multiple": 32
    },
    "class_type": "ResolutionSelector",
    "_meta": {
      "title": "Resolution Selector"
    }
  },
  "105:11": {
    "inputs": {
      "vae_name": "minimax_h3_video_vae_fp16.safetensors"
    },
    "class_type": "VAELoader",
    "_meta": {
      "title": "Load VAE"
    }
  },
  "105:24": {
    "inputs": {
      "vae_name": "minimax_h3_audio_vae_fp32.safetensors"
    },
    "class_type": "VAELoader",
    "_meta": {
      "title": "Load VAE"
    }
  },
  "105:130": {
    "inputs": {
      "anything": [
        "105:14",
        0
      ]
    },
    "class_type": "easy cleanGpuUsed",
    "_meta": {
      "title": "Clean VRAM Used"
    }
  },
  "105:131": {
    "inputs": {
      "anything": [
        "105:130",
        0
      ]
    },
    "class_type": "easy clearCacheAll",
    "_meta": {
      "title": "Clear Cache All"
    }
  },
  "105:23": {
    "inputs": {
      "samples": [
        "105:131",
        0
      ],
      "vae": [
        "105:24",
        0
      ]
    },
    "class_type": "VAEDecodeAudio",
    "_meta": {
      "title": "VAE Decode Audio"
    }
  },
  "105:10": {
    "inputs": {
      "samples": [
        "105:131",
        0
      ],
      "vae": [
        "105:11",
        0
      ]
    },
    "class_type": "VAEDecode",
    "_meta": {
      "title": "VAE Decode"
    }
  },
  "105:148": {
    "inputs": {},
    "class_type": "MiniMaxH3TurboSampler",
    "_meta": {
      "title": "MiniMax-H3 Turbo Sampler (4-step)"
    }
  },
  "105:9": {
    "inputs": {
      "scheduler": "simple",
      "steps": 6,
      "denoise": 1.0,
      "model": [
        "105:143",
        0
      ]
    },
    "class_type": "BasicScheduler",
    "_meta": {
      "title": "BasicScheduler"
    }
  },
  "105:14": {
    "inputs": {
      "noise": [
        "105:15",
        0
      ],
      "guider": [
        "105:16",
        0
      ],
      "sampler": [
        "105:148",
        0
      ],
      "sigmas": [
        "105:9",
        0
      ],
      "latent_image": [
        "105:104",
        1
      ]
    },
    "class_type": "SamplerCustomAdvanced",
    "_meta": {
      "title": "SamplerCustomAdvanced"
    }
  },
  "105:16": {
    "inputs": {
      "model": [
        "105:143",
        0
      ],
      "conditioning": [
        "105:104",
        0
      ]
    },
    "class_type": "BasicGuider",
    "_meta": {
      "title": "Basic Guider"
    }
  },
  "105:6": {
    "inputs": {
      "model_name": "minimax_h3_fl2va_pruned_int8_convrot.safetensors",
      "weight_dtype": "default",
      "compute_dtype": "default",
      "patch_cublaslinear": false,
      "sage_attention": "disabled",
      "enable_fp16_accumulation": false
    },
    "class_type": "DiffusionModelLoaderKJ",
    "_meta": {
      "title": "Diffusion Model Loader KJ"
    }
  },
  "105:13": {
    "inputs": {
      "clip_name": "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
      "type": "minimax",
      "device": "default"
    },
    "class_type": "CLIPLoader",
    "_meta": {
      "title": "Load CLIP"
    }
  },
  "105:15": {
    "inputs": {
      "noise_seed": 0
    },
    "class_type": "RandomNoise",
    "_meta": {
      "title": "RandomNoise"
    }
  },
  "105:144": {
    "inputs": {
      "lora_name": "MINIMAX\\minimax_h3_turbo_4step_ema_ckpt500.safetensors",
      "strength": 1.0,
      "low_vram": false,
      "model": [
        "105:6",
        0
      ]
    },
    "class_type": "MiniMaxH3TurboLoRA",
    "_meta": {
      "title": "MiniMax-H3 Turbo LoRA"
    }
  },
  "105:136": {
    "inputs": {
      "sage_attention": "auto",
      "allow_compile": true,
      "model": [
        "105:144",
        0
      ]
    },
    "class_type": "PathchSageAttentionKJ",
    "_meta": {
      "title": "Patch Sage Attention KJ"
    }
  },
  "105:139": {
    "inputs": {
      "enabled": false,
      "blend_weight": 0.5,
      "degree": 4,
      "ridge_lambda": 0.1,
      "window_size": 2.0,
      "flex_window": 0.75,
      "warmup_steps": 5,
      "tail_actual_steps": 1,
      "max_history": 8,
      "debug": false,
      "history_storage": "system_ram",
      "bootstrap_first_forecast": true,
      "anchor_residual_feedback": false,
      "selective_rollback_correction": false,
      "offline_smoothing_replay": true,
      "audio_blend_weight": 0.0,
      "offline_archive_storage": "system_ram",
      "model": [
        "105:136",
        0
      ]
    },
    "class_type": "SpectrumApplyMiniMaxH3",
    "_meta": {
      "title": "Spectrum Apply MiniMax H3"
    }
  },
  "105:140": {
    "inputs": {
      "max_resolution": 1024,
      "jpeg_quality": 80,
      "suppress_default_preview": true,
      "preview_frames": 360,
      "preview_fps": 8,
      "model": [
        "105:139",
        0
      ]
    },
    "class_type": "ModelPreviewOverrideKJ",
    "_meta": {
      "title": "Model Preview Override"
    }
  },
  "105:143": {
    "inputs": {
      "shift_video": 12.0,
      "shift_audio": 3.0,
      "model": [
        "105:140",
        0
      ]
    },
    "class_type": "MiniMaxH3SigmaShift",
    "_meta": {
      "title": "MiniMax H3 Sigma Shift"
    }
  },
  "105:104": {
    "inputs": {
      "prompt": "A golden retriever puppy sits in a sunlit kitchen and looks up at the camera. It says \"good morning\" in a soft, warm voice, then tilts its head. Shallow depth of field, natural window light, gentle handheld camera drift.",
      "width": [
        "115",
        0
      ],
      "height": [
        "115",
        1
      ],
      "length": [
        "105:107",
        1
      ],
      "clip": [
        "105:13",
        0
      ],
      "vae": [
        "105:11",
        0
      ],
      "first_frame": [
        "114",
        0
      ]
    },
    "class_type": "MiniMaxH3ImageToVideo",
    "_meta": {
      "title": "MiniMax H3 Image to Video"
    }
  },
  "105:107": {
    "inputs": {
      "expression": "max(5, round(a * 24)) + (5 - (max(5, round(a * 24)) % 17)) % 17",
      "values.a": [
        "105:111",
        0
      ]
    },
    "class_type": "ComfyMathExpression",
    "_meta": {
      "title": "Math Expression"
    }
  },
  "105:111": {
    "inputs": {
      "value": 10.0
    },
    "class_type": "PrimitiveFloat",
    "_meta": {
      "title": "Float (duration)"
    }
  },
  "114": {
    "inputs": {
      "image": "your_input_image.png"
    },
    "class_type": "LoadImage",
    "_meta": {
      "title": "Load Image"
    }
  }
}

The settings that actually matter

NodeSettingValueWhy
BasicSchedulerschedulersimple The LoRA was distilled against this curve. See the scheduler note below.
BasicSchedulersteps6 Fixed. The turbo sampler's tooltip says 4; 6 is the sweet spot in practice.
MiniMaxH3TurboLoRAstrength1.0 Applied to the UNet before every other model patch.
MiniMaxH3SigmaShiftshift_video / shift_audio12.0 / 3.0 Video and audio need very different shifts — this is one node, two values.
ResolutionSelectormegapixels / multiple0.4 / 32 Width and height are derived, not typed. 0.4 MP is our short-clip tier.
PathchSageAttentionKJsage_attentionauto Sage is applied by this node only — the loader's own sage stays disabled.
ComfyMathExpressionexpressionmax(5, round(a*24)) + (5 - (max(5, round(a*24)) % 17)) % 17 Frame count must land on a 17-frame boundary. 10 s → 243 frames, not 240.
VHS_VideoCombineformat / crfh264-mp4 / 20 Muxes the generated audio track with the video.

What the graph does, in six moves

  1. Load the model stackDiffusionModelLoaderKJ for the H3 UNet, CLIPLoader (type minimax) for the Qwen3-VL text encoder, and two VAEs: one for video, one for audio. H3 needs both.
  2. Patch the model — turbo LoRA → sigma shift → Sage attention. Order matters; the LoRA goes on first, everything downstream reads the patched model.
  3. Size the latentResolutionSelector turns an aspect ratio plus a megapixel budget into real dimensions, and the math node converts seconds into a legal frame count.
  4. ConditionMiniMaxH3ImageToVideo takes your image, your prompt and both VAEs, and produces the video+audio latent pair the sampler expects.
  5. SampleSamplerCustomAdvanced driven by MiniMaxH3TurboSampler and the 6-step simple schedule. This is the whole render.
  6. Decode and muxVAEDecode for frames, VAEDecodeAudio for sound, then VHS_VideoCombine writes one MP4 with the audio track attached.

Four traps that cost us real time

1. Loading the turbo LoRA with the wrong node fails silently

If you apply minimax_h3_turbo_4step through core's LoraLoaderModelOnly, the ComfyUI log reports lora key not loaded for every one of the 518 tensors in the file — and then renders anyway. You get the base model at 6 steps, which looks like the model is bad rather than like the LoRA never loaded. Use the turbo pack's own MiniMaxH3TurboLoRA node.

2. The scheduler is not a free choice

simple is the only correct value here. We ran beta for a few hours and output quality degraded — beta is a different curve (a beta-distribution PPF) that this LoRA was never distilled against. The turbo pack's own README says simple, twice.

3. More steps is not better

A distilled turbo checkpoint is trained for a fixed short schedule. Handing it 20 steps does not buy quality, it just costs you time. We removed steps as a per-job option entirely rather than let it be tuned.

4. Don't apply Sage attention twice

DiffusionModelLoaderKJ has its own sage_attention field and there is also a dedicated PathchSageAttentionKJ node. Pick one. In this graph the loader's is disabled and the patch node does the work.

Text-to-video instead of image-to-video

The graph above is image-to-video. For pure text-to-video the model stack, the LoRA, the shift values and the 6-step schedule are all identical — you swap the LoadImageMiniMaxH3ImageToVideo front end for the text-to-video conditioning node and keep everything from the sampler onward exactly as it is.

No GPU? Run H3 on ours

This graph needs a serious card and a full ComfyUI install with the MiniMax H3 turbo pack. If you just want the output, JollyAI runs this exact pipeline as a hosted tool — free daily generations, no signup for the first one.

Frequently asked questions

Why 6 steps and not 4?

The LoRA is a 4-step distillation and the sampler's tooltip says 4, but the graph that ships and that we run in production uses 6. Six is where quality stops improving; going higher only costs time.

Can I raise the steps for better quality?

No. A distilled checkpoint is trained for a fixed short schedule, so extra steps are not a supported configuration and do not improve the result.

Why are there two VAEs in the workflow?

MiniMax H3 produces video and audio together. One VAE decodes the video latent, a separate audio VAE decodes the sound, and the two are muxed into a single MP4 at the end.

What does sigma shift 12 / 3 do?

It shifts the noise schedule separately for the video and audio branches. They need very different values — 12.0 for video, 3.0 for audio — and the single MiniMaxH3SigmaShift node carries both.

Why is the frame count 243 and not 240 for a 10-second clip?

Frame counts have to land on a 17-frame boundary, so the math node rounds seconds × 24 up to the next legal value. 10 seconds becomes 243 frames.

Is this workflow free to use?

Yes. Copy or download the JSON from this page and use it however you like. Nothing on this page is gated.