FunPack Decode
The VAE Decode that knows MiniMax H3 isn't one tensor
- samples
- vae
- model
- audio_vae
- images
- audio
- status
If you've wired a MiniMax H3 latent into ComfyUI's stock VAE Decode and watched it throw something incomprehensible, you already know why this node exists. Core's decoder takes one tensor, hands it to vae.decode, and comes back with an image batch. H3 doesn't produce one tensor. Its latent is a nested thing with a video branch and an audio branch, plus an X2 Detail VAE that isn't decoded the way you'd guess. FunPack Decode is the decoder that asks the model what it's holding before it touches anything.
What it does, mechanically
The node has two paths and the order matters. First it offers the latent to whatever model modules are loaded, by capability. If a module recognises it - H3 does - that module decodes it and hands back (images, audio). If a module claims the latent and then breaks, the node stops with the exception rather than falling through, because decoding a nested latent as if it were one tensor would quietly give you a different picture than the model intended.
Second path: nothing claimed it, and the latent is a plain single tensor, so it does a normal VAE decode with optional tiling. If the latent is nested and nothing claimed it, you get a refusal instead of a guess - and the message tells you the likely cause, which is almost always that you didn't wire model.
One nice touch: a batch of clips comes back as a strip of frames rather than a 5-D blob nothing downstream understands.
The inputs that matter
samples and vae are required and unsurprising. The one everybody skips is model - it's marked optional, but for H3 it's the difference between "a module recognises this latent" and "I refuse to decode it". Wire your diffusion model into it. The tooltip is straight about it: needed only when a model has its own way of being decoded.
audio_vae is for models that generate sound alongside the picture. Leave it empty on a silent pipeline and the audio output comes back empty.
Then tile_size, which is where this gets interesting. Default 0 means "the model's own way". For H3 that's ComfyUI's 256px tiles - the size its decoder was trained on. Push it higher to go faster and you'll see a grid in the output, which is not a bug, it's the tile boundary showing up. An X2 Detail VAE ignores you and tiles at 256 minimum anyway.
Outputs are images (into Save Image, a video combiner, whatever you're assembling), audio (into an audio save node when the model made sound), and status - a plain string saying which path ran, e.g. decoded as a single latent or <module> decoded this. Keep it wired to a text display node while you're setting up; it's the cheapest debugging you'll ever do.
Installing
ComfyUI Manager, search ComfyUI-FunPack, or:
cd ComfyUI/custom_nodes
git clone https://github.com/olivv-cs/ComfyUI-FunPack
pip install -r ComfyUI-FunPack/requirements.txt
Install into the same Python environment ComfyUI runs in, then restart. Two things worth knowing before you start: Manager pulls from the Comfy Registry, which can lag - check Settings ▸ About FunPack to see which version you actually got. And FunPack's requirements.txt is deliberately timid (it pins comfy-kitchen>=0.2.32 for one attention kernel and pulls gguf for .gguf loaders); if pip ever proposes upgrading torch, numpy or transformers, read the plan before saying yes.
FunPack is a one-person hobby project - the README says so in as many words - and v5 is a rewrite, not an update. Which has a practical upside here: nodes are modules that announce themselves, so a module that fails to load is simply absent instead of half-present.
Troubleshooting
"This latent has more than one part and no installed module knows how to decode it." Wire model. That's the whole fix nine times out of ten; the message even says so when the input is empty.
Seams or a faint grid across the frame. You raised tile_size past what the decoder likes. Put it back to 0 on H3.
Out of memory at the decode step specifically. Sampling finished and then the decode died, which is common on video. The tiled path exists for exactly this.
And the boring one: H3's weights ship under the MiniMax H3 Community License, which excludes the US, EU, UK and South Korea from its permitted territory. That's a licensing question rather than a node question, but it's the thing that actually stops people, so it's worth knowing before you spend an evening debugging.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| samples | LATENT | — | |
| vae | VAE | The picture VAE. | |
| modelopt | MODEL | The model this latent came from. Needed only when a model has its own way of being decoded. | |
| audio_vaeopt | VAE | Only for models that generate sound alongside the video. | |
| tile_sizeopt | INT | 00–4096 | Decode in tiles of this many pixels, to fit less VRAM. 0 = the model's own way. MiniMax H3: 0 is ComfyUI's 256px tiles, the size its decoder was trained on; bigger tiles show a grid. An X2 Detail VAE is always tiled (256 at least). |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| audio | AUDIO | — |
| status | STRING | — |