Workflow Doctor (missing nodes & models)
Your Downloaded Workflow Is a Wall of Red Nodes — Get the Shopping List First
- report
Somebody posts a workflow, you load it, and half the canvas is red. You get a scroll of "node type not found" and a run that dies on a checkpoint file you don't have. This is the ecosystem's oldest joke - the top complaint threads are literally titled things like "Feels like I am downloading models and installing missing nodes 90% of the time." Workflow Doctor does one narrow, useful thing about it: it reads a workflow and tells you exactly what your install is missing, before you try to run it.
What it actually does
Two halves. It lists every node class in the workflow that your ComfyUI cannot execute, and every model file the workflow references that isn't on your disk. The model half is the part people don't already have a tool for. ComfyUI-Manager will read a loaded graph and install missing custom nodes for you - same pain point, and Manager is why the problem is survivable at all. Workflow Doctor doesn't install anything and doesn't map a node type to a repository: the README says guessing repos produces wrong answers, so it hands you the class name to search instead.
What you get is a report with class names, occurrence counts, and - for models - the bare filename plus ready-made HuggingFace and CivitAI search links. It also works on a file you haven't opened yet, which is the real reason to keep it: check workflow.json before you drag it onto the canvas and you know what you're signing up for.
How the detection works
The engine is core.py, plain Python with no ComfyUI imports - the caller injects your local environment, which is why the same code backs the node, the web panel, and a CLI.
Parsing accepts both common shapes: the UI export (nodes[] with type and widgets_values) and the API/prompt format ({"12": {"class_type": "...", "inputs": {...}}}). Node classes are diffed against ComfyUI's NODE_CLASS_MAPPINGS - everything the server can currently execute. Model files are found by string-sniffing widget values and inputs for filenames ending in .safetensors, .ckpt, .sft, .pt, .pth, .bin, .gguf, .onnx or .pkl, then diffing against folder_paths.get_filename_list() across every registered model category. Matching is on the basename, so a workflow that says lora/foo.safetensors still resolves when your copy sits somewhere else. Cosmetic node types - Note, MarkdownNote, Reroute, PrimitiveNode, and friends - are skipped so they don't show up as false alarms.
Inputs and output
workflow_json is the only input that matters: a multiline box you paste workflow JSON into. Leave it empty and it falls back to the graph ComfyUI is about to execute, which is fine when you're running the node inside the thing you're inspecting; if there's nothing queued it returns a short message telling you to use the panel instead.
fail_on_missing (off by default) is the interesting switch. Turn it on and an incomplete environment makes the node raise instead of just printing a report - so the queue aborts with a message naming the missing node types and files instead of blowing up four nodes later on a cryptic error. Useful in a workflow you're handing to someone else.
The node outputs report, a markdown string, and it's registered as an output node, so it runs even if nothing downstream consumes it. You can wire it into a Show Text-ish node or just read it in the panel.
Installing it
Via ComfyUI-Manager, search Workflow Doctor under Install Custom Nodes, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/lostmywind/comfyui-workflow-doctor
Restart, and you'll find a Doctor entry in the sidebar, a right-click canvas menu item, and - on older front-ends where sidebar registration fails - a floating 🩺 button in the bottom-right. That's an intentional fallback, not a bug.
The install is genuinely clean. pyproject.toml lists dependencies = [], nothing downloads a model, there's no account or telemetry, and it needs Python 3.9+. It only reads files already on your machine. There's also a standalone CLI if you want to check workflows without booting ComfyUI:
python3 cli.py workflow.json --comfy /path/to/ComfyUI
Where people get burned
A renamed model reads as missing. Matching is by filename, so if you renamed JuggernautXL_v9.safetensors locally, every workflow that references the original name will be reported as incomplete. That's the tool being honest, not broken.
It reports, it doesn't fetch. Model files are large and often license-gated, so it deliberately stops at handing you search links. Expect to do the download yourself.
The extension sniff is a heuristic. A field has to look like a filename to be treated as one - long strings (over 300 characters, e.g. a pasted prompt with a filename in it) are ignored on purpose. If the report says your environment is complete and the run still dies on a missing model, the reference probably didn't carry an extension.
It won't tell you which pack to install. You'll still be searching class_type names in Manager, which the README argues does that job better than a repo guess would.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| workflow_json | STRING | Paste a workflow JSON (UI export or API format). Leave empty to check the workflow currently being queued. | |
| fail_on_missingopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| report | STRING | — |