Nodes/ComfyUI-GU_Nodepack/GU Image Label
ComfyUI Node

GU Image Label

Burn the whole recipe onto the image so you never lose it

By alexguryev·Created 4 months ago·Updated 23 days ago· 2
GU Image Label
  • samp_sampler
  • samp_scheduler
  • image
  • img_w_label
  • tech_label
  • pos_label
  • neg_label
  • gen_label
  • tech_suffix
model_name
lora_names
prompt_pos
prompt_neg
time_ctrl
samp_seed
samp_steps
samp_cfg
samp_denoise
font
font_size14
used_ctrlnetfalse
used_detdaemonfalse
used_reduxfalse

GU Image Label is the node that puts the entire recipe on the plate. You feed it your model name, LoRAs, prompts, seed, steps, CFG, sampler, scheduler, and elapsed time - and it hands you back the image with all of that rendered as a caption bar at the bottom, plus the same information split into ready-to-use text blocks and a compact "what techniques did I use" suffix for filenames.

ComfyUI already embeds the full workflow in every PNG, which is your safety net. But that net only helps when you drag the image back onto the canvas. If you've ever sorted through a folder of 200 generations trying to remember which one was seed 48291 or which used the ControlNet, you understand why visible captions win. This node makes your output folder self-documenting at a glance.

What it takes in

Everything is optional - the tooltip for the node literally says "all inputs are optional." The ones that matter:

  • model_name, lora_names - strings, typically fed from GU Get Model Name and the LoRA nodes' lora_list outputs.
  • prompt_pos, prompt_neg - the prompts, from your text encode nodes.
  • time_ctrl - elapsed time as hh:mm:ss, meant to come from a GU TimerON/GU TimerOFF pair so you capture actual generation time.
  • samp_seed, samp_steps, samp_cfg, samp_denoise, samp_sampler, samp_scheduler - the sampling parameters, wired off your KSampler.
  • image - the finished image. If you connect it, the info gets rendered as caption blocks at the bottom; if you don't, the node still outputs all the text blocks without touching pixels.
  • font / font_size - the caption font (the pack ships Share Tech Mono) and size, 8–200.
  • used_ctrlnet, used_detdaemon, used_redux - three checkboxes that add + ControlNet, + DetailDaemon, + Redux to the generation info and, more importantly, feed the filename suffix.

What comes out

Six outputs. img_w_label is the image with captions burned in. The four text blocks - tech_label (hardware spec: GPU, CUDA/PyTorch versions, VRAM, CPU, RAM), pos_label, neg_label, gen_label (all the generation params, including elapsed time) - are formatted for writing to a sidecar text file via GU Save Image Info. And tech_suffix is the filename gold: a short string like (used_lora_ctrlnet) that GU Project Path appends to your output filenames so the file name alone tells you what techniques it used.

The mechanism

Tech info is gathered live from your machine (PyTorch/CUDA versions, GPU name, VRAM, RAM) at run time. The label rendering is straight PIL: text blocks are stamped under the image, and the block height auto-adjusts to the text volume. The ^ separators you may see in the internal strings become line breaks in the outputs. It's an output node, so it forces execution - which you want, because a caption that didn't refresh is worse than no caption.

Install

ComfyUI Manager → search "GU Nodepack" → install → restart, or:

cd ComfyUI/custom_nodes
git clone https://github.com/alexguryev/ComfyUI-GU_Nodepack
cd ComfyUI-GU_Nodepack
pip install -r requirements.txt

Deps: psutil (for the RAM/CPU info), requests (used by the LoRA-tag lookup), gu-funclib>=1.9.0. No model downloads. Windows-tested, single-user design.

Where people get burned

The used_* toggles are checkboxes you must flip yourself - the node can't detect that you used ControlNet, so forget to set them and your tech_suffix silently omits _ctrlnet while your labels claim the image used nothing special. If you're captioning batches, wire the sampler/scheduler/seed inputs from the actual KSampler rather than typing them, or the label will drift from the image. And remember the caption is burned into pixels: run it on a copy or keep the originals, because once the label is on there it doesn't come off.

CategoryGU_Nodepack

Inputs (17)

NameTypeDefaultDescription
model_nameoptSTRINGPut a model name string here
lora_namesoptSTRINGPut all lora names in single string here
prompt_posoptSTRING
prompt_negoptSTRING
time_ctrloptSTRINGElapsed time input
samp_seedoptINT-//- seed
samp_stepsoptINT-//- steps
samp_cfgoptFLOAT-//- cfg
samp_denoiseoptFLOAT-//- denoise
samp_sampleropt*Sampling sampler
samp_scheduleropt*-//- scheduler
imageoptIMAGEReady image for labeling
fontoptCOMBO1 options: ShareTechMono-Regular.ttf
font_sizeoptINT148–200
used_ctrlnetoptBOOLEANfalseIf ControlNet is used - for filename suffix
used_detdaemonoptBOOLEANfalseIf DetailDaemon is used - for filename suffix
used_reduxoptBOOLEANfalseIf Redux is used - for filename suffix

Outputs (6)

NameTypeDescription
img_w_labelIMAGEImage with label
tech_labelSTRINGTechnical system info
pos_labelSTRINGPositive prompt
neg_labelSTRINGNegative prompt
gen_labelSTRINGGeneration params info
tech_suffixSTRINGFilename short technical suffix