Nodes/ComfyUI-RefCap/H3 RefCap Apply (cached)
ComfyUI Node

H3 RefCap Apply (cached)

Skip the 32B encoder and pay a small identity tax

By AEmotionStudio·Created about 16 hours ago·Updated about 16 hours ago· 1
H3 RefCap Apply (cached)
  • conditioning
  • CONDITIONING
◄refcap▾►
◄rowstrue►
◄latentstrue►

What it is, and the honest pitch

H3 RefCap Apply (cached) is the fast, slightly-wrong way to use a RefCap. Instead of running your stored photos back through Qwen3-VL-32B every queue, it takes a prompt you already encoded with no references and bolts the RefCap's cached text-encoder rows onto the front of it, then attaches the stored reference latents to the DiT. No image ever touches the 32B encoder.

That's a real saving - a 32B vision-language encoder is the biggest single lump of work in an H3 graph that isn't the DiT itself. It's also why the node exists as a separate thing rather than a checkbox on Replay: the author didn't want to hide the trade.

The trade is this. Qwen is causal, so in the native path your prompt tokens sit after the vision blocks and can attend to them. Here the prompt was encoded alone, and the image rows get glued in afterwards. The rows no longer agree with each other.

How much does it actually cost?

The pack measured it rather than hand-waving. Against a native encode, the prompt rows came out at cosine median 0.97, minimum 0.31. On their two test subjects the face similarity dropped from 0.660 to 0.652 - a 0.008 average hit. On twelve paired runs it won 6 of 12. That is... basically free, which surprised me.

But the node's two toggles show where the fragility is. With rows off and latents on - latents only - you drop to 0.585. With rows on and latents off, 0.391. That second number is the interesting one: the text-encoder's picture rows are almost useless alone. The VAE latent is doing the heavy lifting for identity; the rows are what let your prompt refer to the pictures coherently. Use both, or expect mush.

The inputs

  • conditioning - a prompt encoded with no reference inputs at all. The natural source is MiniMax H3 Reference to Video with nothing wired to its ref slots, prompt filled in.
  • refcap - any RefCap in models/refcaps/. Notably including files captured without their photos, which Replay can't touch.
  • rows (default on) - prepend the cached <Picture i> rows. Needs a RefCap captured with store_rows on, otherwise you get "has no cached rows". View sets never store rows, so they'll always fail here with rows on.
  • latents (default on) - attach the reference latents to the DiT.

Output is a single CONDITIONING. Wire it where the reference node's positive would go. The latent still comes from Empty MiniMax H3 AV Latent.

One guard worth knowing: the node refuses conditioning that already contains image rows or minimax_refs. RefCap rows are numbered <Picture 1..n> and the blocks are ordered to match, so pre-existing references would collide with the labels and shift everything. If you need several subjects, this isn't the node - H3 RefCap Select → H3 RefCap Replay Pack is.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/AEmotionStudio/ComfyUI-RefCap.git

Or ComfyUI Manager → ComfyUI-RefCap → Install → restart. Nothing to pip install. You need the H3 model stack regardless: minimax_h3_ref2va_pruned_int8_convrot.safetensors in diffusion_models/, the Qwen3-VL-32B nvfp4 encoder in text_encoders/, video and audio VAEs in vae/. Template H3 RefCap 3 - Apply (cached) is the reference wiring; template H3 RefCap 4 - AB native vs RefCap is the one to actually run, because it renders native / Replay / Apply branches on one shared prompt and seed so you can judge the trade on your own character instead of someone else's London Set faces.

So when do you reach for it?

When the encoder pass is the thing making your iteration loop painful - low VRAM, big batches of prompt variants over one character, or a graph where you're re-rolling a prompt twenty times and the reference is constant. Cache the expensive half, vary the cheap half. That's exactly the shape this node was built for.

What I wouldn't do is ship it as the default. It's a documented deviation from native, and the deviation is small enough that you can't see it in a single frame - which is precisely the kind of thing that bites you after you've rendered forty clips and one of them has a slightly different face. Replay for final, Apply for drafts. The pack author says the same thing, in more diplomatic language.

And if you're in the US, EU, UK or South Korea, none of this is licensed anyway - H3's community licence excludes those territories from its Applicable Territory. That's a model-level constraint you should read before you build a pipeline on it.

Categoryadvanced/refcap

Inputs (4)

NameTypeDefaultDescription
conditioningCONDITIONINGprompt encoded without references, e.g. MiniMaxH3ReferenceToVideo with no ref inputs
refcapCOMBO0 options:
rowsBOOLEANtrueprepend the text encoder's <Picture i> rows
latentsBOOLEANtrueattach the reference latents to the DiT

Outputs (1)

NameTypeDescription
CONDITIONINGCONDITIONING—