LC Vision Redirect π¬
The fix for pose snapping at every H3 segment join
- vision_model
- plan
- plan
- notes
You've built the chain: plan written, segment 1 rendered, segment 2 conditioned on segment 1's tail. And segment 2 opens with her jamming a key into a door that was already open in the last frame - because your plan says "she opens the door" and the renderer doesn't know better. It snaps the pose to match the words.
That's the join problem, and it's why long video by stitching looks like stitching. LC Vision Redirect π¬ sits between the Director and the LC H3 Segment nodes: before a CONTINUE renders, it looks at how the previous segment actually ended and rewrites the opening of the next one to start from that state.
How it reads the tail
It doesn't guess. The segment nodes save a seg_003_tail.mp4 next to each segment in output/LC_H3/<project>/, and Redirect pulls three frames across that tail - last frame included - at 768px via ffmpeg/ffprobe, then sends them as an IMAGE batch. Then it asks twice.
- LOOK - a continuity-supervisor prompt: in one or two sentences, say exactly how the shot ends, judged by the LAST frame - where each person is, standing or walking, inside or outside, pose and hands, which way they face, what's held, what's open or closed.
- REWRITE - a text-only pass taking
END STATE:andPLANNED:, rewriting the opening beats so anything already finished (sitting down while walking outside, opening an open door, entering a room they're already in) becomes a beat that moves toward the plan's later beats. Beats that already fit survive word for word. It even handles the fiddly cases: end state somewhere else in the room, so the first beat walks or pans there instead of cutting; subject ended up facing away, so the first beat turns them or the camera comes round to their face.
The guard rails are the good part
A rewrite that mangles your plan is worse than the snap you were fixing, so every rewrite is checked first. It's rejected and the plan's text kept if it loses a quoted line, changes a Place:, Holding:, Sound: or Camera: line, drops its timestamps, pushes one past the end of the segment, or grows past 1.6Γ the original plus 80 characters. You're told either way, in notes and the console: the described end state, then the new opening, already matches, no change., or the rejection reason.
Wiring it
vision_model comes from LC Vision Loader, and per the tooltip it's only loaded when a segment actually needs redirecting - CUT segments and segment 1 cost no VRAM. plan is the LC_H3_PLAN from LC Vision Director. index must match your LC H3 Segment node; 0 means "the next segment not saved yet", resolved by finding which seg_00N.json + seg_00N_part.mp4 pair is missing. enabled off is a clean pass-through, so you can A/B a join. temperature defaults to 0.3 on purpose - low keeps the rewrite close to your plan.
Outputs: plan (rewritten, with the original kept as action_original, so nothing is lost) and notes (STRING).
It caches properly too: the rewrite is stored in plan.json with the tail's mtime and IS_CHANGED keys on that mtime. Re-run without redoing segment 2 and it's instant. Redo segment 2 and the tail changed, so it looks again.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC_Vision_nodes.git
Or Manager β search LC Vision. install.py resolves the right JamePeng/llama-cpp-python wheel (the fork carrying Qwen3VLChatHandler, which never made it upstream and only ships as GitHub Release assets, so a plain requirements.txt can't find it). Restart after.
The dependency nobody mentions: ffmpeg. Redirect shells out to ffmpeg and ffprobe through shutil.which, so both need to be on your PATH. ComfyUI bundles its own ffmpeg for video nodes but doesn't necessarily expose it as a command, which is why a fresh install can hit this:
ffmpeg -version || sudo apt install ffmpeg # Linux
brew install ffmpeg # macOS
What goes wrong
Segment 4 isn't saved yet: nothing to look at. The tail for segment 3 doesn't exist at output/LC_H3/<your project>/seg_003_tail.mp4. Either it isn't rendered, or the Director's project name differs from the segment nodes' - the paths derive from the same folder, so a mismatch looks exactly like a missing file.
Could not read ... (is ffmpeg on PATH?) - as above. Five-minute fix, two-hour mystery.
Segment 4 is a CUT: nothing to redirect. Correct and free. A CUT is a new shot; there's no continuity to preserve. First segments pass through for the same reason.
The rewrite keeps getting rejected. Read notes - it names the rule that tripped. Repeated "lost the line" means the model is trying to shorten a segment whose dialogue doesn't fit the time left after the overlap: shorten the line, or give the segment more room.
It rewrote more than you wanted. Drop temperature first. And remember it's reading small, compressed 768px frames: excellent at "inside or outside, standing or sitting, door open or shut", fuzzy about which hand holds the cup. Right trade for a pose fix, wrong tool for nits.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| vision_model | LC_VISION_MODEL | Handle from LC Vision Loader. Only loaded when a segment actually needs redirecting. | |
| plan | LC_H3_PLAN | From LC Vision Director π¬. | |
| index | INT | 00β60 | Set it the same as LC H3 Segment. 0 = the next segment not saved yet. |
| enabled | BOOLEAN | true | Off: the plan passes through untouched. |
| max_tokensopt | INT | 1024128β8192 | β |
| temperatureopt | FLOAT | 0.300β2 | Low keeps the rewrite close to your plan. |
| seedopt | INT | 00β4294967295 | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| plan | LC_H3_PLAN | β |
| notes | STRING | β |