Easy AI Pipeline (Koolook)
Easy AI Pipeline's path builder
- WRITE_file_path
- output_name
- version_string
- output_directory
- shot_duration
- seed_value
- shot_name
If your ComfyUI life is one long string of outputs/2026-08-16/whatever_001.png, Easy AI Pipeline is the node that finally gets you a clean, versioned folder structure for every shot you render. It doesn't generate anything. It's a path orchestrator: you tell it where your shot lives, what method you're running, and what version you're on, and it hands you back the exact file path and directory to write into.
This is a VFX-flavored pack, and it shows. The naming conventions - shot_name, ai_method, v### version tokens, .%04d.exr sequence extensions - are straight out of a plate-pipeline workflow, the kind of thing you'd see wired into Nuke or an editorial department rather than a hobbyist's "output" folder. The author (Kforge Labs) clearly got tired of hunting for files after a hundred test renders.
How it works
Feed it a base directory and a shot name, and it composes an output path as base_directory_path/shot_name/ai_method/v###/. The filename follows the same logic, and you control the extension - .%04d.exr writes frame_0001.exr, frame_0002.exr, and so on. The version field accepts a bare number like 2 and promotes it to v002, or you can type v001 / final and it's used verbatim. Convert version to an input and you can wire it from a global version node, which is where Easy Utility comes in.
It also defends you against the dumbest failure modes of pasted paths. Explorer's "Copy as path" quotes, trailing backslashes, leading whitespace - all stripped, so n:\foo\bar\, "n:/foo/bar", and n:\foo\bar all resolve identically. Even the shot and method segments get sanitized so a typo can't escape your base folder (a classic os.path.join gotcha where an absolute segment silently overrides the base).
Two toggles change the layout: no_subfolders flattens shot/method into the filename only (version folder still applies), and disable_versioning drops the v### segment entirely. enable_overwrite lets you write over an existing file - off by default, because accidentally nuking yesterday's render is a bad Tuesday.
The outputs that matter
- WRITE_file_path - the fully resolved path to write into. Feed this to a save node.
- output_name, output_directory - the file name and folder separately, handy for previews and secondary writers.
- version_string - the resolved version token, so every node downstream agrees on what "current version" means.
- shot_duration and seed_value - pass-throughs. Set them once here (defaults are 81 frames and a fixed seed) and they flow to every sampler and saver, which is the entire point: one place controls the whole shot.
Install
Part of ComfyUI-Koolook. ComfyUI Manager → Install Custom Nodes → Git URL:
https://github.com/malkuthro/ComfyUI-Koolook.git
Or clone manually:
cd ComfyUI/custom_nodes
git clone https://github.com/malkuthro/ComfyUI-Koolook.git
Restart, and it's under Koolook/Pipeline. No model files, no extra deps - it's pure string and path handling. The pack's one real gotcha applies here too: install once, via one method. A Manager install lands at custom_nodes/koolook/; cloning a second copy to custom_nodes/ComfyUI-Koolook/ loads both and the workflow store starts silently corrupting on every restart. The plugin detects this and disables the losing copy, but just remove one folder.
Common issues
- "File already exists" error -
enable_overwriteis off, and it should be for real work. Turn it on only when you know you want to clobber. - Path comes out weird - you don't have to scrub it yourself, but check the
instructionfield: it's a read-only hint reminding you the actual base folder goes in the multi-linebase_directory_path, not the short field above it. - Sequence numbers not appearing - the extension is used verbatim. If you want
frame_0001.exryou must include the%04dyourself; that's the filename pattern, not auto-magic.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| shot_duration | INT | 811–10000 | Number of frames in the shot. Pass-through INT output — wire into samplers, video savers, or anything that needs a frame count. |
| seed_value | INT | 4534534530–999999999999 | Master seed shared across the workflow. Pass-through INT output — wire into samplers so a single value controls everything downstream. |
| instruction | STRING | Place your base folder path in the FIELD below | Read-only hint. The actual base folder goes in the multi-line text field below. |
| base_directory_path | STRING | place your desired output dir here | Root folder for outputs. By default the node appends shot_name/ai_method/[v###] underneath; toggle no_subfolders to drop the shot_name/ai_method subfolders (the version folder [v###] still applies when versioning is on). Pasted paths are auto-cleaned: surrounding whitespace, surrounding quotes ("..." from Explorer's Copy as path), and trailing slashes / backslashes are all stripped — n:\foo\bar\, "n:/foo/bar", and n:\foo\bar all resolve identically. |
| extension | STRING | .%04d.exr | Filename extension, appended verbatim. Use %04d for sequence numbering (e.g. .%04d.exr writes frame_0001.exr, frame_0002.exr, ...). |
| shot_name | STRING | oceanTop_writeTest | Logical shot identifier. Used as the first segment of the filename and (unless no_subfolders is on) as a subfolder under the base path. |
| ai_method | STRING | v2v | Free-form method tag (e.g. v2v, upscale, denoise). When set, joined into the filename with underscores. Also added as a subfolder unless no_subfolders is on. Leave blank to skip — no dangling _ in the filename, no empty subfolder. |
| version | STRING | v001 | Version stamped as v###/<token> in the path and filename. Type it here, or convert this field to an input and wire a STRING (e.g. from a global version node). A bare number like '2' becomes v002; anything else (v001, final) is used verbatim. Ignored when disable_versioning is on. |
| disable_versioning | BOOLEAN | false | Drop the v### segment from both the output directory and the filename. |
| enable_overwrite | BOOLEAN | false | Allow writing over an existing file at the final path. When off, the node raises an error if the target file already exists (the directory existing is fine). |
| no_subfolders | BOOLEAN | false | Don't add shot_name / ai_method as subfolders — both go into the filename only. The version folder (v###) is still added when disable_versioning is off, so versioned outputs stay organised under base/v###/. The base folder itself is created on the fly if missing. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| WRITE_file_path | STRING | — |
| output_name | STRING | — |
| version_string | STRING | — |
| output_directory | STRING | — |
| shot_duration | INT | — |
| seed_value | INT | — |
| shot_name | STRING | — |