GU Image Label
Burn the whole recipe onto the image so you never lose it
- samp_sampler
- samp_scheduler
- image
- img_w_label
- tech_label
- pos_label
- neg_label
- gen_label
- tech_suffix
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 Nameand the LoRA nodes'lora_listoutputs. - prompt_pos, prompt_neg - the prompts, from your text encode nodes.
- time_ctrl - elapsed time as
hh:mm:ss, meant to come from aGU TimerON/GU TimerOFFpair 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,+ Reduxto 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.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| model_nameopt | STRING | Put a model name string here | |
| lora_namesopt | STRING | Put all lora names in single string here | |
| prompt_posopt | STRING | — | |
| prompt_negopt | STRING | — | |
| time_ctrlopt | STRING | Elapsed time input | |
| samp_seedopt | INT | -//- seed | |
| samp_stepsopt | INT | -//- steps | |
| samp_cfgopt | FLOAT | -//- cfg | |
| samp_denoiseopt | FLOAT | -//- denoise | |
| samp_sampleropt | * | Sampling sampler | |
| samp_scheduleropt | * | -//- scheduler | |
| imageopt | IMAGE | Ready image for labeling | |
| fontopt | COMBO | 1 options: ShareTechMono-Regular.ttf | |
| font_sizeopt | INT | 148–200 | — |
| used_ctrlnetopt | BOOLEAN | false | If ControlNet is used - for filename suffix |
| used_detdaemonopt | BOOLEAN | false | If DetailDaemon is used - for filename suffix |
| used_reduxopt | BOOLEAN | false | If Redux is used - for filename suffix |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| img_w_label | IMAGE | Image with label |
| tech_label | STRING | Technical system info |
| pos_label | STRING | Positive prompt |
| neg_label | STRING | Negative prompt |
| gen_label | STRING | Generation params info |
| tech_suffix | STRING | Filename short technical suffix |