APNext QwenVL Vision Analyzer
Describe any image with Qwen3-VL
- images
- STRING
This is the workhorse of the QwenVL family: give it an image, it describes it. That sounds unglamorous, but "describe this image as a prompt" is the step every image-to-image and image-to-video workflow needs, and doing it with a local model means you can caption images all day for free - no API key, no uploads, no credit card. If you've been pasting screenshots into a cloud vision API to write img2img prompts, this is the node that replaces that habit.
It's built around Qwen3-VL (2B up to 8B, with Thinking and FP8 variants), downloads its model automatically on first use, and caches it in memory when keep_model_loaded is on so subsequent runs are fast. One IMAGE input, one STRING output - the finished description. The whole node is small enough to wire inline anywhere a prompt is needed.
How it works and the toggles that matter
The default prompt makes it write a rich description of the image, and three booleans shape the output style:
happy_talk(on by default) - enthusiastic, lively description vs. dry professional tone. It's exactly as silly as it sounds; flip it off for a neutral read.compress+compression_level- squashes the description down.soft,mediumorharddepending on how terse you want it. Useful when you're feeding a video model that rewards brevity or a text encoder with a token budget.poster- formats the output like a movie-poster one-liner. Great for cover art ideas, mostly harmless otherwise.
The three optional string inputs are the escape hatches: custom_base_prompt replaces the base instruction, custom_title injects a title to describe, and override takes full control of the prompt when you want something the defaults can't express ("only list the color palette as hex values").
The standard QwenVL knobs apply: qwen_model (start at 2B Instruct for speed, go 8B when detail or reasoning matters), max_tokens (default 512 - raise it if descriptions get cut off), temperature, seed/randomize_each_run, and use_flash_attention (off by default; needs the flash-attn package, speeds things up if you have it).
Install
Pack install is the shared routine - ComfyUI Manager (search "comfyui_dagthomas") or:
cd ComfyUI/custom_nodes
git clone https://github.com/dagthomas/comfyui_dagthomas
cd comfyui_dagthomas
pip install -r requirements.txt
Restart, then let the model download to ComfyUI/models/LLM/Qwen-VL/ on first use. No keys.
Common issues
- Descriptions get truncated - raise
max_tokens(up to 2048). 512 is fine for captions, short for essays. - Slow first run - that's the model downloading and loading;
keep_model_loadedmakes subsequent runs near-instant. - Out of memory - drop to a 2B or FP8 variant. The
Thinkingmodels are slower and heavier; use them only when you need real reasoning. - Output is one STRING - there's nothing to miswire, but don't expect a JSON struct. If you need structured output, the Vision Cloner's
raw_jsonis the one to reach for.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| happy_talk | BOOLEAN | true | — |
| compress | BOOLEAN | false | — |
| compression_level | COMBO | 3 options: soft, medium, hard | |
| poster | BOOLEAN | false | — |
| qwen_model | COMBO | Qwen3-VL-2B-Instruct | 23 options: Qwen3-VL-2B-Instruct, Qwen3-VL-2B-Thinking, Qwen3-VL-2B-Instruct-FP8, Qwen3-VL-2B-Thinking-FP8, Qwen3-VL-4B-Instruct, Qwen3-VL-4B-Thinking, +17 |
| max_tokens | INT | 51264–2048 | — |
| temperature | FLOAT | 0.700.1–1 | — |
| keep_model_loaded | BOOLEAN | true | — |
| use_flash_attention | BOOLEAN | false | — |
| seed | INT | -1-1–18446744073709550000 | — |
| randomize_each_run | BOOLEAN | true | — |
| custom_base_promptopt | STRING | — | |
| custom_titleopt | STRING | — | |
| overrideopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |