Nodes/ComfyUI-Arrssenne/Filename ckpt+seed (Arrssenne)
ComfyUI Node

Filename ckpt+seed (Arrssenne)

Name your saves `model_seed` without a three-node chain

By arrssenne·Created 3 months ago·Updated about a month ago· 0
Filename ckpt+seed (Arrssenne)
    • filename
    checkpoint_name
    seed0

    Ever stared at an output folder full of ComfyUI_00042_.png and wished the files just told you what made them? That's the whole reason this node exists. It takes a checkpoint name and a seed and builds you one clean string: modelname_seed. Feed it to a save node's filename prefix and suddenly every render is self-documenting.

    It's a Text-category plumbing node - pure string building, no pixels touched. It exists because the author was tired of wiring RegexReplace → SomethingToString → JoinStrings just to produce a filename, and collapsed all three into one node.

    How it works

    It does three cleanup passes on the checkpoint name, then one join:

    1. strips any folder prefix (handles both / and \, so it's Windows and Linux safe),
    2. strips the file extension (.safetensors, .ckpt, …),
    3. strips a trailing _NNNNN_ counter suffix - the kind ComfyUI itself appends when a filename collides.

    Then it joins the cleaned name with the seed using _. So models/characters/pixel_v3_00012_.safetensors + seed 1337 becomes pixel_v3_1337.

    The name is a mild lie, by the way: it doesn't rename or save anything. It only produces the string. You still have to feed that string to a SaveImage or an Image Saver node, which is the honest job of a filename node in ComfyUI.

    The two inputs and the one output

    Everything that matters fits in one line:

    • checkpoint_name (STRING) - the checkpoint's name. Both fields are forceInput, meaning you can't just type into them; you wire them. Typically you'd take the checkpoint_name output of the pack's loaders (ArrssenneLoader / ArrssenneLoaderCkpt) and feed it straight in, which is the wiring this pack was designed around.
    • seed (INT) - wire from your KSampler (or a Primitive seed). Convert-widget-to-input on either field flips it back to a typed box if you prefer.
    • Output filename (STRING) - drop it on the filename_prefix input of a save node, or into an Image Saver's prefix.

    One expectation to set before you're disappointed: SaveImage's prefix isn't a full filename - ComfyUI appends _00001_.png (the auto-incrementing counter) to disambiguate batches, so you'll get pixel_v3_1337_00001_.png. That's correct and desirable; it's the same counter mechanism the node strips on the way in.

    Install

    The pack is tiny - pure Python, no models, no API keys. Via ComfyUI Manager, search "ComfyUI-Arrssenne". Or manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/arrssenne/comfyui-arrssenne
    

    Then restart ComfyUI. The node appears under Arrssenne/Text. Its only real dependency is Pillow (in the pack's requirements.txt even though the README claims none), which your ComfyUI almost certainly already has.

    The gotcha that actually bites

    Because both inputs are forceInput, a beginner double-clicks this node, finds grey input sockets instead of text boxes, and assumes it's broken. It isn't - it wants wires. If you don't have a loader handy, drop a primitive string/seed node on it, or right-click a widget and pick "Convert widget to input" to turn it back into a typeable box. Otherwise this is about as frictionless as a filename node gets: wire two things, get one string.

    CategoryArrssenne/Text

    Inputs (2)

    NameTypeDefaultDescription
    checkpoint_nameSTRING
    seedINT00–18446744073709550000

    Outputs (1)

    NameTypeDescription
    filenameSTRING