EcoHash Dedicated Image Edit
Say What Should Change, Not Where to Paint
- image
- IMAGE
If you've ever built a mask, a ControlNet and an IP-Adapter just to change the colour of a jacket, this node is the shortcut. EcoHash Dedicated Image Edit takes one image and one sentence, and gives you the image back with the change applied. No mask, no denoise strength, no second pass.
The catch is in the name: it doesn't run a model. It's an HTTP client wearing a ComfyUI node's clothes, pointed at an inference deployment you configure once, outside the workflow. The pack (EcoHash, by ecohash-ai) has seven of these "dedicated" nodes covering image, LLM, vision, video, TTS and STT, and they all share the same connection setup, so what you learn here applies to the rest of the group.
Why instruction editing replaced the mask chain
This is the shift that ate a whole category of node graphs. Qwen-Image-Edit is the open flagship - hand it a picture and a sentence and object removal, garment swaps, relighting and camera-angle changes happen without a control map - and Flux Kontext proved the same trick on the closed side. The mask still comes back out for chains of edits, because these models re-emit the whole frame and pixels nobody asked about drift, but as a first move, "describe the change" beat "paint where it goes" for most jobs.
What actually happens on a run
The node converts your IMAGE tensor to PNG bytes, then posts a multipart form to your endpoint's /images/edits with model, prompt, size and the PNG attached. It reads the first result back as either inline base64 or a downloadable URL, and hands you a single IMAGE.
Two details worth knowing because they explain the weird output you'll eventually get. When size is auto (the default), the node reads the source tensor's dimensions and sends them explicitly - the upstream API would otherwise fall back to 1024×1024, which would quietly rescale your edit. Even so, auto is described by the author as "send the source image dimensions (the service may round them)": the server is allowed to align to its own multiple. Re-editing something that comes back a few pixels off is normal, not a bug you can fix from the canvas.
The inputs you'll touch
image takes one image. Not a batch - the pack's own docs say image-input nodes accept a batch size of one and you should split larger batches upstream.
model is a free-text string, not a dropdown, and that's deliberate: it's the exact model ID your endpoint serves, and it doesn't have to exist in EcoHash's public catalogue. Copy it from the deployment, don't guess a friendly name.
prompt is the instruction. "Make it night time, keep the pose" works better than a paragraph of style adjectives, for the same reason it does on any editor.
size defaults to auto. The presets (1024x1024, 768x1024, 1536x864 and friends) are conveniences, not promises - availability in the node doesn't establish that your model supports them. Pick custom and the optional width/height appear, both constrained to multiples of 16 between 64 and 8192.
connection picks one saved endpoint from the sidebar. It's the only way in: leave it on the empty value and validation stops the run with "Select a dedicated connection".
Install, and the part that isn't pip
ComfyUI Manager, search EcoHash or comfyui-ecohash, install, restart, refresh the browser. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/ecohash-ai/ComfyUI-EcoHash.git
cd ComfyUI-EcoHash
pip install -r requirements.txt
That requirements file is one line: requests. No torch surgery, no weight downloads - genuinely the easiest install in this article. On Windows Portable, use the embedded interpreter:
.\python_embeded\python.exe -m pip install -r .\ComfyUI\custom_nodes\ComfyUI-EcoHash\requirements.txt
Then the real configuration, which is server-side. There is no API key field on any node, on purpose: a key typed into a widget lands in the workflow JSON in plain text, and workflows get screenshotted and shared. Instead open the EcoHash cloud tab in the sidebar → Connections, paste your key once, Save and verify. For a dedicated endpoint, Add connection, give it a name and the API URL, then Save and connect. The URL must include its API prefix - /v1 is not appended for you. For an EcoHash instance that looks like:
https://api.ecohash.com/inference-instances/INSTANCE_ID/proxy/v1
Alternatively set ECOHASH_API_KEY and ECOHASH_DEDICATED_BASE_URL in the environment of the ComfyUI server process, or use config.ini. Either way, the node itself stays clean.
Where people get burned
"It says select a dedicated connection, but I saved one." The connection widget stores an internal ID. Import someone else's workflow and the ID doesn't exist on your server, so you reselect. Renaming a connection is safe, deleting and re-adding it is not.
404 on every run. Usually the model ID or the missing API prefix. Gateway and instance-proxy IDs can differ, which is the single most confusing thing about self-hosted inference endpoints.
402. Your account credit, not your code. 401 means the key - and check whether an environment variable is overriding the saved one, since env wins.
Nothing ran and you got the same result. ComfyUI caches node output. Change the prompt or any input to force a fresh call.
You wanted masked inpainting. There's no mask input and there won't be a way to add one here. This is whole-frame instruction editing; for a masked, local, surgical pass, a local editor with a VAE encode is still the right tool.
One last thing on trust: this is a vendor pack that ships the client for its own API, and it has essentially no footprint in the community discussion I can find - which is not a red flag by itself, but it means nobody else has stress-tested it for you. Read the source before you wire in a key. It's short.
Inputs (7)
| 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 | — | |
| size | COMBO | auto | auto = send the source image dimensions (the service may round them) |
| widthopt | INT | 102464–8192 | Used only when size = custom. Check the selected model's supported dimensions. |
| heightopt | INT | 102464–8192 | Used only when size = custom. Check the selected model's supported dimensions. |
| connectionopt | COMBO | 1 options: |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |