Illustrious Caption Audit
The one input that stops a queue twenty minutes before it wastes your GPU
- dataset
- dataset
- ready
- report
IllustriousCaptionAudit has one input and one job: confirm that every image in a prepared dataset has a caption file, that none of those files are blank, and that the run is in a state the trainer will accept. Then it tells you whether you're good to go.
That's it. It takes dataset and returns dataset (unchanged, so you can drop it mid-graph), ready, and report.
The reason it exists is that every trainer fails the same way when a dataset is incomplete: it either crashes on the first image without a caption, or worse, silently trains with an empty string for that image and teaches your LoRA that "nothing" is a valid description of a face. The Illustrious trainer in this pack does its own check internally - it wants a non-empty caption for every image and refuses otherwise - but this node is what lets you find out before you've burned a queue slot and loaded 6 GB of SDXL weights.
What counts as ready
The mechanism is deliberately unglamorous. It reads the manifest, walks the image list, and checks three things:
- No missing captions. Every image needs a sibling
.txt. - No empty ones. A file that exists but is only whitespace counts as empty. Captions are read as UTF-8 with BOM tolerance, which matters if you edited them in Notepad on Windows.
- A sane status. The run's manifest status has to be
preparedortagged. If a tagging pass was interrupted, the status becomestagging_interrupted_or_failed, and this node will tell you the dataset isn't ready even if every caption file happens to exist.
It then writes caption_audit.json into the run directory and returns ready as a BOOLEAN. The report is JSON listing images, the exact missing filenames, the exact empty filenames, and ready. If the result isn't true, the report names the files - no guessing which one broke.
What it does not check
This is the honest bit, and the pack's own documentation says it outright: the audit only verifies that text exists. It has no opinion on whether the text is right. Specifically:
- It won't notice that you cropped an image and the caption still mentions the background you removed.
- It won't notice a caption that's 900 tags long, or one with a repeated tag eleven times (though deduplication in the tagger and edit nodes makes the second case unlikely).
- It won't notice that 58 of your 60 captions say
purple hairwhen you wanted hair colour treated as identity - that's a job for the preview node's tag counts.
Treat ready as "structurally valid", not "good". Meaningful caption review is staring at the preview report and making judgement calls about what should and shouldn't be variable.
Wiring it
ready is a BOOLEAN, and nothing in this pack consumes a boolean - so it's a signal you read, not a wire you follow. The useful patterns are putting this node right before the trainer in the graph so the report lands in the same queue run as your pre-flight check, and simply reading the node's output text. If you want it to actually gate something, wire ready into a boolean switch or a conditional-eval node from another pack, but be aware the trainer enforces the same condition internally anyway. You can't accidentally start a run on an unaudited dataset.
Install
Manager, searching ComfyUI-IllustriousLoRATools (listed as Illustrious LoRA Tools), or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/katorikonoe-ai/ComfyUI-IllustriousLoRATools
pip install -r ComfyUI-IllustriousLoRATools/requirements.txt
Use ComfyUI's own Python for the requirements - the pack pulls diffusers, transformers, peft, accelerate, bitsandbytes, onnxruntime and more, and swapping out the host's CUDA PyTorch build is how you break generation, not just training. Keep native/, web/ and crop_routes.py with __init__.py, since the pack's README is explicit that a partial copy installs nothing. Restart and find it under Katori/Illustrious Native Training.
Where people get burned
Two cases. First: a caption file with a stray comma-only or whitespace body counts as empty, and the fix is obvious once the report names it. Second: a run you tagged yesterday reports ready: false today because the manifest status was left mid-flight by an interrupted queue. Re-run the tagger, or just open the manifest and confirm the captions are actually there - the audit is reading the status field, not the images.
And the recurring one for anything in this pack: prepared runs live under ComfyUI/output/illustrious_native/. Wipe your output folder and the audit has nothing to read, no matter how intact your captions are.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| dataset | ILLUSTRIOUS_DATASET | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| dataset | ILLUSTRIOUS_DATASET | — |
| ready | BOOLEAN | — |
| report | STRING | — |