EcoHash Video Generate
EcoHash Video Generate Is Text-Only, and the Model List Doesn't Advertise That
- video
- job_id
EcoHash Video Generate is the public-API twin of the pack's dedicated video node. No connection to configure, no model ID to type - you pick from a dropdown, write a prompt, and it submits an asynchronous job to EcoHash's own gateway, waits, downloads the MP4, and hands you a VIDEO output to wire into Save Video.
It is the simplest node in the pack to get running and the one with the most misleading dropdown. Start there.
Read the model list carefully
The catalogue snapshot in the pack offers three models: ecolink-video-gen-2.0, wan22-t2v-a14b, and wan22-s2v-14b. Two of those are Alibaba Wan 2.2 variants, which is a sensible thing for a hosted service to serve - Wan 2.2 is the last open Wan that will ever exist, since 2.5, 2.6 and 2.7 shipped weights-free behind an API. Putting the frozen open base behind a pay-per-call gateway is exactly the business a GPU cloud would be in.
Except. wan22-s2v-14b is Wan 2.2's speech-to-video model - the audio-driven one that takes a clip of someone talking and makes the face move. It needs a driving audio signal. This node accepts model, prompt, duration, aspect_ratio, resolution and generate_audio, and nothing else: no audio input, no image input, no reference video. The pack's docs state these nodes support text-to-video only, and that models requiring image, first/last frame, audio or video references need "a separate reference-input adapter."
So selecting the s2v entry is a mismatch, not a shortcut to a talking head. For text-to-video, pick wan22-t2v-a14b or the EcoLink model and don't get clever. It's the general lesson with this pack: the dropdown shows what the catalogue knows about, not what the node can drive. Capability hints appear in selector tooltips when the service supplies them; unknown private-model capabilities stay unspecified - a polite way of saying "unverified."
What it actually sends
POST /video/generations with model, prompt, duration, aspect_ratio, resolution and generate_audio, then polling on /video/jobs/{id} until the job resolves, then a download into ComfyUI's temp directory. The pack keeps the wire format internal on purpose: there's no protocol selector, and no native-parameter exposure. You get duration, ratio and resolution - the service owns steps, frame rate, seed and whatever provider adaptation the model needs.
generate_audio is the one thing the public node has that the dedicated one doesn't: a real boolean to request audio when the gateway model supports it. Default is on. If you're scoring the clip yourself later, turn it off so you're not paying for a track you'll mute.
resolution offers 480p, 720p, 768p, 1080p, 4k - and no custom, unlike the dedicated variant. Those bands come from the gateway's video pricing endpoint, which means they're priced resolutions, not a compatibility table. A model that only does 720p will still let you select 4k and then reject the request. Same for aspect_ratio: six common ratios, none of them a promise.
duration is whole seconds, and the allowed range in the node is absurdly wide (up to 86400) because the real limit lives in model metadata. Ask for a length your model doesn't do and you get a rejection, not a trim.
wait_timeout defaults to 1800 and is separate from the connection timeout - it's the total you'll wait for completion, not the cap on any single HTTP request.
The output people forget
Two outputs: video and job_id. The normal wiring is video → Save Video.video, and Save Video is what actually writes the file permanently and plays it back with its audio track. The node itself only drops an MP4 in ComfyUI's temp directory.
job_id is optional and unconnected in most workflows, which is a shame - it's the handle you need to resume polling and download after a timeout or an interrupted run, by pasting it into the job_id input and leaving everything else alone. Connect it to Preview as Text or Save Text if you want it recorded. Do not wire it back into its own input; that's a cycle.
Install
Manager → search EcoHash → install → restart → refresh the browser. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/ecohash-ai/ComfyUI-EcoHash.git
cd ComfyUI-EcoHash
pip install -r requirements.txt
requests is the entire dependency list - no weights, ever, for these nodes. You do need a current ComfyUI with native VIDEO support, or Save Video won't exist to connect to. Windows Portable: install with .\python_embeded\python.exe -m pip install -r .\ComfyUI\custom_nodes\ComfyUI-EcoHash\requirements.txt.
Set the key once in the sidebar EcoHash → Connections panel - there is no key field on the node by design, so a shared workflow can't leak it - or export ECOHASH_API_KEY for the server process.
Honest placement
Video is where per-call pricing hurts most, and it's where the "just do it locally" objection is loudest but weakest: a Wan 2.2 render on your own card is a twenty-minute wait and a fan curve, and a hosted call is a minute and some credit. That's a genuinely defensible trade in a way that cloud image generation often isn't.
What's not defensible is the security shrug. This is a vendor client for a vendor API with no community footprint I can find, holding a credential and calling out to the network by design - the exact shape that got ComfyUI_LLMVISION prosecuted. The source is short and the key handling is actually careful (git-ignored connections.json, nothing in the workflow JSON). Read it once anyway. Ten minutes, cheaper than the alternative.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | 3 options: ecolink-video-gen-2.0, wan22-t2v-a14b, wan22-s2v-14b | |
| prompt | STRING | — | |
| duration | INT | 41–86400 | Requested seconds; model limits come from the service, not the model name. |
| aspect_ratio | COMBO | 16:9 | 6 options: 16:9, 9:16, 1:1, 4:3, 3:4, 21:9 |
| resolution | COMBO | 720p | Common size presets, not a guarantee of model support. Hover over the model selector for capabilities or use a supported custom size. |
| generate_audio | BOOLEAN | true | Request audio when supported by the gateway model. |
| job_idopt | STRING | Leave blank to generate. Paste an existing job ID to resume polling/download without a new generation. Keep its original connection. | |
| wait_timeoutopt | INT | 180010–14400 | Total wait for video completion in seconds; separate from the connection's per-request timeout. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| job_id | STRING | — |