Nodes/Easy Use Anima/Anima Prompt Saver
ComfyUI Node

Anima Prompt Saver

The metadata CivitAI actually reads, for an Anima graph

By nobinBB·Created 2 months ago·Updated 6 days ago· 3
Anima Prompt Saver
  • images
  • lora_name
  • FILENAME
  • FILE_PATH
  • METADATA
◄filenameComfyUI_%time_%seed_%counter►
◄path%date/►
◄model_name▾►
◄vae_name▾►
◄seed0►
◄steps20►
◄cfg8.0►
◄sampler_name▾►
◄scheduler▾►
◄width1►
◄height1►
◄positive►
◄negative►
◄extension▾►
◄calculate_hashtrue►
◄resource_hashtrue►
◄lossless_webptrue►
◄jpg_webp_quality100►
◄date_format%Y-%m-%d►
◄time_format%H%M%S►
◄save_metadata_filefalse►
◄extra_info►

ComfyUI's stock Save Image writes your node graph into the PNG and not much else. That's fine for you and useless for CivitAI's auto-linking, which keys on the A1111-style flat parameters string. This is the Anima-flavoured version of the node that writes both.

What it is

It's the SD Prompt Saver node from ComfyUI Prompt Reader Node, ported to Anima and packaged here. The port matters in three places: the model list and hashes come from models/diffusion_models plus architecture-verified Anima checkpoints, the model hash can be calculated from either, and a checkpoint's own VAE is recorded as Baked VAE instead of a fabricated external VAE that doesn't exist on your disk. It uses the standard ComfyUI sampler and scheduler lists, so what it records is what you actually ran.

Why bother: A1111's parameters block is a flat, human-readable string - prompt, Negative prompt: line, then Steps:, Sampler:, CFG scale:, Seed:, Size:, Model hash:, Model:. It survives as plain text pasted into a comment, whereas a lost node graph is a rebuild. If you post anywhere that parses generation data, this is the format that gets picked up, and resource hashes are what let a host match your LoRAs and checkpoint by identity rather than by filename.

Inputs that matter

images is the only required input - the sampler's image output.

The ones that make the metadata correct:

  • model_name and vae_name - wire these from the loader's matching outputs. This is the whole trick: the loader knows which file it opened, and this node hashes it.
  • seed, steps, cfg, sampler_name, scheduler - wire from EasyKSampler (Full) - Anima's matching outputs. Its sampler_name and scheduler outputs exist precisely so this connection is possible.
  • positive and negative - so the prompt text lands in the block.
  • width and height - these default to 1. If you don't set or connect them, the recorded size is wrong. Connect them from wherever your resolution actually comes from.
  • filename, default ComfyUI_%time_%seed_%counter, and path, default %date/. Supported variables: %date, %time, %seed, %steps, %cfg, %width, %height, %model, %sampler, %scheduler, %counter. date_format and time_format (defaults %Y-%m-%d and %H%M%S) control what %date/%time expand to, so folders sort the way you want them to.

There's also extension (png, jpg, jpeg, webp), lossless_webp (on by default), jpg_webp_quality, calculate_hash and resource_hash for the hashing behavior, save_metadata_file for a sidecar text file, extra_info for your own notes, and a lora_name input of any type.

Outputs: FILENAME, FILE_PATH and METADATA, all strings. METADATA is the assembled parameter block as text - handy if you want to display it, log it, or write it somewhere else.

Formats, and what you lose

PNG keeps everything: the parameters text chunk plus the workflow JSON when embedding is available. JPEG and WebP get the parameter string written into the EXIF UserComment field through piexif, which is why this pack needs piexif installed at all - and neither of them keeps the node graph. Treat PNG as your archive and JPEG/WebP as the export.

Hashing a multi-gigabyte Safetensors isn't free, but the node caches model, VAE, LoRA and embedding hashes in dictionaries, so it's a first-save cost per file, not a per-image one. If you're batch-saving thousands of frames and don't want the hashes, turn calculate_hash off.

One more thing worth knowing, because it's a feature here rather than a bug: the metadata is your prompt. Your full positive, your negative, your seed, model name and hashes go into the file by default for anyone who drags it back into a metadata viewer. Posting the image posts all of it. If that's not what you want, use --disable-metadata on the server or strip the file before you upload - the node respects the --disable-metadata flag like the core saver does.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/nobinBB/comfyui-easy-use-anima
pip install piexif

Windows portable:

python_embeded\python.exe -m pip install piexif

Or ComfyUI Manager → comfyui-easy-use-anima; the Manager will pull piexif from the pack's requirements. Restart, then replace your Save Image node with this one and reconnect the six metadata wires from the loader and sampler. Missing piexif shows up as an import failure for this node specifically, with the rest of the pack loading fine.

CategoryEasyUse-Anima

Inputs (24)

NameTypeDefaultDescription
imagesIMAGE—
filenameoptSTRINGComfyUI_%time_%seed_%counter—
pathoptSTRING%date/—
model_nameoptCOMBO0 options:
vae_nameoptCOMBO1 options: Baked VAE
seedoptINT00–18446744073709550000—
stepsoptINT201–10000—
cfgoptFLOAT8.00–100—
sampler_nameoptCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
scheduleroptCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
lora_nameopt*—
widthoptINT11–16384—
heightoptINT11–16384—
positiveoptSTRING—
negativeoptSTRING—
extensionoptCOMBO4 options: png, jpg, jpeg, webp
calculate_hashoptBOOLEANtrue—
resource_hashoptBOOLEANtrue—
lossless_webpoptBOOLEANtrue—
jpg_webp_qualityoptINT1001–100—
date_formatoptSTRING%Y-%m-%d—
time_formatoptSTRING%H%M%S—
save_metadata_fileoptBOOLEANfalse—
extra_infooptSTRING—

Outputs (3)

NameTypeDescription
FILENAMESTRING—
FILE_PATHSTRING—
METADATASTRING—