IO Context Video
One wire for the whole video generation state
- pipe
- model
- clip
- vae
- positive
- negative
- latent
- images_input
- images_ref_start
- images_ref_new
- images_ref_end
- images_1st
- images_loop
- images_pp1
- images_pp2
- images_pp3
- images_output
- mask_1
- mask_2
- mask_3
- sampler_name
- scheduler
- audio
- any_1
- any_2
- context
- model
- clip
- vae
- positive
- negative
- latent
- images_input
- images_ref_start
- images_ref_new
- images_ref_end
- images_1st
- images_loop
- images_pp1
- images_pp2
- images_pp3
- images_output
- mask_1
- mask_2
- mask_3
- steps
- cfg
- sampler_name
- scheduler
- denoise
- seed
- width
- height
- text_pos
- text_i2p
- text_neg
- frame_rate
- frame_load_cap
- context_length
- overlap
- skip_first_frames
- select_every_nth
- loop_idx
- audio
- any_1
- any_2
- path
- purge
Video workflows are where wire spaghetti goes to die. Between the model, conditioning, and sampler you also have first/last frames, reference frames, loop targets, masks, audio, frame rate, context windows and overlap - a context node for images already bundles a dozen values, and video doubles it. The IO Context Video is Eclipse's big pipe for that world: bundle the whole video generation state into one PIPE, merge and replace fields as it flows, and explode everything back out at the consumer.
What it is
The video sibling of IO Context Image, and the same design: all-optional inputs, one bundled context (PIPE) output, and an exploded output per field. It starts from any input pipe, overlays whatever you connect or set, and hands the merged dictionary downstream. The code carries the same rgthree-Context lineage the image variant does.
What makes it a video context is the extra surface:
- Frame images:
images_input,images_ref_start,images_ref_new,images_ref_end,images_1st,images_loop, three post-process slotsimages_pp1/2/3, andimages_output- that's your source video, reference frames for start/new/end consistency, loop seeds, and the output. - Masks:
mask_1/2/3for region-based control. - Video timing:
frame_rate,frame_load_cap,context_length,overlap,skip_first_frames,select_every_nth,loop_idx. - Audio: an
audioinput, plus two free-formany_1/any_2slots for whatever else your pipeline shoves in. - The usual generation core: model, clip, vae, positive/negative, latent, sampler settings, dimensions, prompt text, path, purge.
How it works
Identical merge semantics to the image context: feed a pipe in to start, connect the fields you want to set, and each connected value overwrites the pipe's. The output context is the merged dict; every field also comes out on its own socket. The frame slots (ref_start/ref_new/ref_end) are where a video pipeline hangs its image-to-video consistency - you can feed one into the next pass's context to keep a character stable across a long generation.
The inputs a beginner actually touches:
- pipe - carry a context forward from a loader or previous pass.
- images_input / images_ref_start / images_ref_end - the frames that anchor generation.
- frame_rate / frame_load_cap / context_length / overlap - how the pipeline reads and windows the video.
- model / vae / positive / negative - the generation core, same as any sampler.
What goes in, what comes out
All inputs optional; outputs are context (PIPE) plus one socket per field. Because everything also explodes out individually, you can mix this with plain nodes - the video context doesn't force a pure-pipe workflow on you.
Install
Part of ComfyUI_Eclipse (formerly RvTools, rewritten in v4.0.0). Manager β search ComfyUI_Eclipse β install β restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/r-vage/ComfyUI_Eclipse
Under Eclipse β Pipe. No model downloads.
Troubleshooting
- A frame slot is None: the reference-frame slots only carry what you wire or what came in the pipe - there's no auto-guessing of "first frame." Feed the frames explicitly.
- Video settings ignored: check whether the downstream sampler reads the exploded outputs or the context pipe - both carry the values, but a workflow mixing the two can leave a widget in charge. Look at
allow_overwrite-style priority on the sampler you're using. - Old workflows with red nodes: v4.0.0 removed legacy IDs; run
python tools/migrate_workflow.py <file>.json.
Inputs (43)
| Name | Type | Default | Description |
|---|---|---|---|
| pipeopt | PIPE | Optional input for 'pipe'. | |
| modelopt | MODEL | Optional input for 'model'. | |
| clipopt | CLIP | Optional input for 'clip'. | |
| vaeopt | VAE | Optional input for 'vae'. | |
| positiveopt | CONDITIONING | Optional input for 'positive'. | |
| negativeopt | CONDITIONING | Optional input for 'negative'. | |
| latentopt | LATENT | Optional input for 'latent'. | |
| images_inputopt | IMAGE | Optional input for 'images_input'. | |
| images_ref_startopt | IMAGE | Optional input for 'images_ref_start'. | |
| images_ref_newopt | IMAGE | Optional input for 'images_ref_new'. | |
| images_ref_endopt | IMAGE | Optional input for 'images_ref_end'. | |
| images_1stopt | IMAGE | Optional input for 'images_1st'. | |
| images_loopopt | IMAGE | Optional input for 'images_loop'. | |
| images_pp1opt | IMAGE | Optional input for 'images_pp1'. | |
| images_pp2opt | IMAGE | Optional input for 'images_pp2'. | |
| images_pp3opt | IMAGE | Optional input for 'images_pp3'. | |
| images_outputopt | IMAGE | Optional input for 'images_output'. | |
| mask_1opt | MASK | Optional input for 'mask_1'. | |
| mask_2opt | MASK | Optional input for 'mask_2'. | |
| mask_3opt | MASK | Optional input for 'mask_3'. | |
| stepsopt | INT | Optional input for 'steps'. | |
| cfgopt | FLOAT | Optional input for 'cfg'. | |
| sampler_nameopt | * | Optional input for 'sampler_name'. | |
| scheduleropt | * | Optional input for 'scheduler'. | |
| denoiseopt | FLOAT | Optional input for 'denoise'. | |
| seedopt | INT | Optional input for 'seed'. | |
| widthopt | INT | Optional input for 'width'. | |
| heightopt | INT | Optional input for 'height'. | |
| text_posopt | STRING | Optional input for 'text_pos'. | |
| text_i2popt | STRING | Optional input for 'text_i2p'. | |
| text_negopt | STRING | Optional input for 'text_neg'. | |
| frame_rateopt | FLOAT | Optional input for 'frame_rate'. | |
| frame_load_capopt | INT | Optional input for 'frame_load_cap'. | |
| context_lengthopt | INT | Optional input for 'context_length'. | |
| overlapopt | INT | Optional input for 'overlap'. | |
| skip_first_framesopt | INT | Optional input for 'skip_first_frames'. | |
| select_every_nthopt | INT | Optional input for 'select_every_nth'. | |
| loop_idxopt | INT | Optional input for 'loop_idx'. | |
| audioopt | AUDIO | Optional input for 'audio'. | |
| any_1opt | * | Optional input for 'any_1'. | |
| any_2opt | * | Optional input for 'any_2'. | |
| pathopt | STRING | Optional input for 'path'. | |
| purgeopt | BOOLEAN | Optional input for 'purge'. |
Outputs (43)
| Name | Type | Description |
|---|---|---|
| context | PIPE | β |
| model | MODEL | β |
| clip | CLIP | β |
| vae | VAE | β |
| positive | CONDITIONING | β |
| negative | CONDITIONING | β |
| latent | LATENT | β |
| images_input | IMAGE | β |
| images_ref_start | IMAGE | β |
| images_ref_new | IMAGE | β |
| images_ref_end | IMAGE | β |
| images_1st | IMAGE | β |
| images_loop | IMAGE | β |
| images_pp1 | IMAGE | β |
| images_pp2 | IMAGE | β |
| images_pp3 | IMAGE | β |
| images_output | IMAGE | β |
| mask_1 | MASK | β |
| mask_2 | MASK | β |
| mask_3 | MASK | β |
| steps | INT | β |
| cfg | FLOAT | β |
| sampler_name | * | β |
| scheduler | * | β |
| denoise | FLOAT | β |
| seed | INT | β |
| width | INT | β |
| height | INT | β |
| text_pos | STRING | β |
| text_i2p | STRING | β |
| text_neg | STRING | β |
| frame_rate | FLOAT | β |
| frame_load_cap | INT | β |
| context_length | INT | β |
| overlap | INT | β |
| skip_first_frames | INT | β |
| select_every_nth | INT | β |
| loop_idx | INT | β |
| audio | AUDIO | β |
| any_1 | * | β |
| any_2 | * | β |
| path | STRING | β |
| purge | BOOLEAN | β |