QwenVL
The original local vision-language node, still the one for captioning
- image
- STRING
The QwenVL node is where this pack's vision story actually lives - and if you searched for it, here's the confusing part up front: QwenVL and Qwen2.5VL are the same node. In the pack's __init__.py both names map to the same QwenVL class, so old workflows and new ones resolve to identical behavior. You've landed on the original name.
What it does is simple to state and surprisingly useful in practice: take an image (or a video) plus a text instruction, and get a STRING back describing or answering. No API calls, no keys, no cloud. It's a wrapper around Hugging Face's Qwen2.5-VL and Qwen3-VL model classes, from alexcong/ComfyUI_QwenVL, and it's become a staple for local captioning - the community's general verdict is that Qwen-VL captions are accurate enough to meaningfully improve downstream generation, especially with caption-driven models.
How it works
The image tensor from your graph is converted to a PIL image, inserted into a chat message alongside your text instruction, run through the model with torch.no_grad(), and decoded back to a string. Model loading is automatic: the first time you run, it snapshot_downloads the chosen checkpoint into ComfyUI/models/LLM/, and it uses bfloat16 on Ampere+ GPUs (fp16 otherwise) with device_map="auto".
The video path is the quietly clever part. Give it a video_path (a filesystem path string) and it shells out to ffmpeg to re-encode the clip to 1fps at a max dimension of 256px into /tmp, then feeds that to the model as a video input. That's how you get a VLM to "watch" a clip without melting your GPU - the frames are tiny on purpose. The temp file is cleaned up after inference. Note the README never mentions it, but video support requires an ffmpeg binary on PATH; it's not in the pip requirements.
Inputs worth setting
- model - eleven choices:
Qwen2.5-VL-3B/7B-Instruct, theQwen3-VLline (2B/4B/8B/32B in Instruct and Thinking), andSkyCaptioner-V1. The default isQwen3-VL-4B-Instruct; for captioning specifically,Qwen2.5-VL-7B-Instructis the proven pick. - text - your instruction to the model. Keep it explicit: "describe this image in detail" beats "what is this?"
- quantization -
none/4bit/8bit. Use 4bit to fit the 7B on a modest card. - keep_model_loaded - defaults to
False, which unloads the model after every run. Flip it on if you're captioning more than one image; the reload time otherwise dominates. - temperature, max_new_tokens (128–2048), seed (
-1= random) - the standard knobs.
Optional inputs are image (IMAGE) and video_path (STRING). If both are connected, video wins. The output is a single STRING - wire it into CLIPTextEncode to drive conditioning, a ShowText node to read it, or whatever caption-inspection node you like.
Install
ComfyUI Manager: search "Qwen-VL wrapper for ComfyUI". Or:
cd ComfyUI/custom_nodes
git clone https://github.com/alexcong/ComfyUI_QwenVL
cd ComfyUI_QwenVL
pip install -r requirements.txt
Restart ComfyUI after. The deps include transformers>=4.57.1, qwen-vl-utils, bitsandbytes, optimum, and accelerate. First run of a new model downloads it into ComfyUI/models/LLM/, so give it a few minutes.
Gotchas that actually bite
The keep_model_loaded=False default is the big one - first run of every queue feels like it hung, and it didn't. Quantization modes need a working bitsandbytes on CUDA; if they error, run none. And the transformers>=4.57.1 pin is a known collision point with Nunchaku users (which pins transformers near 4.56); people do coexist on 4.57.2, but expect some shuffling. Failure messages come back as Error during model inference: ... strings rather than red node errors, which is easy to miss if you're not reading the output.
The SkyCaptioner-V1 model option is worth a try if you're doing high-volume upscaling or refinement loops - it's a Skywork captioner that a few paid packs build workflows around. But for most people, Qwen2.5-VL-7B-Instruct, 4bit, keep_model_loaded=True is the boring, correct answer.
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 | — |