Nodes/ComfyUI-Koolook/Easy AI Pipeline (Koolook)
ComfyUI Node

Easy AI Pipeline (Koolook)

Easy AI Pipeline's path builder

By malkuthro·Created 11 months ago·Updated a day ago· 8
Easy AI Pipeline (Koolook)
    • WRITE_file_path
    • output_name
    • version_string
    • output_directory
    • shot_duration
    • seed_value
    • shot_name
    shot_duration81
    seed_value453453453
    instructionPlace your base folder path in the FIELD below
    base_directory_pathplace your desired output dir here
    extension.%04d.exr
    shot_nameoceanTop_writeTest
    ai_methodv2v
    versionv001
    disable_versioningfalse
    enable_overwritefalse
    no_subfoldersfalse

    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_overwrite is 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 instruction field: it's a read-only hint reminding you the actual base folder goes in the multi-line base_directory_path, not the short field above it.
    • Sequence numbers not appearing - the extension is used verbatim. If you want frame_0001.exr you must include the %04d yourself; that's the filename pattern, not auto-magic.
    CategoryKoolook/Pipeline

    Inputs (11)

    NameTypeDefaultDescription
    shot_durationINT811–10000Number of frames in the shot. Pass-through INT output — wire into samplers, video savers, or anything that needs a frame count.
    seed_valueINT4534534530–999999999999Master seed shared across the workflow. Pass-through INT output — wire into samplers so a single value controls everything downstream.
    instructionSTRINGPlace your base folder path in the FIELD belowRead-only hint. The actual base folder goes in the multi-line text field below.
    base_directory_pathSTRINGplace your desired output dir hereRoot 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.
    extensionSTRING.%04d.exrFilename extension, appended verbatim. Use %04d for sequence numbering (e.g. .%04d.exr writes frame_0001.exr, frame_0002.exr, ...).
    shot_nameSTRINGoceanTop_writeTestLogical shot identifier. Used as the first segment of the filename and (unless no_subfolders is on) as a subfolder under the base path.
    ai_methodSTRINGv2vFree-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.
    versionSTRINGv001Version 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_versioningBOOLEANfalseDrop the v### segment from both the output directory and the filename.
    enable_overwriteBOOLEANfalseAllow 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_subfoldersBOOLEANfalseDon'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)

    NameTypeDescription
    WRITE_file_pathSTRING
    output_nameSTRING
    version_stringSTRING
    output_directorySTRING
    shot_durationINT
    seed_valueINT
    shot_nameSTRING