Nodes/CC Llama Vision/CC Llama Vision
ComfyUI Node

CC Llama Vision

Caption anything with a local GGUF vision model — no API key, no cloud

By cicalooo·Created 2 months ago·Updated 2 months ago· 1
CC Llama Vision
  • image
  • image_batch
  • video_frames
  • advanced_options
  • caption
llama_server_pathllama-server
models_dir/root/models
model_path
mmproj_path
system_prompt
user_prompt
port8080
max_tokens2048
max_video_frames16
label_video_framestrue

The name is a lie, in the good way. "CC Llama Vision" sounds like another API wrapper you need a key and a credit card for. It's neither: this is the main node of the ComfyUI-cc_llama_vision pack, and it captions images, batches, and video frames with a vision-language model running entirely on your own machine through a local llama.cpp server. It turns a GGUF vision model (Qwen3-VL, Llama 3.2 Vision, whatever you already have) into a STRING output you can wire straight into a training pipeline or a prompt.

That's its job in the wider workflow. People reach for a VLM captioner for two things: building caption files for a LoRA training set, and seeding an img2img or image-to-video prompt from an existing frame. JoyCaption is the community default for natural-language captions, but this is the "run any GGUF VLM" route - you're not locked to one model, and you're not paying per call. If you're already deep in the llama.cpp world, this slots right in.

How it works

Under the hood it's a small server manager plus one API call. On each run the node:

  • locates llama-server (your llama.cpp binary, found on PATH by default),
  • validates the model .gguf and its matching mmproj projector file exist,
  • starts a llama-server subprocess on 127.0.0.1 bound to your chosen port - or reuses one it already tracks,
  • encodes each image as a JPEG data URL and posts it to /v1/chat/completions,
  • returns the model's text as the caption output.

The server lifecycle is handled for you: temporary servers are killed after each run, kept-alive ones persist for reuse, and an exit hook stops everything on shutdown so you don't accumulate orphaned processes holding VRAM. It binds to localhost only, launches nothing except the local server you asked for, and its Python dependencies are just numpy, requests, and pillow.

The inputs and outputs that matter

Model selection is the part to get right. Point models_dir at your folder of .gguf files, hit the 🔄 Refresh Models button, and the dropdowns repopulate. model_path lists vision-language models - mmproj files are excluded - and mmproj_path is the matching multimodal projector. The mmproj is the file people forget; without it, vision input does nothing.

The other ones you'll actually set:

  • user_prompt - the instruction sent with the image, e.g. "Describe this image in detail, including style and composition."
  • system_prompt - optional persona or output-format guidance; omitted entirely if empty.
  • max_tokens - response length, default 2048. If your model "thinks" and eats the budget, this is the first knob to raise.
  • llama_server_path - leave as llama-server to resolve from PATH; only change it if you have a specific binary.

Media goes in through the optional inputs: image (single), image_batch (each image sent separately in the same message), or video_frames with max_video_frames (default 16) evenly subsampling longer sequences and label_video_frames prefixing each frame as [Video frame N of M]. There's also an advanced_options input for the companion Advanced Options node - leave it disconnected and you get sane defaults.

The single output, caption, is a STRING. That's the whole point: feed it to SaveText for caption files, or to CLIPTextEncode's text input to caption-then-generate.

How to install it

Via ComfyUI Manager, search for "CC Llama Vision" (pack title ComfyUI-cc_llama_vision) and install. Or manually:

cd ComfyUI/custom_nodes
git clone https://github.com/doggeddalle/ComfyUI-cc_llama_vision

Then restart ComfyUI. The node itself is light, but it has two real prerequisites the README is upfront about: a working llama-server binary (on Windows, winget install llama.cpp puts it on PATH), and a GGUF vision-language model plus its matching mmproj file. Models aren't bundled - you supply those.

Common issues

The author's own error messages are the map here. The most common setup failure is llama-server not being found - the node raises a verbose error telling you exactly how to fix PATH or winget install it. mmproj is the second: a model file that resolves but a projector that doesn't, and you get a clear "file not found" message telling you to re-scan. Port 8080 already in use by a foreign process is the third - either free it or change the port.

Two subtler ones from the changelog: if a kept-alive server is running and you switch models, older versions threw "port already in use"; current versions kill and restart the old server automatically, so update if you hit that. And reasoning models (Qwen3/GLM-style) with disable_thinking on can return an empty content field when max_tokens is hit mid-thought - the node hands you the raw reasoning_content plus a hint instead of silently returning nothing.

One honest caveat, and it applies to every VLM captioner: multi-subject attribution is where these models fall down - two people in a frame and the caption will swap who's wearing what. Auto-caption your big LoRA set, but audit a small one by hand. And because this is an "LLM vision" node, the category that once shipped actual malware (the ComfyUI_LLMVISION incident), a quick skim of the single-file source before you trust it is never wasted.

Categoryllama.cpp

Inputs (14)

NameTypeDefaultDescription
llama_server_pathSTRINGllama-serverPath to the llama-server executable. Leave as 'llama-server' to resolve automatically from PATH (recommended after `winget install llama.cpp`), or provide a full path to llama-server.exe.
models_dirSTRING/root/modelsFolder to scan (recursively) for .gguf model and mmproj files. Click '🔄 Refresh Models' after changing this to repopulate the dropdowns below.
model_pathCOMBOThe GGUF vision-language model file to load (mmproj files are excluded from this list).
mmproj_pathCOMBOThe GGUF multimodal projector (mmproj) file matching the selected model — required for image/vision input.
system_promptSTRINGSystem-level instructions sent to the model before the user prompt, e.g. persona or output-format guidance.
user_promptSTRINGThe instruction/question sent to the model along with the image(s). This text is appended after any images.
portINT80801024–65535Local TCP port llama-server will listen on. Must be free unless 'keep_server_alive' is reusing an existing server on this port.
max_tokensINT204816–8192Maximum number of tokens the model may generate in its response.
max_video_framesINT161–64Maximum number of frames to sample from 'video_frames' input; frames beyond this are evenly subsampled.
label_video_framesBOOLEANtrueIf enabled, prefixes each video frame image with a text label like '[Video frame N of M]'.
imageoptIMAGEA single image to send to the model.
image_batchoptIMAGEA batch of images; each is sent as a separate image in the same message.
video_framesoptIMAGEA sequence of image frames (e.g. from a video) to sample and send to the model, subject to max_video_frames.
advanced_optionsoptLLAMA_VISION_OPTSOptional settings from a 'CC Llama Vision Advanced Options' node — sampling, performance, lifecycle, and diagnostics. If not connected, sensible defaults are used.

Outputs (1)

NameTypeDescription
captionSTRING