System One Pick Best Image
Stop Opening Ten PNGs to Choose One
- backend
- images
- best
- index
- confidence
- report
You generated four candidates for "a red bicycle leaning against a brick wall". Three are fine, one has a wheel growing out of the frame. You open the folder, click through them, and pick. System One Pick Best Image does that click-through for you and hands one image downstream, so your Save node writes one file instead of four.
It's the second half of the pack's image QA pair: Image Check filters the batch, Pick Best Image ranks what's left.
How it works
The node poses a choice question to Clef-flash - literally "image_1, the 1st attached image / image_2, the 2nd attached image..." with your instructions prepended and a note telling the model the images are attached in order - and takes the winner. Clef accepts at most 4 images per call, so the node runs heats: batches up to 4 are one call (a "final"), and anything larger splits into groups of 4, takes the winner of each, then runs another round on the winners until one image is left. Eight candidates is three calls. Sixteen is five.
If you feed it a single image, it short-circuits: that image comes out with confidence 1.0 and no API call at all. Which is genuinely nice - you can leave the node in a workflow and it costs nothing on a one-image batch.
As with Image Check, what Clef sees is a downscaled JPEG (long side 512px, stepping down to fit the request budget), while best is your original full-resolution tensor.
Inputs and outputs
backend- a Clef provider. Laya and Jev raisecannot see images; use a Clef backend.images- the batch.instructions- default isWhich attached image best matches the prompt in \prompt`?- note that it references apromptfield, which is thecontextinput below. If you leavecontextempty the state is just "An image is attached." and that default question has nothing to match against, so reword it or fillcontext` in.context(optional) - usually your generation prompt, sent as the state'sprompt.
Outputs: best (IMAGE - a one-image batch), index (INT - position in the batch it received, zero-based), confidence (FLOAT), report (STRING, JSON with every heat's answers and latencies).
index is more useful than it looks in a harness: it's how you correlate the winner with the seed you used, if you're generating with a seed list rather than one batch.
The confidence number means less than you want it to
This is the honest limitation, straight from the README's own recording: after filtering four near-identical apple images down to three survivors, the pick came back with 0.16 confidence. That's not a bug - when the candidates are visually indistinguishable, the model has nothing to discriminate on and says so. Read low confidence as "any of these would do, go look yourself", not as "the model is broken".
The mirror case is when it's confident and wrong: VLMs are bad at attribution in busy frames. If two people share the frame, "which image better shows a woman in a red coat" can come back confidently on the wrong one. Keep the question as concrete and as single-subject as you can - "which image shows a bicycle with two complete wheels" is a better question than "which is the best image".
When it's worth it
Worth it: a four-candidate shoot where the failure mode is countable or checkable (missing limbs, wrong object count, text baked into the image, eyes crossed). Two extra calls and a second of latency, and you stop sifting folders.
Not worth it: aesthetic selection among ten fine images. The model has no taste you'd agree with, and it'll rank near-identical outputs on noise. If that's the job, wire Image Check with a specific reject question instead and keep everything that survives - you'll get a better result and you'll understand why.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/dante01yoon/ComfyUI-SystemOne
pip install -r ComfyUI-SystemOne/requirements.txt
export CLOUDFLARE_ACCOUNT_ID=...
export CLOUDFLARE_API_TOKEN=... # a token with Workers AI permission
Or search System One in ComfyUI Manager. Note what you do and don't need: this node never touches Laya, so the laya>=0.3.24 line in requirements.txt is the only heavy dependency in the pack and you can skip it if you're only doing image QA. Restart ComfyUI after exporting the keys - they're read from the environment at call time, and a running server won't see them.
Getting burned
- Keys set in the wrong shell →
The Clef backend needs the CLOUDFLARE_ACCOUNT_ID environment variable set before starting ComfyUI. - More than 4 images in a single call → the node splits them into heats for you, but remember the cost scales: every heat is a separate billed request at 0.3–0.9s.
- Empty batch →
Pick Best Image needs at least one image. - Answering "which is best" when you meant "is this acceptable" → that's Image Check's job, and it's cheaper.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| backend | SYSTEMONE_BACKEND | Use a Clef provider; only Clef can see images. | |
| images | IMAGE | — | |
| instructions | STRING | Which attached image best matches the prompt in `prompt`? | — |
| contextopt | STRING | Usually the generation prompt. Sent as the state's 'prompt'. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| best | IMAGE | — |
| index | INT | — |
| confidence | FLOAT | — |
| report | STRING | — |