TrainyThing Load
Read yesterday's phone verdicts back into a fresh graph
- accepted
- rejected
- images
- labels
- summary
- notes
- accepted_meta
- accepted_indices
What it is
TrainyThing Load reads a review queue back by name. You give it a slug, it goes to the TrainyThing daemon, pulls the pictures out of the daemon's own blob store, and hands you the keepers, the rejects, the notes, the labels and the seeds as ordinary ComfyUI sockets.
The reason it exists is one specific annoyance. Every on-canvas chooser - including this pack's own Review node - holds ComfyUI's entire queue while it waits. Fine when you're sitting there swiping; useless when you want to send a batch at midnight and judge it over coffee, or when a second person reviews while you keep generating.
Load is the other half of that escape hatch. Send your batch with TrainyThing Send, let the run end, review whenever, then run a completely separate graph that starts with Load. Two runs, no held queue, and the verdicts survive a ComfyUI restart because they live in the daemon (~/.trainything), not in a node's memory.
How it works
Under the hood it's three steps. It connects to the daemon the same way every node in the pack does - TRAINYTHING_URL and TRAINYTHING_TOKEN from ComfyUI's environment first, then ~/.trainything/config.json, then http://127.0.0.1:4747. It finds the queue by that slug, optionally waiting for it to finish. Then it writes the run's folder to ComfyUI/output/trainything/<slug>/ - results.json, a labels.jsonl, a summary.md and a blobs/ folder holding every uploaded PNG with its prompt and workflow chunks intact - and reads those PNGs back as a batch.
Which means you can drag a keeper's PNG out of blobs/ onto the canvas and get the whole workflow back, seed and all - the same "the image is the project file" property every ComfyUI PNG has.
One thing Load does not give you: accepted_latent. Latents aren't stored on the daemon, so there's nothing to read back - you VAE Encode accepted if you need latents for a refine pass.
Inputs and outputs
Three inputs, and only one you'll fiddle with:
slug- the queue's short name, as shown on the dashboard or on the Send/Review node. Its id also works.wait- off by default: read the verdicts that exist right now. On: block until the queue is done ortimeout_minutesruns out, like Review does.timeout_minutes- 45 by default, withwaiton.
Out come eight sockets: accepted, rejected, images (every image card, in card order - an appended queue's runs one after another), labels (made for TrainyThing Filter), summary (counts plus notes, good into a text preview), notes, accepted_meta (JSON with each keeper's seed, prompt, checkpoint, LoRAs and sampler settings) and accepted_indices.
accepted_meta deserves a second look if you've appended several runs into one queue: position is the keeper's place in Load's batch, while index is its place in the batch its own Send was given - the sampler's index. They differ once a queue holds more than one run, and index is the one you want for Latent From Batch.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/ryanrinkel/comfyui-trainything
cd comfyui-trainything
python -m pip install -r requirements.txt
Restart, and the five nodes are under TrainyThing. Manager works too - search the pack title, or comfy node install trainything.
Load needs the daemon, and the daemon needs Node ≥ 22.5:
npx -y trainything dashboard
Run that once; it stays in the background and opens a dashboard. If no daemon answers when a node needs it, the node tries to start one itself with a 15-second budget - but doing it once yourself is less mysterious. Deps are segno, pillow, numpy; no model files.
Common issues
"No TrainyThing at http://127.0.0.1:4747". The daemon isn't up - that one line is the whole error, by design. Start it, or point TRAINYTHING_URL at a daemon it can reach; a rented GPU box needs this, since 127.0.0.1 there isn't your desktop.
The slug doesn't resolve. An empty slug gets derived from title, so the real one may differ from what you assumed. Copy it off the dashboard or the Send's slug output.
"has no image cards to load". The queue exists but holds nothing Load can return - text, audio or video cards added through the CLI get skipped (with a console line each), and if all of them are skipped there's no batch to make.
It runs again when you didn't change anything. Load's cache key carries the queue's own state - verdict count, status, closed time, last activity. A new verdict re-runs it, and so does a reviewer merely opening a card. Right trade, but don't hunt for a bug.
Mixed sizes get resized. A batch has one size, so any card whose dimensions differ from the first is resized bilinear and the console says how many. If your keepers look oddly soft, that's why.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| slug | STRING | The short name of a batch that was already sent: the slug shown on the dashboard or on the Send or Review node. | |
| wait | BOOLEAN | false | Off: read the verdicts that exist right now. On: wait until the batch is finished (or the time runs out), like Review does. |
| timeout_minutes | FLOAT | 45.00.1–10080 | With wait on: how long to wait before reading whatever has been judged so far. |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| accepted | IMAGE | — |
| rejected | IMAGE | — |
| images | IMAGE | — |
| labels | STRING | — |
| summary | STRING | — |
| notes | STRING | — |
| accepted_meta | STRING | — |
| accepted_indices | INT | — |