🧪 QwenVL Multi-Image (Advanced)
The same multi-image Qwen node, with the sampling dials exposed — and one trap
- images
- images_batch_2
- images_batch_3
- text
🧪 QwenVL Multi-Image (Advanced) is the same pack's standard node with the training wheels off. It loads the same Qwen2.5-VL / Qwen3-VL vision models, accepts the same one-or-many image inputs, and returns the same single text string - but it adds the sampling controls the basic node hides, plus a device override. If the standard node's "describe and be done" output isn't working for you, this is the variant you swap in, not a different tool.
The whole family installs together from hardik-uppal/ComfyUI-QwenVL-MultiImage - see the standard node's page for the full install and model-download story. This one is about the knobs.
What the extra inputs actually do
Everything from the standard node is here (images, model_name, system_prompt / user_prompt, quantization, max_tokens, keep_model_loaded, seed, plus the optional images_batch_2 / images_batch_3). On top of that:
temperature(default 0.7) - randomness. Lower for focused, factual answers; higher if you want the model to free-associate.top_p(0.9) andtop_k(50) - the usual nucleus/top-k sampling pair. Leave them near default until you have a reason not to.repetition_penalty(1.1) - push it up (1.2–1.5) when the model starts looping on long captions.num_beams(1) - beam search. This is the trap: whennum_beamsis above 1, the code switches to beam decoding andtemperature,top_p, andtop_kare silently ignored. Crank the beams for quality, then wonder why your temperature edits do nothing - that's why. Keepnum_beamsat 1 if you want sampling control.device(auto / cuda / cpu) - force a device. Usually leave onauto; it's the escape hatch when something is being routed to the wrong GPU or you're stuck debugging on CPU.
How it works
Same mechanism as the standard node: images get flattened into one chat message, the Qwen model runs via transformers + qwen_vl_utils, and you get text back. The difference is only in the generation call - sampling params get passed to model.generate() when num_beams == 1, and the cache key includes your chosen device, so switching devices reloads the model rather than reusing a warm one.
When to reach for it
If you're captioning a LoRA dataset and the greedy output reads stiff or repeats itself, this node lets you tune it - a touch more temperature for variety, a bit of repetition penalty to kill loops. If you're comparing images and want consistent, dry answers, keep temperature low and num_beams at 1. For most people the standard node is enough; grab this one when the output quality, not the plumbing, is the problem. And fix the seed while you tune - changing one variable at a time is the only way to tell what actually moved the needle.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| model_name | COMBO | Qwen/Qwen3-VL-4B-Instruct | 13 options: Qwen/Qwen3-VL-4B-Instruct, Qwen/Qwen3-VL-8B-Instruct, Qwen/Qwen3-VL-32B-Instruct, Qwen/Qwen3-VL-8B-Thinking, Qwen/Qwen3-VL-32B-Thinking, Qwen/Qwen3-VL-8B-Instruct-FP8, +7 |
| system_prompt | STRING | You are a helpful assistant. | — |
| user_prompt | STRING | Describe these images in detail. | — |
| quantization | COMBO | 8-bit (Balanced) | 3 options: None (FP16), 8-bit (Balanced), 4-bit (VRAM-friendly) |
| max_tokens | INT | 102464–4096 | — |
| temperature | FLOAT | 0.70.1–2 | — |
| top_p | FLOAT | 0.900–1 | — |
| top_k | INT | 501–100 | — |
| repetition_penalty | FLOAT | 1.11–2 | — |
| num_beams | INT | 11–10 | — |
| keep_model_loaded | BOOLEAN | true | — |
| seed | INT | 11–4294967295 | — |
| device | COMBO | auto | 3 options: auto, cuda, cpu |
| images_batch_2opt | IMAGE | — | |
| images_batch_3opt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |