🔗 H3 Relay · Latent Load
The wire you're tempted to skip — and why skipping it breaks the graph
- context_latent
- info
H3RelayLatentLoad is the smallest node in the pack and the one most likely to be "optimised" away by someone who doesn't yet understand the contract. It reads the previous segment's AV latent off disk and hands it to the Copy Bridge. That's it. But its behaviour on the first segment is the part that trips people up, so read this bit before you start unplugging things.
When stage_index is 0, there is no previous segment. The node doesn't error, and it doesn't vanish - it returns an empty context. The bridge recognises that and passes through: latent unchanged, trim_frames 0, no continuation. That is the correct state for segment 1, and it's why you don't need a separate first-segment graph.
The trap: because "there's no previous segment" is true, people bypass this node on stage 0, or unplug the bridge's context_latent. Both are wrong. context_latent is a required input on the bridge - ComfyUI's own validation rejects the whole prompt with Required input is missing before anything runs. The empty-context handshake only works if the wire is there.
Inputs and outputs
Required: run_id and stage_index. It looks for output/relay_kit/<run_id>/stage_<stage_index − 1>.safetensors - so when this segment's stage_index is 1, it reads stage 0. Fill run_id to match Latent Save and the bridge character for character, or it won't find the file and will say so.
Optional: explicit_path. Leave it empty and the path is derived from run_id + stage number. Fill it and the node reads that exact file instead - this is your escape hatch for a resume after a break: point it at any stage file and continue from that tail without renumbering your whole run, or point it at the film's first stage to use that as an anchor elsewhere. It's also how the Copy Bridge's anchor_latent reference gets sourced in the docs' example wiring.
Outputs: context_latent (LATENT, → bridge context_latent) and info (STRING - the resolved path and a short readout, which is the fastest way to confirm which file a segment actually consumed when something looks off).
Install
cd ComfyUI/custom_nodes
git clone https://github.com/ZenHG/ComfyUI-H3-Latent-Relay.git
ComfyUI Manager → search h3-latent-relay gets you the same thing. Restart the backend, not just the browser. The pack needs a ComfyUI ≥ 0.35.0 that carries MiniMax-H3 support (comfy_extras/nodes_minimax_h3.py); on an older host these nodes still appear and simply do nothing useful, so check the startup banner. Reads go through safetensors, which ComfyUI already has - this node does no model download and adds no pip dependency of its own.
Where it goes wrong
"stage_index=N says this is segment N+1 but there is no previous segment to continue." Either the save and the load disagree about the stage number, or run_id differs between them, or you never rendered that stage. All three are hard errors rather than silent pass-throughs - the author's reasoning is that old versions silently treated it as a standalone segment, so the graph ran green and produced an un-continued seam that only a human eye would catch.
A file exists but the numbers are wrong. Latent Load, Latent Save and the Copy Bridge must all carry the same stage_index and run_id. On the canvas, the pack's front-end JS syncs run_id across a group when you edit one field, and Chain's buttons move stage_index on all of them together - which is the real reason this node is "manual wiring only": you only touch it when you deliberately want a source other than the obvious previous segment.
Resuming mid-film. Run the stages in order; don't skip. explicit_path is the sanctioned way to jump the source when you must, because it's visible in info and it can't silently corrupt the sequence the way an edited stage number can.
Pair it with H3RelayLatentSave on the other end of each segment and the whole relay becomes mechanical: save writes stage N, load reads stage N, bridge splices. Three nodes, one loop, no re-encoding anywhere.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| run_id | STRING | relay | 【填什么】与 Latent Save 一致的片名。不一致 = 找不到文件,直接报错。 |
| stage_index | INT | 00–9999 | 【填什么】填本段段号(与桥、保存一致)。节点读「本段 − 1」那一份。 填 0 = 第 1 段,没有上一段 ⇒ 交空上下文,桥自动直通。这是正常的。 |
| explicit_pathopt | STRING | 【可留空】留空 = 按片名 + 段号自动找;填了 = 直接读这个文件。 |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| context_latent | LATENT | — |
| info | STRING | — |