Neo H3 Add Keyframe (Hybrid)
Pin Frame Zero Without Losing Your Refs
- model
- conditioning
- vae
- image
- model
- conditioning
Here's the blunt version: this is the older sibling. The pack's own source says the H3 Video Director now uses Neo H3 Add Context for cross-segment continuity, and that Add Keyframe is "kept for hand-built graphs and older canvases." So if you arrived here from a search engine expecting the current recommended path, you probably want Add Context. But this node isn't dead - it solves one specific problem that core doesn't.
What problem it solves
H3's in-context conditioning has two independent kinds of anchor: keyframe anchors, which say "this image belongs at frame N", and references, which are the multi-image blocks official reference-to-video uses. Core's H3 nodes write one or the other. If you want both at once - a hard first frame plus your reference sheet influencing the whole clip - you hit a snag: when keyframe anchors and refs coexist, core overwrites the keyframe latents with the ref latents (comfy/model_base.py), and your anchor quietly vanishes. The layout also starts both rows' time coordinates at the wrong origin.
That's the "hybrid" in the display name. This node adds a keyframe anchor and returns a MODEL that makes the anchor and the refs coexist with their timelines aligned. For a plain image-to-video job, just use core's image-to-video node - it already takes a first frame. Reach for this when you're stacking an anchor on top of an existing reference conditioning, or when you've loaded a graph that already had it in it.
How it works
Feed it a conditioning that already carries refs, plus the MODEL, the H3 video VAE and your image. It takes image[:1] - only the first frame of the batch - runs it through the VAE, and writes a single keyframe entry with resolved_frame_index=0. Frame zero, by definition, which is what makes it a reliable anchor: there's no index maths to get wrong.
It also sets minimax_frame_count to your frame_count, then returns the model with the same continuity wrapper Add Context uses. That wrapper is doing all the work: it merges the keyframe latents and the reference latents back into one list so core stops discarding your anchor, and it shifts the anchor rows so they line up with the target video's timeline instead of starting at the text length. It's installed under a namespaced key and cleared before re-adding, so chaining several of these only ever keeps one copy.
Inputs and outputs
Five required inputs and nothing optional: model, conditioning, vae, image, frame_count.
frame_count defaults to 124 and runs 5 to 3600. It's the length the keyframe timeline is measured against - a consistency declaration, not a "how many frames do I anchor" control. Keep it in step with the sampler's actual frame count. A mismatch doesn't break the connection the way a bad frame index would, since the anchor is pinned at 0, but don't expect a stretched timeline to help you.
Outputs are model and conditioning, and the pairing matters:
model→ the sampler's model input (this is where the wrapper lives)conditioning→ the sampler's positive (and negative, if you're using one)
Wire the conditioning alone and the anchor row still gets clobbered by the refs. Wire the model alone and you've patched a model for nothing. Both, or it doesn't work.
Installing
ComfyUI Manager → search Neo Nodes, or clone it and restart:
cd ComfyUI/custom_nodes
git clone https://github.com/neoneo-ai/ComfyUI-Neo-Nodes.git ComfyUI-Neo-Nodes
Python deps come from the pack's requirements.txt - openai, Pillow, PyYAML, pypinyin - so you don't have to install anything by hand, and llama_cpp_python is only needed if you want the pack's local-LLM nodes.
No weights ship with the pack. This node needs the H3 video VAE (not the audio VAE, and not another model's VAE - it encodes your image directly), plus the usual H3 stack for the rest of the workflow. And the H3 weights are territory-restricted under the Community License: the US, EU, UK and South Korea are excluded, which is worth checking before a long download.
Where people get burned
The node isn't in the node list. The pack guards this module's import and, on failure, prints [NeoNodes] h3_video_director 节点注册失败(多段视频导演不可用) in the console. That's usually a ComfyUI too old to have core's MiniMax H3 nodes, not a broken install.
Only one image anchored when you fed it three. Batch behaviour is deliberate: image[:1]. Feed one image, or accept that the rest of the batch goes nowhere.
A confusing graph after opening an old workflow. If it came from a director-generated canvas, it may carry this node for historical reasons. If you're rebuilding the thing by hand for a multi-segment job, use Add Context instead - it understands the cross-segment window and this node doesn't.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| conditioning | CONDITIONING | — | |
| vae | VAE | — | |
| image | IMAGE | — | |
| frame_count | INT | 1245–3600 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| conditioning | CONDITIONING | — |