EcoHash Dedicated VLM Describe
Turn a Picture Back Into a Prompt
- image
- STRING
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.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model | STRING | Exact model ID served by your dedicated endpoint; it need not appear in the public EcoHash catalog. | |
| prompt | STRING | Describe this image in detail for use as an image-generation prompt. | — |
| max_tokens | INT | 5121–8192 | — |
| connectionopt | COMBO | 1 options: |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |