BAGEL Image Understanding (Deprecated)
Ask your images questions — this is the BAGEL node that won't melt your GPU
- model
- image
- text
Of all the nodes in ComfyUI-BAGEL, this is the one that surprises people most, because it doesn't generate anything. BAGEL is ByteDance's open multimodal model - one transformer (7B active parameters in a 14B Mixture-of-Transformer-Experts hybrid, Apache 2.0) that both reads and draws. The understanding node uses the reading half: you hand it an image, ask a question, and it answers in plain text. It's the cheapest node in the pack to run, and it's genuinely useful for things like checking what your generated images actually contain, captioning, or sanity-checking whether that character consistency experiment worked.
How it works
The image is passed through BAGEL's vision encoder (SigLIP-based), tokenized alongside your question, and the language side of the model produces an answer token by token. Because it's the same 7B-active backbone that does image generation, the model already has deep visual understanding built in - ByteDance benchmarks it against top VLMs like Qwen2.5-VL and InternVL-2.5, and it holds its own. There's no diffusion involved here at all, which is why this node is comparatively quick and light: no denoising loop, just autoregressive text.
The output is a single text string. There's no image output, so wire it into a text display node (or any node that takes a STRING) - that's what you'll actually read.
The inputs that matter
Required:
image- theIMAGEtensor you want to interrogate, from any Load Image.prompt- the question. The default is the classic "What do you see in this image?", and it's a genuinely good default. Ask for specifics: "Read the text on this sign," "How many people are in this picture?", "Describe the lighting." The model reads full sentences, so write them like a person.
Optional, and all text-generation settings rather than image ones:
show_thinking- display the reasoning process. BAGEL is trained to think in<think>...</think>blocks before answering, and this surfaces them.do_sample- sampling on/off. Default off, meaning greedy decoding - the most deterministic answer. Flip it on when you want variety in creative/interpretive answers.text_temperature- randomness for the answer text, default 0.3. Only matters whendo_sampleis on.max_new_tokens- maximum answer length, default 512 (range 64–4096). If it's cutting off mid-sentence, raise this.
Installing and running it
Same routine as every BAGEL node - install the pack once:
cd ComfyUI/custom_nodes
git clone https://github.com/neverbiasu/ComfyUI-BAGEL
cd ComfyUI-BAGEL && pip install -r requirements.txt
or hit "ComfyUI-BAGEL" in ComfyUI Manager, then restart. Feed the model input from the BAGEL Model Loader. Since this node skips diffusion, you can often get away with less VRAM headroom than the generation nodes - the model load itself is the cost, not the inference. If you're on a single 24GB card, the pre-quantized DFloat11 variant or NF4 mode is still the comfortable choice.
Common gotchas
The environment issues are the same pack-wide ones: NameError: 'Qwen2Config' is not defined points at missing flash-attention/triton (prebuilt wheels are linked in the pack's issue tracker), and NF4/INT8 quantization needs bitsandbytes installed. For the node itself, the two practical traps are forgetting that text_temperature does nothing unless do_sample is on, and expecting deterministic answers when sampling is on - with greedy decoding you get stable, repeatable output; with sampling you get interpretation, which is great for captions and bad for counting objects reliably. If you get an "Error: ..." string in the text output, it's the node catching an exception and passing it through as text - check the console for the real stack trace.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model | BAGEL_MODEL | BAGEL model | |
| image | IMAGE | Input image | |
| prompt | STRING | What do you see in this image? | Question text |
| show_thinkingopt | BOOLEAN | false | Display reasoning process |
| do_sampleopt | BOOLEAN | false | Enable sampling |
| text_temperatureopt | FLOAT | 0.300–1 | Text generation temperature |
| max_new_tokensopt | INT | 51264–4096 | Maximum new tokens |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |