H3 LBH Pad Visual Conditions
One socket, no settings, and why it's in the graph anyway
- model
- MODEL
Every so often you meet a node with nothing to configure, and this is one: H3 LBH Pad Visual Conditions takes a MODEL and gives back a MODEL. No width, no mode, no threshold. It's a shim, and the interesting question is why the author needed it.
What it's for
H3's DiT consumes visual conditioning as latent rows folded into the token stream, and it assumes those condition latents subdivide cleanly into patches. Latents whose spatial dimensions aren't a multiple of the patch size break that assumption. Hand the model one and you don't get a helpful error - you get something that fails deep in a forward pass, or worse, runs and produces nonsense.
So the node wraps the model's internals. Specifically it clones the MODEL, takes the diffusion model's _cond_video_rows callable, and replaces it with a wrapper that maps pad_to_patch_size (ComfyUI's own comfy.ldm.common_dit helper) over every entry in cond_video_latents before the original function sees them. The payload is copied first and the padding is applied to the list, so nothing upstream is mutated. Then the original builder runs as normal.
That's the entire mechanism: pad the odd condition latent up to a legal patch-sized shape, then proceed. In the shipped example it sits at the very end of the model chain - loader → FFN chunks → core BlockSparseAttention → QKV reuse → sigma shift → this → both guiders - which is exactly where you'd want a last-in-line fix-up.
Should you care?
Honest answer: with the presets, probably not - every dimension in the example workflow is a multiple of 32, so the conditions are already legal and this node is a no-op with extra steps. Its job is to make your experiments survivable. The moment you type 700 instead of 704, or feed it a fitted image with a dimension the VAE rounds awkwardly, the pad path is what keeps the run alive instead of dumping you in a stack trace. Given it costs one wire and zero decisions, leaving it in is the right call: it's insurance you'll want the first time you go off-script.
Wiring
model in, MODEL out. Put it last on the model chain, feeding your guiders and samplers, so that every patch you applied earlier is already in place underneath it. Because every patch node in this pack works by cloning the model and overriding one attribute, order matters in one direction only: each node must receive the output of the previous one, not a second wire off the loader. If you fan the loader out to five patch nodes and only reconnect two of them, you'll spend an hour wondering why your sample is at full precision.
Install
ComfyUI Manager: search H3 LBH X2 Stream, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/sepiablue-ai/ComfyUI-H3-LBH-X2-Stream
and restart ComfyUI.
Requirements are einops>=0.8.0 and safetensors>=0.7.0; nothing exotic, and no model downloads for this particular node. What it does depend on is a recent ComfyUI - the pack targets native H3 with SLA, dynamic VRAM, ConvRot W4A4 and Sol-Attn, validated on 0.38.0/0.39.0. The models the workflow needs (fused INT8 H3, Qwen3-VL NVFP4 encoder, three VAEs, the LBH 3D FP16 upscaler) are placed by hand; see the pack's extra_model_paths.yaml.example if your models live outside the ComfyUI folder, and remember to add the latent_upscale_models entry.
Common issues
It can't be "tuned" out of a problem. If you still get shape errors with this node in place, the fix is upstream: check your four conditioning sizes from the image-conditioning node and your handoff width/height. All of them want multiples of 32, and the pad node only corners odd condition latents - it doesn't rescue a resolution the sampler can't tile.
Don't expect it to change your output. With aligned dimensions the wrapper pads nothing, so it is bit-identical to running without it. If your output changed after adding it, something else changed too.
It failed with a _cond_video_rows / attribute error. That's ComfyUI drift: the pack reaches into diffusion-model internals that core owns, and a core refactor can move them. The author pins his validation to specific ComfyUI versions for exactly this reason - update the pack and ComfyUI together rather than one at a time.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |