MiniMaxH3 Create RefMod
Create RefMod Is a Casting File, Not a LoRA
- vae
- audio_vae
- refmod_name
Keeping a character consistent across generations is the problem the ecosystem keeps rerouting rather than solving - LoRAs, IP-Adapters, then instruction editing. MiniMax H3's REF2VA mode sidesteps it differently: you hand the model up to nine pictures, three videos and three audio files and it reads them as conditioning in the same pass that generates picture and sound. The catch is that every one of those references has to be cropped, decoded and VAE-encoded on every single run.
MiniMaxH3 Create RefMod freezes that work into a file. It takes the reference selection you already built on the Director timeline, encodes each item through the native H3 reference path, and packs the resulting latents into a single .safetensors bundle in models/refmods/. Later you select the bundle instead of re-uploading the media. It is emphatically not a LoRA: nothing is trained, no trigger words, and the encoder is H3's own VAE, which is why there are no training settings to fiddle with and also why it can't make the model learn anything it didn't already know.
What actually happens when you queue it
timeline_data is a Director snapshot - the same workflow-local state that carries your references, including the disabled and hidden ones, which is why the overlay makes you uncheck what you don't want. Each surviving item is resolved inside ComfyUI's input folder, cropped with PyAV to its trim window (15 seconds max per crop, a 1 GiB decode estimate ceiling, video needing at least five decodable frames), and pushed through core's MiniMaxH3ReferenceToVideo with text conditioning deliberately skipped - real encode, no prompt.
Video and audio become separate members, so a video reference with sound lands as a video latent plus an audio latent. Video frame counts get snapped to H3's 17-frame grid, and when frames are dropped you get a warning naming the item instead of a silent trim. The bundle itself is v5 format with _format_version: 5, a member list, your description and concept type, and dasiwa_warnings for anything it had to adjust. Publishing is an atomic link, so an existing file with that name is never overwritten - you get a new one or an error, never a surprise.
The fields
name is a safe basename with no paths, reserved Windows names or exotic characters; leave it empty and you get director-<random>. description is bundle metadata, not an instruction - the tooltip is blunt about that and it's right, the model doesn't read it as a prompt. concept_type picks generic/identity/style/motion/audio and is a label only; it changes no encoding. request_id exists so a cached button result can't replay an old export; you won't touch it.
The two real switches are the optional vae and audio_vae. Raw images and video need the H3 video VAE. Raw audio - or the soundtrack of a selected video - needs the H3 audio VAE. Packing bundles you already saved needs neither, because the tensors are carried through untouched.
Output is refmod_name, a STRING. That's it, and it's an output node, so the encoding and saving happen on queue.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/darksidewalker/ComfyUI-DaSiWa-Nodes
cd ComfyUI-DaSiWa-Nodes
pip install -r requirements.txt
Or Manager → DaSiWa-Nodes. models/refmods/ is resolved the way ComfyUI resolves its models directory, so --base-directory and extra_model_paths are respected. Note the pack's real weight: nvidia-vfx, llama-cpp-python and transformers all come along in requirements.txt whether you want them or not. Also worth knowing - H3's community licence excludes the US, EU, UK and Korea, and no node pack changes that.
Where people get burned
The VAE error is the common one. "Connect the MiniMax H3 video VAE for RefMod export" means exactly that; a Wan or SD VAE won't be detected. If you're exporting a video with its sound, both VAEs must be connected.
Silence is rejected. An audio crop that decodes to zeros or NaNs fails rather than producing a dead bundle member.
You can't edit pixels afterwards. Reopening a saved bundle lets you edit descriptions, uncheck members and rename - no VAE needed, latents unchanged. You cannot re-crop or re-encode inside it.
Don't double up. A new RefMod isn't auto-enabled next to its raw sources. Pick one or the other; the docs say so because feeding both means duplicate conditioning.
It doesn't extend limits or guarantee identity. A bundle stores references; it doesn't raise REF2VA's 9/3/3 ceiling, and it won't lock a face or clone a voice on its own. It's a caching-and-reuse mechanism, and the honest framing is that the seam quality still comes down to your references and prompt.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| timeline_data | STRING | {} | Selected Director snapshot, including disabled/hidden references. |
| request_id | STRING | Unique export request ID to prevent cached button results. | |
| name | STRING | Safe basename without paths; empty generates a unique director name. Never overwrites. | |
| description | STRING | Descriptive bundle metadata, not a training instruction. | |
| concept_type | COMBO | Metadata label: general, identity, style, motion, or audio; does not alter encoding. | |
| vaeopt | VAE | MiniMax H3 video VAE, required for raw images/video. | |
| audio_vaeopt | VAE | MiniMax H3 audio VAE, required for raw audio or selected video sound. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| refmod_name | STRING | — |