Nodes/EcoHash/EcoHash Dedicated VLM Describe
ComfyUI Node

EcoHash Dedicated VLM Describe

Turn a Picture Back Into a Prompt

By ecohash-ai·Created 3 months ago·Updated 24 days ago· 1
EcoHash Dedicated VLM Describe
  • image
  • STRING
◄model►
◄promptDescribe this image in detail for use as an image-generation prompt.►
◄max_tokens512►
◄connection►

Every image you like but didn't prompt is a latent prompt. You can sit there reverse-engineering what "cinematic, golden hour, 35mm" the model actually responded to, or you can hand the picture to a vision-language model and ask it to write the thing down. EcoHash Dedicated VLM Describe is the second option, as a single node: IMAGE in, STRING out, and that string is a description you can feed straight into a generation node.

The pack ships a describe_and_regenerate.json example built on exactly this loop, and it's the honest demo of what the node is for: describe an existing image, take the text, generate a variation. Same trick seeds an img2img pass, writes alt text, or generates a starting point when you're staring at an empty prompt box.

Why a hosted VLM instead of a local captioner

The local default for natural-language captioning is well established - JoyCaption for richness, Florence-2 for speed to the point of being instant. Both are free after download, both run on a modest card, and neither sends your images anywhere. If your use case is captioning a LoRA dataset, a local captioner is almost always the right call, and the KB's captioning advice still says audit small sets by hand because every VLM mangles who-is-wearing-what when there are two people in frame.

So when is this node actually the better tool? When the description needs to be prose that reads like a prompt rather than a faithful caption, when you want a bigger model than you can load, or when the image-workflow is already living on the far side of an endpoint. It's the same trade as the rest of the pack: quality you don't host, per-call, data leaves the machine.

How the request is built

The image tensor becomes a PNG, base64, and rides along as an image_url content part in a chat/completions call next to your text prompt. Non-streaming. The response is read from choices[0].message.content and returned as one STRING, with an empty answer treated as an error rather than passed downstream as a blank prompt.

Nothing exotic, and that's the point - if your endpoint serves any OpenAI-compatible chat route with a vision model behind it, this works. If it serves a text-only model, you get a confusing failure; a model that can't see doesn't fail loudly, it invents.

The inputs

image takes one image. Convert a batch upstream if you have one - the pack is explicit that image-input nodes handle size one and don't silently drop the rest.

model is the exact deployed model ID, free text. It must be a vision model. This is the input that quietly breaks runs when people point it at the text deployment they used for prompt enhancement.

prompt is not the image prompt - it's your instruction to the describer, and it comes pre-filled with "Describe this image in detail for use as an image-generation prompt." Which is a good default and worth editing anyway. Ask for what you want back: a comma-separated tag list, a paragraph of prose, only the lighting and composition, or a physical description of the subject. Small changes in this field do more for output quality than anything else on the node.

max_tokens defaults to 512, range 1–8192. Descriptions that cut off mid-sentence are usually this, not the model. 512 is enough for a paragraph; bump it if you asked for a long one.

connection picks the saved endpoint - required in practice, since the node validates it and stops with "Select a dedicated connection" if it's empty.

Output is STRING, so: into a Save Text node if you're collecting captions, into the prompt of a generation node if you're re-rolling, or into a primitive if you want to eyeball it and edit.

Install

Manager → search EcoHash → install → restart ComfyUI → refresh the browser. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/ecohash-ai/ComfyUI-EcoHash.git
cd ComfyUI-EcoHash
pip install -r requirements.txt

requests and nothing else. No weights, no GPU requirements for this node itself. Windows Portable: install with .\python_embeded\python.exe so the package lands where ComfyUI looks.

Credentials are server-side by design. Sidebar EcoHash → Connections → save the key → Add connection (name + full API URL, prefix included; /v1 is not appended for you). Non-EcoHash hosts need their own key and never inherit the global one.

The failures worth knowing

"Inference API returned no completion." Usually a text-only model behind the ID, or max_tokens eaten by a reasoning model's internal deliberation. Raise the budget, or pick a model that isn't a reasoner.

Descriptions that read like a caption, not a prompt. That's the field you're asking with. "Describe this image as a Midjourney prompt with camera, lens and lighting terms" gets you a different animal than the default.

The same description on every run. ComfyUI cached the node - change the prompt or the image and it will actually call out again.

Big images, big requests. The PNG goes inline as base64. A 6K plate is a lot of payload for a chat request, and some endpoints will simply refuse it; downsizing before the describe node is cheap insurance.

CategoryEcoHash/DedicatedModels

Inputs (5)

NameTypeDefaultDescription
imageIMAGE—
modelSTRINGExact model ID served by your dedicated endpoint; it need not appear in the public EcoHash catalog.
promptSTRINGDescribe this image in detail for use as an image-generation prompt.—
max_tokensINT5121–8192—
connectionoptCOMBO1 options:

Outputs (1)

NameTypeDescription
STRINGSTRING—