Nodes/ComfyUI-Easy-Media/H3 Sampling Preview Sampler
ComfyUI Node

H3 Sampling Preview Sampler

The sampler you watch but never wire

By yolain·Created 4 months ago·Updated about 23 hours ago· 184
H3 Sampling Preview Sampler
  • noise
  • guider
  • sampler
  • sigmas
  • latent_image
  • preview_vae
  • output
  • denoised_output
enabled_tilingfalse
tile_count2
preview_node_id
generated_frame_count1
preview_fps24.00
segment_index0
sampling_passsampling

You probably don't add this node. It appears.

If you searched the node menu for "H3 Sampling Preview Sampler" and felt like you were missing context, you weren't. This thing is not in the pack's README node table, its schema is flagged dev-only, and its category is EasyUse/H3/dev - internal plumbing the author left exposed.

Here's what actually happens. MiniMax H3 is a 33B omni-modal video model, and the pack's easy multitrackProject node drives it segment by segment with an optional second, upscaled pass. That node builds its own sampling graph behind the scenes: when the model_loader it receives carries a preview_vae, it swaps the stock SamplerCustomAdvanced for this node - once per sampling pass.

That matters more than it sounds. Latent-preview thumbnails on a 33B video model are near-useless; a decoded preview per step lets you kill a bad seed at step 6 instead of after segment four.

How the preview actually works

Mechanically it's SamplerCustomAdvanced plus a callback. Each sampling step hands over the model's current x0 - the denoiser's guess at the clean latent. This node runs that through process_latent_out and decodes it with preview_vae. H3 latents are nested, video and audio bundled as one tensor, so the preview pulls out the video stream only; audio never appears, no matter how the pass is going.

Then it trims cost aggressively: half the segment's frames (generated_frame_count // 2, minimum one), interpolated rather than repeated, downscaled past 640px, encoded as a JPEG for one frame or an animated WebP for several. Encoding runs on a background worker with a two-item queue that drops stale work - a preview of step 3 arriving during step 9 is worse than none at all.

Updates go out over the websocket as an easy_media.sampling_preview event addressed to preview_node_id - and that is the MultiTrack Project node, not this one. The frame lands in a preview widget on the project node itself.

The inputs that matter

The five required inputs are the standard SamplerCustomAdvanced set - noise, guider, sampler, sigmas, latent_image - and by the time you'd have any reason to touch this node, the project node has filled all of them. sampler and sigmas arrive as a pair, generated from the project's sampling_plan preset (or your custom ones), which is why the pack's docs keep warning that a preset's first and second pass can run different sigma schedules. This node just executes whatever schedule it's handed.

The optional ones are the interesting half:

  • preview_vae and preview_node_id - both are needed for the custom preview. The project only hands them over when the loader dictionary carries a preview VAE plus a node id, and if either is missing you fall back to ComfyUI's ordinary latent preview callback, i.e. the usual low-res thumbnail.
  • enabled_tiling and tile_count (2–8, default 2) - experimental spatial tiling of H3's high-resolution evaluation, adapted from the SelfLift sampler work. It splits the transformer pass into overlapping regions and stitches them, trading extra evaluations for lower peak VRAM. Off by default; leave it off unless you're OOMing on the second pass.
  • generated_frame_count, preview_fps, segment_index, sampling_pass - cosmetic. They size and label the preview: preview_fps is rescaled so the shortened clip keeps its real duration, and segment_index / sampling_pass (first, second or selflift in the project pipeline) tell the overlay whether you're watching pass one or the upscaled pass two.

Outputs are the familiar pair: output, the sampled latent, and denoised_output, the x0 the callback captured - if no callback ran, that second output is just a copy of the first. In the project pipeline only output goes anywhere.

Installing it

It ships with the pack; there's no separate install and no model download for this node. Search ComfyUI-Easy-Media in ComfyUI Manager and restart, or:

cd /path/to/ComfyUI/custom_nodes
git clone https://github.com/yolain/ComfyUI-Easy-Media

The README's one hard requirement is worth respecting: install FFmpeg on the system first, since the whole pack is video-centric. Because this node is dev-flagged, expect little documentation and possibly a hidden menu entry - that's normal, and it doesn't need you to place it.

Traps

  • Watch the project node, not the sampler. preview_node_id routes frames to easy multitrackProject, which owns the preview widget. Nothing renders on the sampler's own footprint.
  • No preview at all? The callback bails when there's no attached client, which is what API-driven or headless runs look like. A scripted render samples fine and shows you nothing.
  • An all-white preview is a known historical bug class here: tiny VAEs returning uint8 pixels (0–255) could get interpolated and then clamped as if they were 0–1, saturating every frame white. There's a regression test for it now - update rather than debugging your VAE.
  • Don't reach for this as a general sampler node. It's a drop-in for SamplerCustomAdvanced with preview telemetry stapled on; for a plain graph you want the stock node.

One last hedge rather than a knock: the pack is new, and the author's earlier ComfyUI-Easy-Use gets far more community airtime. You're an early adopter here, not following a crowd.

CategoryEasyUse/H3/dev

Inputs (13)

NameTypeDefaultDescription
noiseNOISE
guiderGUIDER
samplerSAMPLER
sigmasSIGMAS
latent_imageLATENT
enabled_tilingoptBOOLEANfalse
tile_countoptINT22–8
preview_vaeoptVAE
preview_node_idoptSTRING
generated_frame_countoptINT1
preview_fpsoptFLOAT24.00
segment_indexoptINT0
sampling_passoptSTRINGsampling

Outputs (2)

NameTypeDescription
outputLATENT
denoised_outputLATENT