APNext Node
The base prompt-builder you point at your own word lists
- prompt
- random
Think of this as the plain-vanilla version of the whole APNext prompt family. The Architecture, Photography, Human, People, Typography and Video Game nodes are all this same engine with a specific set of word lists baked in. APNext Node is the one without the baked-in lists - it's the base you feed your own. If you've ever wanted a prompt node whose dropdowns are your categories instead of somebody else's taste in cameras, this is the one.
Out of the box it's deliberately minimal: a text box, a seed, and a couple of toggles. The power only shows up once you drop your own JSON category files into the pack's data/next/ folder, at which point they appear as dropdowns on this node and it starts assembling prompts the same way its specialized siblings do.
How it works
You type a base prompt, the node appends whatever categories you've defined (each set to a specific value, Random, or None), and joins the pieces with your separator. The seed fixes the random draws so a good result is reproducible. That's the entire mechanism - it's string assembly, not generation. No model runs, no API is called, nothing downloads.
The attributes toggle is the one non-obvious control. The pack's category files support an "advanced format" where each item can carry extra descriptor tags (a "motion blur" entry might also pull in "dynamic, cinematic"). Flip attributes on and those sub-descriptors get folded into the output; leave it off and you just get the plain picks.
A heads-up rooted in how these prompts are built: the dagthomas lists lean SDXL-era, meaning weighted parentheses and tag-style phrasing. That's ideal for SDXL, Illustrious and Pony, where attention weights and comma tags are the native language. On the newer LLM-encoded checkpoints (Z-Image, Flux 2, Anima) the weighting is discarded and the model wants instructions, not tag bags - so build your custom lists accordingly if that's your target.
Inputs and outputs that matter
- prompt (multiline, required) - your base text. The category picks get added onto this.
- separator (default
,) - what joins the assembled fields. Comma is right for tag-based models. - string (optional) - an extra chunk of text to merge in, handy for chaining another node's output through.
- seed - locks the random selections; roll it to reshuffle.
- attributes (boolean) - pull in the extra descriptor tags attached to each item, or don't.
Two outputs: prompt is your base plus everything assembled, ready to wire into a CLIP Text Encode. random hands back just the randomly chosen additions on their own, which is useful when you want to log or reuse only the part the node invented.
Adding your own categories
This is the actual point of the base node. Create a folder under data/next/ (say data/next/mymood/), drop in a JSON file per field - a simple ["item1", "item2"] array, or the advanced object form with preprompt, separator, items and attributes. Restart ComfyUI and your category shows up as a dropdown here. It's the cleanest way to get a maintained, reusable dropdown prompt setup without writing a node - which is exactly the use case people keep asking about on r/comfyui.
Installing it
Via ComfyUI Manager, search comfyui_dagthomas and install. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/dagthomas/comfyui_dagthomas
cd comfyui_dagthomas
pip install -r requirements.txt
The requirements list is heavy because the pack also carries LLM and image-effect nodes; this node itself needs none of them.
Common issues
If the node shows up bare with no interesting dropdowns, that's expected - the base node ships without categories, and you populate data/next/ yourself. Added a category folder and it's not appearing? You forgot to restart, or your JSON doesn't parse; validate it and reload. And if your custom lists produce mush, the fix is the same as everywhere in this pack: define fewer, tighter categories rather than randomizing a dozen at once.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| separator | STRING | , | — |
| stringopt | STRING | — | |
| seedopt | INT | 00–18446744073709550000 | — |
| attributesopt | BOOLEAN | false | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |
| random | STRING | — |