Umi Prompt Syntax Lint
Catch the Typo Before the 40-Image Batch
- errors
- warnings
- report_json
Umi Prompt Syntax Lint is the node you add when your prompt has grown past the "type a sentence and hope" stage. It reads prompt text the way the wildcard processor would, reports what's broken, and - this is the part that makes it usable in a live graph - expands nothing. No randomness runs, no LoRAs load, nothing changes. You can leave it wired in permanently.
What it checks
Feed it the same template you give the Wildcard Processor and it walks the syntax:
- unbalanced or unclosed delimiters -
[,{,(, a lone__, an odd@@, a<lora:with no> - wildcard ranges where the minimum is greater than the maximum, or a range so wide it'll produce an absurdly long prompt
- empty wildcard names and empty logic filters
- missing wildcard files, with a fuzzy "did you mean" suggestion based on your actual
wildcards/collection - this is the one that pays for the node - LoRA strengths outside
[-5.0, 5.0], which get clamped silently otherwise - conditionals with no branches
- suspicious joins, like
__pose__in-universe locationwhere a wildcard butts straight into text, or an inline helper followed by a word with no comma or space - the profile lint (see Umi Prompt Profile), so a missing quality tag or an over-short prompt shows up here too
A wildcard that isn't in your collection but has a fallback (__pose|standing calmly__) is reported as a note rather than a warning, because the expansion will still work. No fallback, no file - that's a warning, and it's the one that quietly puts a literal [NO_MATCHES: ...] in your prompt.
Inputs and outputs
prompt is required; negative_prompt and profile are optional. The profile dropdown is the same list the Profile node uses - None, Illustrious, Pony, SDXL, Flux - and picking one turns on its family-specific checks.
Outputs are errors (a newline-joined list; empty means valid), warnings (which also carries the notes), and report_json. The JSON is the useful one for anything programmatic: a valid boolean plus counts of wildcards found, missing wildcards, LoRA tags, conditionals and negative spans. Wire errors into a text preview node and you've got a prompt health indicator sitting next to your workflow.
Example of the kind of thing it catches before you queue:
1girl, __hair_color__, [if $mood==calm: gentle smile
Unclosed bracket, and if hair_color isn't a file you have, that too - with the closest name in your collection suggested.
Install
Part of the pack core, so one install covers it. ComfyUI Manager (search the pack title, or install via git URL) or:
cd ComfyUI/custom_nodes
git clone https://github.com/Tinuva88/Comfy-UmiAI
cd Comfy-UmiAI && pip install -r requirements.txt
Core needs pyyaml only. Restart ComfyUI; the node appears under UmiAI/prompt.
What it can't do
It checks structure, not taste. A perfectly balanced prompt full of made-up Danbooru tags passes with flying colors, and inventing tags is one of the more reliable ways to get mediocre anime-model output - real tags beat plausible-sounding ones because the model was trained on the real vocabulary. If your lint report is clean and your images are bad, the problem is the words, not the syntax.
It also can't see intent. __pose__ joining straight into the next word is a warning because it's usually a mistake, but if your prompt is deliberately concatenating fragments, you'll learn to ignore that line.
And it only knows the files on disk at the moment it runs. Add a new wildcard file, and the lint node will find it on the next run - the pack hashes the wildcard collection into its cache key, so a changed or added file does re-trigger, though a stale browser panel is a different problem. If the node doesn't appear at all, that's the usual install story: pyyaml missing, or ComfyUI never restarted.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| negative_promptopt | STRING | — | |
| profileopt | COMBO | None | 5 options: None, Illustrious, Pony, SDXL, Flux |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| errors | STRING | — |
| warnings | STRING | — |
| report_json | STRING | — |