comfyui-scene-compiler
Deterministic natural-language-to-prompt compiler for ComfyUI (Illustrious).
Nodes (5)
The one node in Scene Compiler that's actually allowed to think
One node to rule them all (and load the knowledge base)
Look under the hood without touching anything
The stage that finally speaks fluent Danbooru
The quality gate between the LLM and your prompt
ComfyUI Scene Compiler
A deterministic prompt compiler for ComfyUI. Turn a plain-language scene description into a clean, valid Illustrious tag prompt — without an LLM inventing anything.
Status: Version 2 released (
v2.1.0). The deterministic Version 1 pipeline shipped in v1.0.0 / v1.1.0. Full documentation lives in the Wiki; see the Roadmap and issues for what's next.
The idea
Most prompt-generation workflows ask a language model to write Danbooru tags directly:
Natural Language → LLM → Prompt
LLMs are bad at this. They invent clothing, poses, lighting, and environments that were never described, emit invalid tags, and return different output for identical input. Scene Compiler takes a different position:
The language model understands the scene. The compiler generates the prompt.
Prompt generation is treated as a compilation problem, not a text-generation problem. Language understanding happens once, up front; everything after it is deterministic and traceable.
Natural Language
→ Scene Analyzer → Scene JSON
→ Scene Validator → Validated Scene JSON
→ Resolver → Prompt
Only the Scene Analyzer uses an LLM, and only to understand language — never to produce tags. Every generated tag is looked up in a data-only Knowledge Base built from a real Danbooru tag vocabulary, so tags are always valid and never invented. The Resolver both resolves concepts to tags and joins them into a single flat prompt string, in resolution order. Every tag stays traceable:
Natural Language → Scene JSON → Knowledge Base Entry → Resolved Tag → Prompt
What Version 2 changed
Version 1 proved the compiler works. Version 2 is about making it know more and ask less — without giving up a single guarantee.
Know more
The V1 compiler was honest but narrow: a concept missing from the Knowledge Base was simply dropped, and the Knowledge Base only grew by hand.
- The Knowledge Base grows itself. A fully automated pipeline regenerates it from committed Danbooru snapshots — generate candidates, ingest aliases and implications, auto-validate, scan for conflicts, write. There is no approval gate: an automation that stops to ask a human is an automation that doesn't run.
- Near-misses are caught, not dropped. An opt-in semantic (nearest-neighbour) fallback resolves concepts that miss exact lookup. It is off by default, deterministic when enabled, and can only return an entry that already exists in the Knowledge Base — so it can never invent a tag. Deterministic lookup always wins.
- Detail stops leaking. The compiler used to silently discard parts of what you
wrote. Now modifiers survive (
open white shirt→white shirtandopen shirt), every item of a list is transcribed, and relationships are kept rather than flattened to a noun (money in her hand→holding money, not justmoney). The same fidelity applies to explicit content — nothing is quietly softened or skipped.
Ask less
V1 exposed almost every internal as a node or a widget. That is honest, but it pushes the compiler's internal shape onto the user.
- Configuration lives in one place. All settings are on the Configuration
node; the stage nodes take a single optional
configconnection. The analyzer model used to be set in two disconnected places — now it's set once. - Fewer nodes. Stages that carried no real decisions were folded away: the Category Splitter and Prompt Builder collapsed into the Resolver (V1.1), and the Knowledge Base Loader collapsed into the Configuration node (V2.1). Eight nodes became five.
- Don't ask what the system already knows. The Knowledge Base ships inside the package, so its path is no longer a question. Options that aren't ready or aren't really user-facing (prompt target, separator, hand-written system prompts) are not exposed — they keep working defaults instead.
- Plain language. Every input has a tooltip written for a user, not for a compiler engineer.
What did not change
Determinism. Every V2 addition is opt-in, bounded to the existing Knowledge Base, and reproducible: the same Scene JSON, Knowledge Base, and configuration always compile to the same prompt. Knowledge stays data, never code. Nothing is invented.
Key principles
- Determinism first — a given Scene JSON + Knowledge Base + config always produces the same output, with no random seeds. (The one non-deterministic step is the LLM understanding the language up front; everything after it is reproducible.)
- No hallucinations — if it isn't in the description, it isn't in the output. Unknown concepts are reported, never guessed.
- Knowledge is data — every concept→tag mapping lives in the Knowledge Base, never in code.
- Fidelity — described detail must survive to the prompt, or be reported. Silence is a bug.
- Traceability — every tag can be explained back to the sentence it came from.
- Automation without gates — the pipeline runs end to end with zero required human input.
- Nodes are interfaces — ComfyUI nodes are thin wrappers; all logic lives in the compiler package, and settings live on one node.
Version 2 targets the Illustrious model family. The architecture is model-independent, so future versions can add Pony, Flux, NoobAI, and others without changing the compiler core.
Nodes
Scene Compiler ships as a ComfyUI custom-node package of five nodes. It is a toolbox, not a fixed workflow — every node can be used independently.
Pipeline nodes
| Node | Inputs | Outputs |
|---|---|---|
| Scene Analyzer | natural_language, config (optional) | scene, warnings, errors, raw |
| Scene Validator | scene, config (optional) | scene, warnings, errors, raw |
| Resolver | scene, knowledge_base, config (optional) | prompt, warnings, errors, json |
The Resolver is the final stage: it resolves concepts to Knowledge Base tags and
joins them into one flat prompt string. Its json output carries the traceable
resolved tags so a translation problem is inspectable.
Support nodes
| Node | Inputs | Outputs |
|---|---|---|
| Configuration | all compiler settings (see below) | config, knowledge_base, warnings, errors |
| Debug Viewer | scene, warnings, errors (all optional) | report |
- Configuration is the single place for compiler settings and the Knowledge
Base loader: it reads the Knowledge Base that ships with the package and emits it
on its
knowledge_baseoutput, which you wire into the Resolver. Bump itsknowledge_base_reloadcounter after editing the Knowledge Base to re-read it. - Debug Viewer is read-only; connect any intermediate state to inspect it.
A typical graph:
Configuration ─ config ──────────► Scene Analyzer / Scene Validator / Resolver
└ knowledge_base ───► Resolver
Scene Analyzer → Scene Validator → Resolver → (your image workflow)
Knowledge Base Editor (optional web tool)
Not a node. Version 2 adds an optional browser editor for curated Knowledge Base
entries, served by ComfyUI at http://127.0.0.1:8188/scene-compiler/kb. It offers
create/edit/delete with live validation and atomic, format-safe saves. It is the
only manual surface in the project and is entirely off the compile critical path —
the compiler never depends on it.
Installation
Install manually from Git today; a ComfyUI Manager listing is planned.
Via ComfyUI Manager (recommended once published): search for Scene Compiler.
Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/kunail0804/ComfyUI-Scene-Compiler.git
Then restart ComfyUI. The Scene Analyzer requires a local Ollama instance for language understanding; the rest of the pipeline runs fully offline.
Quick start
- Add a Configuration node (it also loads the Knowledge Base).
- Add a Scene Analyzer and type a description, e.g. "A blonde girl wearing a white dress hugs a young man while walking in the rain."
- Wire Scene Analyzer → Scene Validator → Resolver, and connect Configuration's
configto each stage and itsknowledge_baseto the Resolver. - Send the Resolver's
promptoutput into your image-generation workflow (e.g. EasyIllustrious). - Drop a Debug Viewer on any connection to inspect the intermediate state.
A ready-made graph is in
examples/workflows/scene_compiler_pipeline.json.
Given the example above, the compiler extracts female, blonde hair,
white dress, male, the interaction hug, and environment rain — and
nothing else. It does not add eye colour, quality tags, or lighting that were
never described.
Documentation
Full documentation lives in the Wiki:
- Overview & Vision
- Architecture & Pipeline
- Data Model
- Scene JSON & Schemas
- Scene Analyzer
- Knowledge Base
- Resolver & Prompt
- ComfyUI Nodes
- Configuration, Errors & Logging
- Development, Testing & Contributing
- Roadmap
- Glossary & Reference
In-repo notes live in docs/ — see docs/nodes.md for the
node reference and docs/knowledge_base_build.md for
how the Knowledge Base is regenerated.
MASTER_SPEC.md is the full normative specification, maintained
through Version 2. Chapters superseded by later versions are marked in place rather
than deleted, so the original design intent stays readable.
Roadmap
- Version 1 — Deterministic Compiler Foundation (done — v1.0.0 / v1.1.0): the complete deterministic pipeline for Illustrious, plus Ollama integration, Knowledge Base, Debug Viewer, and regression tests.
- Version 2 — Semantic Resolution (done — v2.0.0 / v2.1.0): opt-in semantic/embedding fallback, automatic Knowledge Base builder, Knowledge Base versioning and editor, concept fidelity, performance, and the node/configuration consolidation — determinism preserved. (Analyzer localization was dropped as unnecessary.)
- Version 3 — Extensible Compiler Platform: multi-model Resolvers, a plugin system, multiple Analyzer backends, and a standalone Compiler SDK.
- Version 4 — Consolidation: a single unified node that runs the whole pipeline, continuing the V2 consolidation. The granular nodes stay available for debugging.
See the Roadmap for details.
Contributing
Contributions are welcome — especially Knowledge Base entries. Please read CONTRIBUTING.md and the Development, Testing & Contributing guide first. Core rule: never hardcode knowledge, and never break determinism.
License
See LICENSE.
A note on AI assistance
This project — its code, tests, and documentation — is built with heavy help from AI coding assistants, and is developed and maintained by a solo author. AI makes mistakes: despite testing and review, parts of this project and its docs may be inaccurate, out of date, or simply wrong. Please treat it as a good-faith best effort rather than authoritative truth — if the docs and the code disagree, the code wins — and open an issue when you spot something off.