IO Context Image
Bundle a whole generation into one wire
- pipe
- model
- clip
- vae
- positive
- negative
- latent
- images_ref
- images_pp
- images_output
- mask
- sampler_name
- scheduler
- audio_vae
- context
- model
- clip
- vae
- positive
- negative
- latent
- images_ref
- images_pp
- images_output
- mask
- steps
- cfg
- sampler_name
- scheduler
- guidance
- denoise
- clip_skip
- seed
- width
- height
- batch_size
- text_pos
- text_i2p
- text_neg
- model_name
- vae_name
- lora_names
- path
- purge
- audio_vae
A typical image-generation workflow wants its sampler fed model, clip, vae, positive and negative conditioning, a latent, dimensions, steps, cfg, seed, and more - call it a dozen values. Drag each as its own wire and you get the noodle plate that makes shared workflows unreadable. The IO Context Image is Eclipse's answer: it bundles all of those into one PIPE that travels down a single wire, and spits every component back out so any node can pull off just what it needs.
What it is
This is the image-generation context manager for the Eclipse pipe ecosystem - think rgthree's Context node, which the source code explicitly credits. It has a long list of optional inputs (everything is optional) and, on the output side, the bundled context pipe plus an exploded output for each individual field. You can feed it a partial context, merge in new values, and get back a complete bundle that carries the whole generation state downstream.
The fields it carries tell you what the pack considers "a generation": model, clip, vae, positive/negative conditioning, latent, three image slots (images_ref, images_pp, images_output), mask, the sampler settings (steps, cfg, sampler_name, scheduler, guidance, denoise, clip_skip, seed), dimensions and batch_size, the prompt text (text_pos, text_i2p, text_neg), model/vae/lora names for metadata, a path, a purge flag, and even audio_vae (appended last so existing pipe slots don't shift).
How it works
The mechanism is the whole reason context nodes exist. The node builds a fresh dictionary: it starts from any input pipe you connect (merging its existing keys), then overlays every input you've wired or set - a connected value overwrites whatever came in the pipe. The output context is that dictionary, and each named output is just ctx.get(field). So it's a merge-and-explode node: you can daisy-chain contexts, replacing one field at a time.
The inputs that matter most for a beginner:
- pipe - feed an existing context in to start from it (upstream loader, another context).
- model / clip / vae / positive / negative / latent - the actual generation components.
- seed / steps / cfg / denoise / sampler_name / scheduler - the settings that normally live on a KSampler.
- width / height / batch_size - dimensions for latent creation downstream.
What goes in, what comes out
Everything optional in, one context (PIPE) plus all fields out. That "everything also comes out individually" design is the trick that keeps it composable: a downstream KSampler can take the context wire, or just the three wires it actually wants. You're not forced into a pure pipe workflow - it degrades gracefully to normal nodes.
Install
Ships in ComfyUI_Eclipse (formerly RvTools, rewritten in v4.0.0). ComfyUI Manager β search ComfyUI_Eclipse β install β restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/r-vage/ComfyUI_Eclipse
It's under Eclipse β Pipe. No model downloads; dependencies are the standard stack (torch, numpy, Pillow, opencv-python).
Troubleshooting
- A field is None downstream: you set it in the context but the consumer reads the exploded output, or vice versa - both carry the same value, so check which socket you wired.
- "Stale context" bug: the classic context-pipe failure. The bundle was assembled before a LoRA loaded or a latent was replaced, so you silently run the old value. When in doubt, trace the context wire's origin, not the node itself.
- Old RvTools workflows: pre-v4.0.0 node IDs were removed; run
python tools/migrate_workflow.py <file>.jsonto migrate.
Inputs (31)
| 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_refopt | IMAGE | Optional input for 'images_ref'. | |
| images_ppopt | IMAGE | Optional input for 'images_pp'. | |
| images_outputopt | IMAGE | Optional input for 'images_output'. | |
| maskopt | MASK | Optional input for 'mask'. | |
| stepsopt | INT | Optional input for 'steps'. | |
| cfgopt | FLOAT | Optional input for 'cfg'. | |
| sampler_nameopt | * | Optional input for 'sampler_name'. | |
| scheduleropt | * | Optional input for 'scheduler'. | |
| guidanceopt | FLOAT | Optional input for 'guidance'. | |
| denoiseopt | FLOAT | Optional input for 'denoise'. | |
| clip_skipopt | INT | Optional input for 'clip_skip'. | |
| seedopt | INT | Optional input for 'seed'. | |
| widthopt | INT | Optional input for 'width'. | |
| heightopt | INT | Optional input for 'height'. | |
| batch_sizeopt | INT | Optional input for 'batch_size'. | |
| text_posopt | STRING | Optional input for 'text_pos'. | |
| text_i2popt | STRING | Optional input for 'text_i2p'. | |
| text_negopt | STRING | Optional input for 'text_neg'. | |
| model_nameopt | STRING | Optional input for 'model_name'. | |
| vae_nameopt | STRING | Optional input for 'vae_name'. | |
| lora_namesopt | STRING | Optional input for 'lora_names'. | |
| pathopt | STRING | Optional input for 'path'. | |
| purgeopt | BOOLEAN | Optional input for 'purge'. | |
| audio_vaeopt | VAE | Optional input for 'audio_vae'. |
Outputs (31)
| Name | Type | Description |
|---|---|---|
| context | PIPE | β |
| model | MODEL | β |
| clip | CLIP | β |
| vae | VAE | β |
| positive | CONDITIONING | β |
| negative | CONDITIONING | β |
| latent | LATENT | β |
| images_ref | IMAGE | β |
| images_pp | IMAGE | β |
| images_output | IMAGE | β |
| mask | MASK | β |
| steps | INT | β |
| cfg | FLOAT | β |
| sampler_name | * | β |
| scheduler | * | β |
| guidance | FLOAT | β |
| denoise | FLOAT | β |
| clip_skip | INT | β |
| seed | INT | β |
| width | INT | β |
| height | INT | β |
| batch_size | INT | β |
| text_pos | STRING | β |
| text_i2p | STRING | β |
| text_neg | STRING | β |
| model_name | STRING | β |
| vae_name | STRING | β |
| lora_names | STRING | β |
| path | STRING | β |
| purge | BOOLEAN | β |
| audio_vae | VAE | β |