SenseNova SI Generate
Make your ComfyUI images talk back
- model
- image
- text
This is the node where the SenseNova-SI pack does its actual job. The loader gets the model into memory; this one points it at your images and gets text back. Wire in a picture, type a question, and the output is a plain STRING - a caption, an answer to a visual question, a description you can hand straight to a prompt-enhancer or a captioning pipeline.
That puts it squarely in the "VLM as a tool in the graph" camp, not the LLM that encodes your prompt at generation time. You chose to install this, it runs on your GPU before generation, and it costs you VRAM your sampler then can't use. It's the pattern the KB's llm-in-comfyui essay calls the heavy end of captioning: general-purpose VLMs sit above the dedicated captioners (JoyCaption, Florence-2) when you want actual reasoning about a scene, not just a description. This one is a Qwen3-VL 8B by default, which is a genuinely capable reader.
How it works
Feed it the model handle from the loader and an optional IMAGE. Under the hood it converts the ComfyUI tensor ([B, H, W, C], values 0–1) into PIL images and hands them to the upstream model. The image-token handling is where the interesting behavior lives:
- no
<image>in your question → it prepends one<image>token per input image, so "describe this" just works <image>tokens present → the count must match the number of images, or the node raises aValueError
So casual single-image use is zero-friction, and explicit multi-image prompts (like the spatial-reasoning question in the pack's example workflow) work as long as you count your tokens.
There's a second fork under the hood: Qwen models get PIL images directly, but InternVL models expect file paths, so the node writes temp PNGs for those. Same result on your end, and you don't have to think about it - unless you're wondering why an InternVL run leaves temp files behind.
Inputs that matter
question- the actual prompt. Multiline, and it's the one you'll touch every run.image- the optional IMAGE input. Leave it empty for pure text, which the model also handles.do_sampleandtemperature- the pair that controls variation. Defaults are greedy: sampling off, temperature 0. If you're captioning a dataset, that's exactly what you want, deterministic and repeatable. Flip sampling on when you want flavor.max_new_tokens- defaults to a very generous 8192 (ceiling 65536). For short captions, knock it down to a few hundred; an 8K-token cap is a lot of headroom and a long tail of wait time.extra_generation_kwargs_json- a JSON object that overrides any of the above and passes through to the model. Must decode to a valid JSON object or you get aValueError.
The one output is text, a STRING, which feeds whatever consumes text - a prompt-encode node, a caption saver, a text display.
Install and setup
Install is shared with the loader: clone GACLove/ComfyUI-SenseNova-SI into custom_nodes, clone upstream OpenSenseNova/SenseNova-SI into deps/SenseNova-SI, pip install -r requirements.txt, restart ComfyUI. The Generate node has no extra install of its own - the whole pack comes together, a nice change from packs where every node drags its own dependency tree.
Where people get burned
The <image> mismatch is the classic: type a question with one token while feeding two images (or zero), and it errors instead of guessing. Don't expect instant output either - an 8B VLM on a consumer card generates tokens at a modest clip, and a long answer is a long wait. And the standard local-model tax applies: the first run downloads the weights, and the model holds VRAM while loaded, so budget your card before running this alongside a big diffusion model in the same graph.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| model | SENSENOVA_SI_MODEL | — | |
| question | STRING | — | |
| max_new_tokens | INT | 81921–65536 | — |
| temperature | FLOAT | 0.000–5 | — |
| top_p | FLOAT | 1.000–1 | — |
| repetition_penalty | FLOAT | 1.000–5 | — |
| num_beams | INT | 11–16 | — |
| do_sample | BOOLEAN | false | — |
| extra_generation_kwargs_json | STRING | — | |
| imageopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |