Nodes/ComfyUI-Captionator-Qwen35/Image Captionator Qwen 3.5
ComfyUI Node

Image Captionator Qwen 3.5

Turn any image into a real prompt with a local Qwen 3.5 vision model

By ArtemKo7v·Created 5 months ago·Updated 15 days ago· 2
Image Captionator Qwen 3.5
  • image
  • caption
  • full_output
model
promptWrite a clear and detailed description of the given image in one concise paragraph (maximum 200 words). Focus on key visual elements such as main subjects, their appearance, positions, actions, environment, lighting, colors, mood, and any notable details. Avoid speculation or assumptions beyond what is visible. Use precise, descriptive language while keeping the text compact and well-structured.
resize_to0
max_new_tokens256
seed0
thinkfalse

The name is a lie in the best way: Image Captionator Qwen 3.5 calls no API and needs no key. It runs a real Qwen 3.5 vision-language model on your own GPU and turns whatever image you feed it into a full sentence of natural language - the kind of prompt that 2026's LLM-encoded models (Flux, Z-Image, Qwen-Image) actually want, instead of the generic one-liner you'd type yourself.

Why would you want that? Two big reasons, and they're different jobs. First, dataset captioning: if you're building training data for a LoRA, captioning is still one of the highest-leverage things you do, and for LLM-encoder models the answer is natural-language descriptions, not tag soup. Second, the image-to-prompt round trip: drop in an image you like, get a prompt back, wire it into your text encoder and generate variations.

How it works

The node scans models/text_encoders, models/llm, and models/LLM for any .safetensors file with "qwen" and "3" in its path, then loads the matching Hugging Face model directory through transformers - AutoModelForImageTextToText, with fallbacks for older loader names. On CUDA it loads in fp16 with automatic device mapping, plus a 4-bit bitsandbytes NF4 quantization with CPU offload to squeeze the 9B onto modest cards. The model gets cached after the first load, so the first run is the slow one.

Your prompt and image are wrapped in the model's chat template and generated with temperature 0.7, top_p 0.95, and the seed you set. If you haven't got a model locally, the dropdown itself offers one-click downloads of Qwen 3.5 2B, 4B, or 9B into models/llm - pick one, let it pull a few gigabytes, and it just works.

The inputs that matter

  • model - dropdown of discovered Qwen 3.5 models, or the [Download] options. The 2B is fine for captions; the 9B is noticeably smarter but heavier. Start with 4B.
  • prompt - the instruction you send alongside the image. The default is a genuinely good "describe this in one paragraph, don't speculate" prompt; you'll mostly leave it alone.
  • resize_to - longest side in pixels before inference, rounded to multiples of 32. 0 (the default) means no resize. Big images plus a big model is how you run out of VRAM.
  • max_new_tokens - cap on generated tokens; 256 is plenty for a caption.
  • think - toggles the model's thinking mode. When it's on and the model emits </think>, that reasoning is stripped out of the caption output.
  • image (optional) - leave it disconnected and the node does pure text generation from prompt alone.

Outputs

  • caption - the final description, with any thinking block trimmed off.
  • full_output - the raw model output, thinking and all. Wire caption into your CLIP Text Encode or Z-Image text prompt node; keep full_output around when you want to see what the model was reasoning about.

Installing it

The easy way is ComfyUI Manager - search "Captionator Qwen35" and install. Otherwise:

cd ComfyUI/custom_nodes
git clone https://github.com/ArtemKo7v/ComfyUI-Captionator-Qwen35
pip install -r requirements.txt

Then restart ComfyUI. The heavy lifting is in the dependencies, not the install: transformers>=5.2.0, accelerate, and bitsandbytes. Those are the packages most likely to conflict with something else in your environment - welcome to custom-node dependency hell, the ecosystem's most consistent complaint. Give it its own Python env if you have the option, and don't be surprised if another node breaks after a pip update. The model files themselves are the other download: 2B through 9B, all from Hugging Face, several gigabytes.

Where people get burned

  • A standalone .safetensors file won't load. Transformers needs the whole model directory - config.json, tokenizer files, and a processor for image input. The README is explicit about this and it's the most common failure.
  • Text-only generation can work without a processor, but image input can't. If you see a processor error, you've likely pointed it at an LLM checkpoint rather than a multimodal one.
  • Big images plus high max_new_tokens equals VRAM pressure; that's what resize_to and the 4-bit quant are for.
  • The think toggle silently falls back if your installed processor doesn't support it, so don't panic if nothing visibly changes.
  • Nice touch: when inference fails, the node returns an error string in its outputs instead of throwing, so your workflow keeps running with a readable message.

For a brand-new pack (zero tracked impressions as of this writing) it's a surprisingly polished little node. If you already run Qwen-Image or Z-Image, you're used to Alibaba's open-weight generosity; this just extends it to the captioning side of the loop.

CategoryCaptionator

Inputs (7)

NameTypeDefaultDescription
modelCOMBO3 options: [Download] Qwen 3.5 2B, [Download] Qwen 3.5 4B, [Download] Qwen 3.5 9B
promptSTRINGWrite a clear and detailed description of the given image in one concise paragraph (maximum 200 words). Focus on key visual elements such as main subjects, their appearance, positions, actions, environment, lighting, colors, mood, and any notable details. Avoid speculation or assumptions beyond what is visible. Use precise, descriptive language while keeping the text compact and well-structured.
resize_toINT00–4096
max_new_tokensINT2561–8192
seedINT00–9223372036854776000
thinkBOOLEANfalse
imageoptIMAGE

Outputs (2)

NameTypeDescription
captionSTRING
full_outputSTRING