㊙️QWenVL_Chat_Zho
Qwen-VL multi-turn chat inside ComfyUI, and the transcript gotcha nobody mentions
- image
- text
Same pack, same inputs, completely different output
㊙️QWenVL_Chat_Zho is the sibling of ㊙️QWenVL_Zho in ZHO-ZHO-ZHO's ComfyUI-Qwen-VL-API pack, and the one-line difference is the entire point: this node remembers. It keeps a running conversation with Alibaba's Qwen-VL and sends the whole history to the API on every call, so you can refine a description across several passes, ask follow-ups about the same image, or build a multi-image reference conversation where each turn's answer actually knows what you said before.
Same setup as the single-turn node - DashScope key in config.json, no model downloads, the API went paid back in March 2024. But before you wire it into a workflow, read the next section, because this node has a quirk that will quietly surprise you.
How it works (and the gotcha)
Internally it keeps a messages list in the node instance's memory. Each run appends your image and prompt, and on the way in it saves the image to a qw/ folder inside the pack directory, keyed by an MD5 hash of the pixels. Identical images are deduped - run the same image twice and it only writes the file once. The full message history goes to the MultiModalConversation API, and the model's reply gets appended to that history. Delete the node or restart ComfyUI and the conversation is gone.
Here's the catch that the README glosses over: the text output is not the latest answer - it's the entire conversation transcript. The node returns a formatted history, every message prefixed with its role and separated by dashed divider lines. That's great if you want to display the whole back-and-forth, and genuinely annoying if you assumed "text output" meant "the answer." The string grows with every turn, so if you're feeding it into a prompt or a caption file, you'll be writing the whole dialogue each time, and there's no parameter to switch between "just the answer" and "everything."
The inputs
Identical to its single-turn sibling - only four:
- image - an
IMAGEfrom your graph - prompt - multiline string, defaults to "Describe this image"
- model_name -
qwen-vl-plusorqwen-vl-max - seed - an integer passed to the API (treat determinism as approximate; it's a cloud sampler)
One output, text: the full formatted chat history.
Installing it
Same pack, same steps:
cd ComfyUI/custom_nodes
git clone https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API
cd ComfyUI-Qwen-VL-API
pip install -r requirements.txt
Restart ComfyUI, then put your DashScope API key in the config.json the pack creates on first launch (it ships with a "your key" placeholder). The only real dependency is dashscope.
Where people get burned
- The transcript output. If you came here expecting the latest reply, the returned string will look like a log file. Know it going in and it's fine; discover it by accident and it's confusing.
- You can't rewind. History lives in the node instance. Swap in a different image and it's appended - the old turns stay in the context. Want a clean conversation? Add a fresh node or restart.
- The
qw/folder grows. Images are saved per unique hash and never cleaned up automatically. The README says you can delete the folder manually. After a long session it's worth a sweep. - Same key problems as its sibling. Missing key, expired key, or no DashScope balance throws unhandled errors, and the code prints its failure messages in Chinese.
For a few rounds of conversational image description, this is the node to grab from the pack - it's the only one of the two that gives you actual multi-turn context, and back in 2024 that was a genuinely rare thing in ComfyUI. Just budget for the paid API and remember you're getting the transcript, not the reply.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| prompt | STRING | Describe this image | — |
| model_name | COMBO | 2 options: qwen-vl-plus, qwen-vl-max | |
| seed | INT | 00–18446744073709550000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |