Nodes/ComfyUI-BFSNodes/BFS Shot H3 Conditioning
ComfyUI Node

BFS Shot H3 Conditioning

The one H3 node you actually wire per shot

By alisson-anjos·Created 8 months ago·Updated 5 days ago· 134
BFS Shot H3 Conditioning
  • shot
  • clip
  • vae
  • audio_vae
  • vlm
  • model
  • positive
  • latent
  • prompt
  • model
◄guide_modealigned guide (Add Guide)►
◄ref_image_sizematch►
◄with_audiofalse►
◄inpaintper shot (planner)►
◄source_bluroff►
◄source_blur_strength1.00►
◄source_blur_segmenterSAM 3.1►
◄source_blur_effectblur►
◄clip_video_fps2.0►
◄native_guide_scale1.000►
◄native_temporal_backendflash partitions (no compile)►

What it's for

MiniMax H3 will generate 4–15 second clips. It will also, quietly, stop following your guide long before that. The pack's docs put the number plainly: an H3 body-swap LoRA trained on 107-frame clips holds the scene, framing and motion at 4.5 seconds and starts summarising at 10. That's the entire reason the BFS Shot Loop exists - chop the source at camera cuts into model-sized shots, then run the rest of the graph once per shot.

BFS Shot H3 Conditioning is the node that turns one of those shots into H3 conditioning. Inside the loop it sits between BFS Shot Planner / Unpack and the sampler, and it's the plain-language version of the pack's bigger conditioning node: references, prompt, length, a guide, and none of the duet/RoPE machinery. On an H3 swap with the native nodes, this is the one you want on the canvas.

How it works

It doesn't reimplement H3 - it drives ComfyUI's native MiniMax H3 nodes for you, sending your prompt, the shot's references and the shot's generation length through Reference to Video and attaching the shot's own frames with Add Guide. The shot is a real object from the planner that carries its reference, prompt, mask and length, which is why this node needs so few widgets.

The one choice you have to think about is guide_mode:

  • aligned guide (Add Guide) - the shot's frames sit on the generated frames, frame by frame. This is what a body-swap or motion-preserving LoRA expects, and it's the default.
  • native reference video (Video 1) - the shot enters as <Video 1> context, like a reference video. The model reads it; it isn't frame-locked to your output.
  • both - when the aligned guide alone keeps losing the background.
  • none - prompt and pictures only.

The inputs that matter

Three of them do most of the work:

  • guide_mode - see above. If a LoRA was trained with an aligned guide and you leave this on none, you get a pretty, inconsistent video and no idea why.
  • inpaint - per shot (planner) respects each shot's mode from the planner, only the mask forces mask-only generation on every shot, off never. Mask-only is the "regenerate only the person" path: the latent starts from the shot's own frames and the shot's mask becomes H3's generation mask, so everything outside it stays put. It needs a mask on the shot, and you get nothing new without one.
  • source_blur - blurs the source subject in what the model sees of the guide (and the reference video), keeping the mouth sharp. It still reads pose, motion and lips, but has no face to photocopy, so identity comes from your reference - often the difference between a new face and a warped version of the old one.

The rest: shot, clip and vae come from the planner and your loaders. use_ref_2 passes the shot's second reference; ref_image_size decides whether references are matched to the generation size or kept at their own max. with_audio plus an audio_vae conditions on the shot's soundtrack, which the tooltip says improves lip sync, and vlm takes a Qwen3-VL encoder that fills in {details} when the planner left it blank.

What comes out

Three outputs. positive (CONDITIONING) goes to your guider. latent (LATENT) is the target canvas at the shot's size and length - it goes to the sampler's latent input, not to a guide. prompt (STRING) is the finished text the node actually used, so wire it to a Show Text node: it's the only way to see the prompt after {details} and layout tags got filled in, and where you'll notice the planner handed you nothing.

Install

ComfyUI Manager: search ComfyUI-BFSNodes and install. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/alisson-anjos/ComfyUI-BFSNodes.git
cd ComfyUI-BFSNodes
pip install -r requirements.txt

Requirements are the usual suspects (torch, numpy, Pillow, safetensors, librosa, opencv-python, scenedetect - the last one for the planner's automatic cut detection). Restart ComfyUI afterwards. No model downloads beyond H3 and your LoRA.

Gotchas and troubleshooting

Your ComfyUI has to be new enough to ship native H3. The node imports MiniMax H3's Reference to Video and Add Guide from comfy_extras at run time; on a build without them you get an import error, and no amount of reinstalling this pack will fix it.

Update the pack before you file a bug. This repo is numbered in the 1.9x range and moves fast; the H3 layout and VAE APIs it monkey-patches move under it, and the docs promise explicit errors when they don't line up. One community-reported IndexError - from a timestep desync when a Face-ID LoRA meets IC-LoRA guides - was fixed upstream, so a stale clone is a real cause of weirdness.

cd ComfyUI/custom_nodes/ComfyUI-BFSNodes
git pull --ff-only

Size and licence expectations. The author runs a 5090, and his published workflows have a reputation for OOM-ing on 24GB cards - start at the planner's default generation size and earn your way up. And H3's community licence locks the local weights out of the US, EU, UK and South Korea, which is worth knowing before you build a pipeline on it.

CategoryBFS/shot loop

Inputs (17)

NameTypeDefaultDescription
shotBFS_SHOT—
clipCLIP—
vaeVAE—
guide_modeCOMBOaligned guide (Add Guide)aligned guide: preserve the shot frame by frame with MiniMax H3 Add Guide. native reference video: provide it as <Video 1> context. both: use both paths. aligned guide + CLIP video context: Qwen sees the shot at clip_video_fps without native shot reference latents; motion still uses Add Guide. Native temporal alignment: experimental native video mode for its matching LoRA; MODEL input and output must be connected, no Add Guide or VSA.
ref_image_sizeCOMBOmatch2 options: match, max
audio_vaeoptVAE—
with_audiooptBOOLEANfalseCondition on the shot soundtrack too. This can improve lip sync when audio_vae is connected.
vlmoptCLIPOptional Qwen3-VL encoder. Fills missing reference details in the planner prompt.
inpaintoptCOMBOper shot (planner)Use each shot's Planner mask mode, force mask-only generation, or disable it.
source_bluroptCOMBOoffBlur the source subject in the guide so the model is less likely to copy its identity: '<region> (<what stays sharp>)'; masked area = the shot's own mask.
source_blur_strengthoptFLOAT1.000.1–1—
source_blur_segmenteroptCOMBOSAM 3.1What finds the face / head / hands / person and the mouth for source_blur. SAM 3.1: text prompts (already used by the planner). Sapiens2: body-part classes in one pass, finer lips and teeth (downloads facebook/sapiens2-seg-0.4b, 1.6 GB, to models/sapiens2 the first time). The 'keep lips + tongue' modes always use Sapiens2 for the lips.
source_blur_effectoptCOMBOblurblur: no detail left. invert colours: keeps the shapes and the expression but not the skin tone or the colours.
clip_video_fpsoptFLOAT2.00.5–24Only for aligned guide + CLIP video context. Qwen sampling rate for this shot; try 2, 4 or 8 fps. Higher values cost more context/encoding time, not output fps. Console confirms sent frames, video vision tokens and completed encoding.
modeloptMODELRequired for native temporal mode. Route MODEL output to the guider.
native_guide_scaleoptFLOAT1.0000.125–1Native temporal mode only: spatial scale of the motion video before encoding; output size, frame count and identity references stay unchanged. Try 0.5 to reduce guide tokens/VRAM.
native_temporal_backendoptCOMBOflash partitions (no compile)Native temporal mode only. Flash partitions preserves the temporal attention policy without compilation; Flex is the original implementation.

Outputs (4)

NameTypeDescription
positiveCONDITIONING—
latentLATENT—
promptSTRING—
modelMODEL—