GPM VLM Scanner (Internal Advanced)
Three prompt families, one model load, real runtime knobs
- summary_json
- status_text
Same scanner, two differences that matter: it can caption one folder for several bases in a single queue, and it exposes the runtime settings the basic node hard-codes. If you're captioning a mixed library - some SDXL-era finetunes, some Pony, some newer natural-language models - this is the one you want. If you're doing one pass on one family, the basic node does the same job with fewer ways to misconfigure it.
The three-family pass
Instead of a single prompt_preset, you get scan_sdxl, scan_pony and scan_natural, each ON/OFF, plus a preset dropdown per family (sdxl_preset, pony_preset, natural_preset) so you can point each at a user preset you've tuned rather than the built-in. Defaults are SDXL on, the other two off - same shape as the basic node until you change something.
Turn on all three and the node runs three full scans over the same root_folder, sequentially, one preset at a time. The win is the model: it stays loaded across all of them and the worker exits once at the end, so you pay for one load and one VRAM dance instead of three. The catch is that it's three passes over your images, so it's genuinely three times the time.
The output shape changes with the count, and this trips people up:
- One family selected - you get the normal single summary, exactly like the basic node.
- More than one -
summary_jsonbecomes an aggregate: anokflag, ascan_runslist of the per-family summaries, andprocessed_total,failed_total,skipped_totalacross all of them.status_textjoins the per-family lines with||.
Also: if a family fails, the run stops there. The node breaks out of the loop rather than continuing, on the theory that whatever broke will break the next one too. So an aggregate showing one run and no others means the first one died, not that you configured two families.
overwrite_mode, scan_limit, write_scan_report and debug_mode behave as they do on the basic node. SKIP_EXISTING skips per family, so a folder that already has sdxl_* fields still gets the pony_* pass - which is exactly what you want here, and why the three-family run is cheap to re-queue when you add new images to a folder you already scanned.
The runtime knobs
model_name/mmproj_name- the GGUF pair. Matching release, both files, inComfyUI/models/llm/,models/llm/GGUF/ormodels/GGUF/.n_ctx- context window, 256–32768, default 4096. Bigger costs VRAM; the caption prompt plus one image isn't a huge window.n_gpu_layers--1means offload everything. Sharing a card, a smaller positive number trades speed for headroom.temperature(0.2) andtop_p(0.95) - caption sampling. Low temperature is why the scanner is conservative; raising it buys creativity, which for a description task is a bug, not a feature.max_tokens- 32–2048, default 512. The SDXL preset asks for 10–20 fragments per field, so truncation shows up as cut-off scenes, not an error.batch_size(512) andthreads(0 = runtime decides) - throughput knobs.threadsmatters most when you're offloading to CPU.
One subtlety worth knowing: the Advanced node passes its own temperature/top_p/max_tokens values through explicitly, so the widgets win over whatever a preset carries in its temperature/max_tokens fields. The basic node leaves those None and lets the preset decide. In practice the built-ins ship 0.2 / 0.95 / 512 - the same numbers - so you won't notice until you tune a preset expecting it to stick.
Install
ComfyUI Manager → Gallery Prompt Manager (Registry name gallery-prompt-manager), or:
cd ComfyUI/custom_nodes
git clone https://github.com/Mystic419/GPM-for-ComfyUI GPM
cd GPM
python -m pip install -r requirements.txt
python install.py
install.py is the llama-cpp-python step and it is not optional if you want this to be usable: the default pip wheel is CPU-only, and a vision scan on CPU is measured in evenings. The installer handles CUDA wheels and honours GPM_LLAMA_INSTALL_MODE=cuda if you want to force that path. Model files: Qwen2.5-VL GGUF plus its matching mmproj.
Where people get burned
- Validated family only. The same gate as the basic scanner applies: Qwen2.5-VL is the approved internal family for scan correctness, and Qwen3-VL / Gliese-Qwen3.5-VL are detected but blocked. Given how fast the captioning crowd moved to Qwen3-VL, that's the thing most likely to send you looking for a different pack - and the honest answer is that this one is deliberately conservative while the author validates the newer image path.
- A three-family run you didn't mean.
SKIP_EXISTINGis per family, so tickingscan_naturalon an already-scanned folder quietly adds a third pass. Three passes, three times the time, and it doesn't start until the previous family finishes - which looks hung if you're watching one progress bar. - Aggregate JSON parsed as a single summary. Anything downstream expecting
processedfindsprocessed_totalonce two or more families are on. Per-family detail is inscan_runs. - VRAM mid-session. The worker releases the model on exit, but while it scans the VLM is holding memory alongside whatever your workflow already loaded. Scan first, generate after.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| root_folder | STRING | — | |
| scan_sdxl | COMBO | ON | 2 options: ON, OFF |
| scan_pony | COMBO | OFF | 2 options: ON, OFF |
| scan_natural | COMBO | OFF | 2 options: ON, OFF |
| sdxl_preset | COMBO | SDXL | 1 options: SDXL |
| pony_preset | COMBO | Pony | 1 options: Pony |
| natural_preset | COMBO | Natural Language | 1 options: Natural Language |
| overwrite_mode | COMBO | SKIP_EXISTING | 2 options: SKIP_EXISTING, OVERWRITE_FAMILY |
| scan_limit | INT | 00–100000 | — |
| write_scan_report | COMBO | OFF | 2 options: OFF, ON |
| model_name | COMBO | <no gguf models found> | 1 options: <no gguf models found> |
| mmproj_name | COMBO | (auto) | 2 options: (auto), <no mmproj models found> |
| n_ctx | INT | 4096256–32768 | — |
| n_gpu_layers | INT | -1-1–200 | — |
| temperature | FLOAT | 0.200–2 | — |
| top_p | FLOAT | 0.950–1 | — |
| max_tokens | INT | 51232–2048 | — |
| threads | INT | 00–128 | — |
| batch_size | INT | 51232–8192 | — |
| debug_mode | COMBO | OFF | 2 options: OFF, ON |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| summary_json | STRING | — |
| status_text | STRING | — |