LC Vision Reviewer π΅οΈ (BETA)
A second pair of eyes that's allowed to be wrong
- vision_model
- image
- image
- passed
- report
You render forty images overnight. Somewhere in there are three with hands like a bag of carrots, and you will not find them at 1am. LC Vision Reviewer looks at each finished render, asks a local vision model a handful of yes/no questions, and hands the image on with a verdict - passed (a boolean) and report (the reasoning, such as it is).
It's the pack's only node that sits after the sampler: everything else helps you write the prompt, this one grades the result.
What it actually does
The whole node is a questionnaire. The checked boxes - hands, faces, text, artifacts - plus your wired prompt and your own custom_checks become a numbered list of yes/no questions, sent with the image to the LC Vision Loader's model handle under a system prompt that reads, in the source's words, "You are a strict quality inspector for AI generated images... Answer every question with only yes or no, one numbered answer per line."
Anything not answered yes lands in the failure list. One call per image, at temperature zero. The report opens with PASSED or FAILED: hands, artifacts, then lists each check with a β
or β.
Two details matter more than they look. The image gets downscaled before the model sees it - resized on the long side and JPEG-compressed, same path as the pack's Caption node. So it's good at "is there an extra finger" and useless at "is that seam visible at 100%": judge output quality with your eyes, use this for structure. And more than 4 frames in the batch means video - it samples evenly spaced frames (video_frames, default 6, first and last included) and asks the question list once about the clip as a set. Under 4 frames, each frame is checked separately and failures are tagged image 2: hands, so you know which to re-roll.
The settings you'll touch
hands and faces are on by default and they're why you installed this. artifacts is the one I'd flip on for upscales and tiled work, where warping and seams are the usual failure. text only if your image has signage you care about.
on_fail is the real decision. flag passes the image onward anyway and just sets passed false - right when you're auditing a batch you'll look at regardless. block stops everything wired after it, so a bad render never reaches your save or upscaler. It does that by putting an execution blocker on the image output, which skips the downstream chain - only the chain; unrelated branches still run.
max_failures (default 0) is your tolerance: at 1, a single flagged check still counts as a pass. prompt is a socket, not a text box - wire your positive prompt in and it adds a "does the image match this prompt" question. custom_checks takes one check per line, written so yes = good, and appends the question mark. And seed? Generation runs at temperature zero, so changing it mostly changes nothing. Don't build a workflow around rerolling it.
Wiring the outputs
image passes straight through - this sits mid-wire, not at the end of one. report is a plain string, so send it to a text-display node or it lives in the node's own console readout. passed is a BOOLEAN, and ComfyUI ships no built-in "if true then" node for booleans, so either use block mode or feed it to a logic/switch node from a plumbing pack. It's also registered as an output node, so it runs even with nothing wired after it - deliberate, since the report is the point.
Install
Same pack as the rest of the LC Vision family. ComfyUI Manager β search ComfyUI LC Vision Nodes β install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC_Vision_nodes.git
Then run install.py (Manager does it for you) and restart. That script isn't optional: the vision chat handlers this pack needs live in a fork of llama-cpp-python, never merged upstream, so it resolves the wheel matching your Python, OS and CUDA version. On AMD or Intel it bails out rather than installing a CUDA-only wheel that can't import. You also need the LC Vision Loader and a Qwen-VL GGUF - a 4B at Q8 with n_ctx 4096 is plenty for a handful of yes/no questions.
Where it goes wrong
"Reviewer received no model" - you didn't wire vision_model, or the Loader failed to load. The Loader's error now includes the real import error; read that line before posting a bug report.
It fails everything on hands. Small models do this. Either move up to an 8B or set max_failures to 1 and treat the check as a hint. A vision model is a shortlist, not a judge - the author says so in the node description, and it's right. It's the same weakness the KB documents across every captioner: fine detail and attribution are where VLMs fall over.
"Nothing to check." All four boxes off and no custom checks means it returns the image with passed: true and a shrug. It doesn't error; it just does nothing, which is easy to miss.
Slow reviews on a shared card. The Loader keeps the model resident by default, which is what you want here - turn its keep_model_loaded off and every review pays a reload.
There's essentially no community thread history on this pack yet, so you won't find a hundred people who already hit your problem. The console output is chatty and the README explains its own failure modes. Read those before guessing.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| vision_model | LC_VISION_MODEL | Handle from LC Vision Loader. | |
| image | IMAGE | The finished image. A batch of more than 4 frames is read as a video: a few frames across the clip are checked together. | |
| hands | BOOLEAN | true | Fingers: extra, missing or fused. |
| faces | BOOLEAN | true | Melted or doubled features, mismatched eyes. |
| text | BOOLEAN | false | Signs, labels and logos spelled right. |
| artifacts | BOOLEAN | false | Warped objects, extra limbs, seams, smears. |
| on_fail | COMBO | flag | flag: always pass the image on, just set passed to false and say why in the report. block: stop every node wired after this one when a check fails (the save, the upscaler, etc.). |
| promptopt | STRING | Wire the positive prompt here to also check the image matches it. | |
| custom_checksopt | STRING | Your own checks, one per line, written so yes = good. e.g. Is she wearing a parka? | |
| max_failuresopt | INT | 00β20 | How many failed checks are allowed before it counts as a fail. |
| video_framesopt | INT | 61β32 | For a video: how many frames across the clip to look at. |
| seedopt | INT | 00β4294967295 | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | β |
| passed | BOOLEAN | β |
| report | STRING | β |