Read Image Saver Pipe
Unpack a pipe's values without triggering hashing
- pipe
- pipe
- filename
- path
- counter
- modelname
- positive
- negative
- width
- height
- seed
- steps
- cfg
- sampler_name
- scheduler_name
- denoise
- clip_skip
- additional_hashes
- custom
This is the inspection window for an IMAGESAVER_PIPE. A pipe is a sealed bundle - great for keeping wires tidy, useless if you actually need one of the values inside it for something else. Read Image Saver Pipe cracks it open and exposes every field as its own output, while also passing the pipe straight through so the bundle keeps flowing downstream.
The classic use is external manipulation. Say you want to take the seed out of the pipe, run it through some math node, and feed it back in. You Read the pipe to get the seed as an INT, do your thing, then hand the result to an Edit Image Saver Pipe to write it back. Read → tweak → edit is the round trip the pack designed this pair for.
The important word: lazy
The pack's description flags this and it matters - the extraction is lazy and does not trigger metadata hashing. Reading values out of the pipe is free. It won't kick off checkpoint hashing or a CivitAI lookup just because you peeked inside. Those expensive operations stay deferred until the actual save, exactly as the pipe system intends. So you can drop a Read node anywhere for debugging or routing without paying a performance cost or firing off network calls. Read as often as you like.
The inputs and outputs
One input: pipe (type IMAGESAVER_PIPE). That's it.
The outputs are where the value is - it unpacks the whole bundle:
pipe- the same pipe, passed through unchanged so you can keep chaining.filename,path,modelname,positive,negative,additional_hashes,custom- the string fields.counter,width,height,seed,steps,clip_skip- the integer fields.cfg,denoise- the floats.sampler_nameandscheduler_name- these come out as proper enum values (the full KSampler sampler list and the nine standard schedulers), not just strings, so they plug directly into other nodes that expect a sampler or scheduler dropdown.
That last point is quietly handy: because sampler_name and scheduler_name come out typed as the real dropdown enums, you can wire the pipe's sampler choice straight into a KSampler and guarantee your generation and your saved metadata agree.
How to install it
ComfyUI Manager: search "ComfyUI Image Saver", install, restart.
Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/alexopus/ComfyUI-Image-Saver
cd ComfyUI-Image-Saver
pip install -r requirements.txt
then restart. No models, no heavy dependencies.
Common issues & troubleshooting
Reading doesn't change anything. Right - it's read-only. If you want to modify a value, Read gives you the number, but you have to route it back through an Edit Image Saver Pipe to actually change the pipe. Read alone is inspection, not mutation.
You forgot to pass the pipe through. Notice the node outputs the pipe again - that's not decoration. If you only take the individual values and drop the pipe, your downstream save node has nothing to save. Keep the pipe output wired forward.
Sampler/scheduler outputs won't connect to a String input. They come out as enum types, not plain strings, precisely so they snap into KSampler-style dropdowns. If you need the plain text form for a filename token or a text node, that's a different shape - the metadata already carries the string version internally, and the Scheduler Selector (Image Saver) node is the one that hands you a scheduler as both an enum and a scheduler_name string.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| pipe | IMAGESAVER_PIPE | — |
Outputs (18)
| Name | Type | Description |
|---|---|---|
| pipe | IMAGESAVER_PIPE | — |
| filename | STRING | — |
| path | STRING | — |
| counter | INT | — |
| modelname | STRING | — |
| positive | STRING | — |
| negative | STRING | — |
| width | INT | — |
| height | INT | — |
| seed | INT | — |
| steps | INT | — |
| cfg | FLOAT | — |
| sampler_name | euler,euler_cfg_pp,euler_ancestral,euler_ancestral_cfg_pp,heun,heunpp2,exp_heun_2_x0,exp_heun_2_x0_sde,dpm_2,dpm_2_ancestral,lms,dpm_fast,dpm_adaptive,dpmpp_2s_ancestral,dpmpp_2s_ancestral_cfg_pp,dpmpp_sde,dpmpp_sde_gpu,dpmpp_2m,dpmpp_2m_cfg_pp,dpmpp_2m_sde,dpmpp_2m_sde_gpu,dpmpp_2m_sde_heun,dpmpp_2m_sde_heun_gpu,dpmpp_3m_sde,dpmpp_3m_sde_gpu,ddpm,lcm,ipndm,ipndm_v,deis,res_multistep,res_multistep_cfg_pp,res_multistep_ancestral,res_multistep_ancestral_cfg_pp,gradient_estimation,gradient_estimation_cfg_pp,er_sde,seeds_2,seeds_3,sa_solver,sa_solver_pece,ddim,uni_pc,uni_pc_bh2 | — |
| scheduler_name | simple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal | — |
| denoise | FLOAT | — |
| clip_skip | INT | — |
| additional_hashes | STRING | — |
| custom | STRING | — |