Auto Model Downloader
Make the workflow bring its own models
Every shared workflow dies the same death: you load it, and it wants a VAE and two models you don't have. The KB's most-quoted complaint on this is a post titled "Feels like I am downloading models and installing missing nodes 90% of the time" (+103). This node's answer is to put the download list inside the workflow.
What it is
A node with one line per model: a URL, a folder under ComfyUI/models, and two switches for whether that file needs a Hugging Face or Civitai token. Add line appends one, Remove last line drops the last, and two boxes at the top take the tokens.
It's an output node with no outputs, which is the important design choice: it doesn't feed anything, so it exists purely to run. Queue the workflow and missing files get fetched before the graph finishes.
| Field | Example | What it means |
|---|---|---|
| URL | https://huggingface.co/owner/repo/resolve/main/model.safetensors | Direct download URL, huggingface.co or civitai.com only |
| directory | diffusion_models, loras, vae, sam3/nested | Under models/; created if missing. Write dir/name.safetensors to rename the file on the way in |
| HF / Civitai token needed | checkboxes | Marks a gated HF repo or a Civitai download |
Under the hood those lines serialise into the node's single entries input, a JSON string. You don't edit it by hand - the frontend writes it - but it's what travels in the workflow, which is the point.
How it works
Three ways it can fetch, and they cover different situations:
- First open. If a workflow with this node has missing models, one dialog lists them with
Download/Not now. Files needing a token are tagged and the token boxes are shown against the files that need them; a download won't start while a token is missing. The answer is remembered on the server, keyed by the model list, so it's asked once per list on any browser and any URL - and never asked at all when everything's present. - From the node. The button reads
Download all models,Download missing models (n), orAll models downloaded. The status row names what's missing, or which token is still needed. - On queue. This is the one that matters for headless work: run the workflow from the UI or through the API with no browser at all, and the node downloads what's missing before finishing, failing with a clear message if a required token isn't stored.
Downloads stream to name.part and get renamed when complete, so an interrupted transfer resumes rather than starting over. The HF token goes out as a bearer header; the Civitai token is appended to the URL.
The bit that will annoy you, and the bit that protects you
Only Hugging Face and Civitai URLs are accepted. That's a deliberate restriction - a workflow carries its URLs, so a node that fetches from any host is a node that turns a downloaded workflow into arbitrary network access. The same reasoning confines the target path: the file has to land under models/, the name has to end in a model extension (.safetensors, .ckpt, .gguf, .pt, .bin and friends), and Hugging Face blob/ links get rewritten to resolve/ for you. If you maintain your own mirror, this node won't use it.
Tokens live on the server, never in the workflow. They're saved to user/BCNodes/downloader_tokens.json with mode 600, never written into a graph, never shown again after you enter them - the box just reads (saved). An empty value clears it. That's the right design, and it also means the token belongs to the install, not to the workflow: paste it once on each machine you run the graph on.
Installing it
ComfyUI Manager → search ComfyUI-BCNodes → install → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/0xBeycan/ComfyUI-BCNodes
pip install -r ComfyUI-BCNodes/requirements.txt
Reload the browser tab after restarting; the download dialog and status row are frontend work. It registers under BCNodes/loaders. No extra dependencies - it uses the server and aiohttp that ComfyUI already runs on.
Where people get burned
The file name comes from the URL. Civitai-style links often don't have one, and then there's nothing to name the file. Write dir/name.safetensors in the directory field for those and stop guessing.
Refresh your loaders after a download. ComfyUI builds a loader's dropdown from the folder listing, and a fresh file won't appear until the node definitions refresh - depend on the refresh button rather than on faith.
Sharing the workflow shares the list. If you use this a lot and also publish workflows, be aware that everyone loading your graph is now fetching from those two hosts, with your URLs, on your node's behalf. Tokens stay yours; the URLs don't.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| entries | STRING | [] | — |
Outputs (0)
No outputs