Qwen2.5VL
Qwen2.5VL turns an image plus a sentence into text
- image
- STRING
The Qwen2.5VL node is the reason a lot of ComfyUI setups suddenly got good at captioning. Drop in an image, type "describe this in detail," and it hands you a STRING - no API, no key, nothing leaves your machine. It's a vision-language model (VLM) wrapper from alexcong's ComfyUI_QwenVL pack, and the reason people reach for it is that Qwen2.5-VL's image descriptions are genuinely good. Community consensus in late 2025 was that it noticeably improves results when its captions feed into caption-based workflows, especially with models like Z-Image. If you've seen the "have an LLM write your prompt" pattern floating around, this is a clean way to run it locally.
The name undersells it. The node class is Qwen2.5VL, but the model dropdown is eleven entries long and most of them are Qwen3-VL - 2B, 4B, 8B, and 32B, in both Instruct and Thinking flavors, plus Qwen2.5-VL-3B/7B-Instruct and a SkyCaptioner-V1 option. It's an alias for the same QwenVL class, registered under both names for compatibility. So you can treat "Qwen2.5VL" as "the multimodal node in this pack," and pick the actual model per run.
How it works
Under the hood it's a thin layer over Hugging Face's transformers. The image tensor from your graph gets converted to PIL, wrapped in a chat template, run through Qwen2_5_VLForConditionalGeneration (or Qwen3VLForConditionalGeneration if you picked a Qwen3 model), and decoded back to text. The node uses bfloat16 on Ampere-and-newer GPUs, falls back to fp16 otherwise, and loads with device_map="auto". Nothing clever, which is exactly the point - it's a wrapper, so the mechanisms are the model's own.
Two details worth knowing. First, models auto-download from Hugging Face on first use into ComfyUI/models/LLM/ - you don't hunt for a file, but the first run quietly pulls gigabytes. Second, it takes an optional video_path too, though that path requires ffmpeg on your system (more on that in the gotchas).
The inputs that matter
- model - the dropdown above.
Qwen2.5-VL-7B-Instructis the 2025 workhorse for captioning; the 3B is the lightweight pick if VRAM is tight. - text - your instruction. "Write a detailed prompt describing this image" does exactly what you think.
- quantization -
none,4bit, or8bit. 4-bit is how people squeeze the 7B into 8GB-ish cards. - keep_model_loaded - the one that bites. Default is
False, which means the node unloads the model and clears VRAM after every run. Flip it toTrueand it caches between runs, which turns a multi-minute reload into a fast repeat. - temperature (0–1, default 0.7) and max_new_tokens (128–2048, default 512) - the usual sampling knobs.
- seed -
-1means random. Set it for reproducible captions.
Optional inputs: image (an IMAGE tensor - wire in a Load Image node) and video_path (a filesystem path string). If both exist, video wins.
The output is a single STRING, which is the whole point - it feeds straight into CLIPTextEncode's text slot or a ShowText node for eyeballing.
Install
Via ComfyUI Manager, search for "Qwen-VL wrapper for ComfyUI". Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/alexcong/ComfyUI_QwenVL
cd ComfyUI_QwenVL
pip install -r requirements.txt
Then restart ComfyUI. The requirements list is chunky: transformers>=4.57.1, qwen-vl-utils, bitsandbytes, optimum, accelerate, plus the usual torch stack. If you only ever use none quantization you can survive without bitsandbytes, but it's in the file.
Where people get burned
keep_model_loadedis off by default. The model reloads every queue run and it feels broken-slow until you notice.- Quantization needs bitsandbytes on CUDA. If 4bit/8bit throw errors, either fix the bitsandbytes install or just run
none. - The transformers version conflict is real. This pack wants
transformers>=4.57.1, which collides with Nunchaku (pinned near 4.56). People do run both on 4.57.2, but if you use Nunchaku, expect a fight. It's the classic ComfyUI dependency hell in miniature. video_pathneeds ffmpeg on PATH - it re-encodes the clip to 1fps at max 256px in/tmpbefore inference. No ffmpeg, no video.- Errors come back as a STRING like
Error during model inference: ...rather than a crash, which is friendly but easy to miss if you're only looking at the graph.
For plain image captioning, Qwen2.5-VL-7B-Instruct with keep_model_loaded=True and 4-bit quantization is the setup most people end up on. It's not the fastest node in the world, but it's the one that makes your captions actually worth reading.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | — | |
| model | COMBO | Qwen3-VL-4B-Instruct | 11 options: Qwen2.5-VL-3B-Instruct, Qwen2.5-VL-7B-Instruct, Qwen3-VL-2B-Thinking, Qwen3-VL-2B-Instruct, Qwen3-VL-4B-Thinking, Qwen3-VL-4B-Instruct, +5 |
| quantization | COMBO | none | 3 options: none, 4bit, 8bit |
| keep_model_loaded | BOOLEAN | false | — |
| temperature | FLOAT | 0.70–1 | — |
| max_new_tokens | INT | 512128–2048 | — |
| seed | INT | -1 | — |
| imageopt | IMAGE | — | |
| video_pathopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |