🖼️ Pic Describer
Ask a local vision model what's in your image — no API key, no cloud
- image
- description
So you've got an image you generated, or one you found, and you want the recipe back. That's the whole point of 🖼️ Pic Describer: you feed it an image and a local vision model writes a natural-language description you can drop straight back into a prompt. It's your img2img rerun buddy, your ControlNet re-prompt, your "what did I actually generate here" answer. And the name isn't lying - it calls no cloud API and needs no key. It talks to Ollama, which is running on your own machine.
This is the node I'd reach for when I want a caption as a prompt, not a clinical label. "A woman stands against a white wall" is the useful level of detail, and that's what it gives you.
How it works
The node is a thin wrapper around Ollama's /api/generate endpoint. It takes your image tensor, converts it to a PNG in memory, base64-encodes it, and posts it along with your instruction to http://localhost:11434/api/generate. The model is loaded, it describes what it sees, and the text comes back as a STRING.
Under the hood it sends keep_alive: "0s", which means Ollama unloads the model right after the call instead of keeping it warm. That's actually nice for your VRAM budget - the vision model gets out of the way before your KSampler needs the memory - but it also means every single run pays a cold-start load. First description is slow; the rest are less slow but never instant.
The inputs that matter
- image - the
IMAGEyou want described, usually straight fromLoad Image. Only the first frame of a batch is used. - model - a dropdown with
llava:latest,llama3.2-vision:latest,ministral-3:latest,qwen3-vl:2b, andgemma3:latest. Here's the trap: the default is ministral-3, which is a text-only model. Point it at an image and Ollama errors out. If it's your first run, switch tollava:latestorqwen3-vl:2bbefore you hit go, andollama pullthat model first. - style -
neutral,creative,sfw, ornsfw. This isn't decoration; it rewrites the instruction entirely. Neutral gets a precise object/action/setting read, creative tells it to write like a text-to-image prompt, and nsfw is the unapologetic "include visible body parts" mode. All wrapped around your own prompt. - prompt - your extra instruction, default
describe the image. This is where you steer it: "describe the lighting", "focus on the clothing", "describe as a prompt for SDXL". - cleanup_output - default on. It strips
<think>reasoning blocks (DeepSeek-style models spew those) and the "The left image / The right image" lines that vision models hallucinate when comparing image pairs. Leave it on.
Output: a single description string. Wire it into a ShowText|pysssss node to read it, or feed it into a text node that goes to your CLIPTextEncode for an img2img rerun.
Installing it
Everything in this pack installs the same way. ComfyUI Manager: search OllamaTools and hit install. Or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/max-dingsda/OllamaTools.git
Restart ComfyUI. The only real dependencies are requests and Pillow, which are almost certainly already in your ComfyUI environment. Then install and start Ollama itself, and pull a vision model:
ollama pull llava:latest
That's it. No key, no account, no config file.
Where people get burned
The #1 cause of a blank or broken result is Ollama simply not running - the node returns an [ERROR contacting Ollama: ...] string in place of the description. On Windows that means the Ollama tray app has to be up; on Linux, ollama serve. Second: a model that isn't pulled yet. Third: forgetting the text-only default model can't see images. The dropdown list is hardcoded, too - if you pulled a vision model that isn't in the list, you can't select it from this node, which is a real limitation for a pack that's otherwise this simple.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | The image you want the LLM to describe. Usually from 'Load Image'. | |
| model | COMBO | ministral-3:latest | Multimodal LLM used for describing the image. |
| style | COMBO | neutral | Choose how the image should be interpreted: factually, creatively, or filtered for SFW/NSFW. |
| prompt | STRING | describe the image | Additional instruction or focus for the image description. Used alongside style. |
| cleanup_output | BOOLEAN | true | Remove hallucinations and verbose reasoning from the LLM output. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| description | STRING | — |