Nodes/ComfyUI_AITECCAFE_Toolkit/🖼️ AITEC LLM Vision
ComfyUI Node

🖼️ AITEC LLM Vision

Feed up to four images to a local vision LLM and get a description back

By AI-TEC·Created about a year ago·Updated about a month ago· 4
🖼️ AITEC LLM Vision
  • model
  • image1
  • image2
  • image3
  • image4
  • text
  • used_model
  • status
system_promptYou are a helpful assistant.
promptDescribe the image(s) in detail.
temperature0.70
top_p0.95
max_tokens4096
remove_thinktrue
remove_chatmltrue
suppress_thinkingfalse
unload_after_runtrue
seed0

The payoff node of the pack's local-LLM half. AITEC LLM Vision takes up to four IMAGE inputs, sends them to the model loaded by AITEC LLM Vision Loader, and returns a text description - captioning, analysis, even "write a prompt for this image" style tasks, all on a local model with no API key and no per-image bill.

Mechanically it's clean: each connected image is converted to a base64 PNG and embedded inline in the user message as an image_url content block, alongside your prompt text. One model, up to four images, one reply. The default prompt is "Describe the image(s) in detail," and the system_prompt default is the stock "You are a helpful assistant."

The required inputs mirror AITEC LLM Chat - model, system_prompt, prompt, temperature (0.7), top_p (0.95), max_tokens (4096), and the three reasoning-toilet toggles: remove_think (strip <think> blocks, on), remove_chatml (keep only the first assistant block, on), and suppress_thinking (add a "don't think" instruction to the system prompt, off). If you've used the Chat node, you know these already.

Then the differences, and they're deliberate:

  • image1 through image4 are optional inputs - the node works fine with just image1, so the "up to 4" is a ceiling, not a requirement.
  • unload_after_run defaults to ON here, where the Chat node defaults to off. That's the author making the VRAM call for you: vision models are heavy, so it frees the model after each run by default. Flip it off if you're running many vision calls in a row and want to skip the reload dance.
  • seed - changing it forces re-execution (ComfyUI's cache would otherwise skip the node when nothing changed). The tooltip's honest about the caveat: same seed doesn't guarantee identical output, because llama.cpp sampling isn't that deterministic.

Outputs are three strings, same as Chat: text (the answer), used_model (which file answered), and status - where the finish_reason=length and "context may be exhausted" warnings mean raise n_ctx on the loader, not rewrite your prompt.

The wiring:

[AITEC LLM Vision Loader] → model → [AITEC LLM Vision] → text
        ↑ (mmproj matched to your model)

The one prerequisite is the one that bites everyone: the vision loader must be able to construct a chat handler, which requires a vision-capable llama-cpp-python - i.e. the JamePeng fork, not the stock wheel. If the loader errors on chat handlers, no amount of tweaking here helps; fix the environment first.

Install is the pack-wide path (clone, pip install -r requirements.txt, restart) plus that manual llama-cpp-python install. And the README's VRAM warning applies double here: base model + mmproj + generation models can exceed a consumer card. That's why unload_after_run defaults on, and why the pack suggests running vision in its own pass. For a no-key, on-prem image captioner inside ComfyUI, this is a genuinely useful node - just respect the memory budget.

CategoryAITEC/LocalLLM

Inputs (15)

NameTypeDefaultDescription
modelLLM_MODEL
system_promptSTRINGYou are a helpful assistant.
promptSTRINGDescribe the image(s) in detail.
temperatureFLOAT0.700–2
top_pFLOAT0.950–1
max_tokensINT409664–32768Thinking model with 4096 or more is recommended
remove_thinkBOOLEANtrueRemove the <think>...</think> block (Qwen3, Gemma4, etc.)
remove_chatmlBOOLEANtrueRemove repetitions of <|im_start|>assistant~<|im_end|> and return only the first response (Gemma4, etc.)
suppress_thinkingBOOLEANfalseWhen enabled, adds an inference suppression instruction to the system prompt (for Thinking models such as Qwen3 and Gemma4)
unload_after_runBOOLEANtrueUnload the model after execution to free up VRAM. You will need to reload it when you run it again.
seedINT00–18446744073709550000Changing the value each time the code runs bypasses the cache and forces a re-execution.
image1optIMAGE
image2optIMAGE
image3optIMAGE
image4optIMAGE

Outputs (3)

NameTypeDescription
textSTRING
used_modelSTRING
statusSTRING