CC Llama Vision
Caption anything with a local GGUF vision model — no API key, no cloud
- image
- image_batch
- video_frames
- advanced_options
- caption
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
.ggufand its matchingmmprojprojector file exist, - starts a llama-server subprocess on
127.0.0.1bound 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
captionoutput.
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 asllama-serverto 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.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| llama_server_path | STRING | llama-server | Path 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_dir | STRING | /root/models | Folder to scan (recursively) for .gguf model and mmproj files. Click '🔄 Refresh Models' after changing this to repopulate the dropdowns below. |
| model_path | COMBO | The GGUF vision-language model file to load (mmproj files are excluded from this list). | |
| mmproj_path | COMBO | The GGUF multimodal projector (mmproj) file matching the selected model — required for image/vision input. | |
| system_prompt | STRING | System-level instructions sent to the model before the user prompt, e.g. persona or output-format guidance. | |
| user_prompt | STRING | The instruction/question sent to the model along with the image(s). This text is appended after any images. | |
| port | INT | 80801024–65535 | Local TCP port llama-server will listen on. Must be free unless 'keep_server_alive' is reusing an existing server on this port. |
| max_tokens | INT | 204816–8192 | Maximum number of tokens the model may generate in its response. |
| max_video_frames | INT | 161–64 | Maximum number of frames to sample from 'video_frames' input; frames beyond this are evenly subsampled. |
| label_video_frames | BOOLEAN | true | If enabled, prefixes each video frame image with a text label like '[Video frame N of M]'. |
| imageopt | IMAGE | A single image to send to the model. | |
| image_batchopt | IMAGE | A batch of images; each is sent as a separate image in the same message. | |
| video_framesopt | IMAGE | A sequence of image frames (e.g. from a video) to sample and send to the model, subject to max_video_frames. | |
| advanced_optionsopt | LLAMA_VISION_OPTS | Optional settings from a 'CC Llama Vision Advanced Options' node — sampling, performance, lifecycle, and diagnostics. If not connected, sensible defaults are used. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| caption | STRING | — |