Prompt Specs (Symbiotica)
Sixteen sockets fed by a folder of prompt files
- prompts
- prompt_1
- prompt_2
- prompt_3
- prompt_4
- prompt_5
- prompt_6
- prompt_7
- prompt_8
- prompt_9
- prompt_10
- prompt_11
- prompt_12
- prompt_13
- prompt_14
- prompt_15
- prompt_16
The premise is stupidly simple: your prompts are files, not widget text. Point the pack's Prompts (Symbiotica) node at a folder of .md files, tick the ones you want, flip the node to multi, and you get one fat wire out that nothing in ComfyUI understands. Prompt Specs is what turns that wire back into sockets - prompt_1 through prompt_16, one ticked file each - so the text can go where prompts go.
Why you'd bother
The classic ComfyUI plumbing move for repetition is the primitive value node: one source, many consumers, so changing a prompt once changes it everywhere. Prompt Specs solves the same problem from the other end. The value doesn't live in the graph at all - it lives in a directory you can put in git, edit in a real editor, diff, and hand to whoever else writes for your project. The graph just reads it.
If your prompts are one-liners you retype, skip this. If you keep a small library of them - a style preamble per model, a negative block, a per-asset-type description - this pair is worth the two nodes.
How it works
The prompts input is typed SYMBIOTICA_PROMPTS, and it genuinely is not a string. The Prompts node hands over a str subclass that carries two extra things beside the text: the folder it was pointed at, and the relative paths of every file you ticked. It's one value answering two modes - in single it behaves like the open file's text, and in multi it stays quiet until something asks it to split.
Prompt Specs is that something. It calls the wire's own split method: the open file's text comes back as you see it in the panel (an unsaved edit counts - what's on screen is what runs), every other ticked file is read from disk, and the results come out in tick order. If fewer than sixteen files are ticked, the spare sockets get empty strings rather than nothing.
If you wire in anything that isn't that wire, the node refuses by name instead of handing a downstream encoder a nonsense string: wire a Prompts node set to 'multi' into this node.
The input and the sixteen outputs
One input, prompts - a multi Prompts node's output. Nothing to configure, no key, no model.
The outputs are a fixed sixteen, prompt_1 … prompt_16, all STRING. The canvas relabels each socket with the file it's carrying, which is the only place that mapping is visible - and it's positional, so which file lands on which socket is decided by the order you ticked them in, not by filename or by where they sit in the folder.
Installing it
ComfyUI Manager → search Symbiotica → install. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/symbiotica-ai/comfyui-nodes.git symbiotica
pip install -r symbiotica/requirements.txt
Then restart ComfyUI. There are no model downloads and nothing heavy: requirements.txt is requests and pillow, and you already have both. Do note the pack is authored against ComfyUI's newer node API, so you want a reasonably current ComfyUI rather than a 2023 build. Older releases of this pack pulled faster-whisper; the current one doesn't.
Things that will bite you
single versus multi is the whole trick, and it's on the node's properties. The Prompts node swaps its output's name and type depending on that toggle, so a node sitting in single offers a plain STRING socket, not the one Prompt Specs wants. That's the first thing to check when the wire won't connect.
Tick order is wiring order. Retick your files and the texts shuffle between sockets. On a graph where prompt_1 is the style preamble and prompt_2 is the negative, that's a silent swap of your output. Tick deliberately, and keep the tick count stable once wires are on the sockets.
A ticked file that's been deleted or renamed fails the run by name rather than quietly sending an empty prompt. That's deliberate in this pack - the downstream nodes are paid API calls, and an empty prompt on a billed model is worse than an error.
Ticked files are fingerprinted on mtime and size, so editing one on disk re-runs the graph. Usually what you want. Just know that editing file sixteen re-queues everything behind it.
One pack-wide warning worth repeating: 2026.9.23 renamed this pack's Prompt Block node to Prompts (Symbiotica) and changed its inputs and outputs. Same node id, so an older graph opens with the node still there and its wires dropped. If your workflows depend on the older shape, pin the previous release.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| prompts | SYMBIOTICA_PROMPTS | A `multi` Prompts node's output. |
Outputs (16)
| Name | Type | Description |
|---|---|---|
| prompt_1 | STRING | A ticked file's text. |
| prompt_2 | STRING | A ticked file's text. |
| prompt_3 | STRING | A ticked file's text. |
| prompt_4 | STRING | A ticked file's text. |
| prompt_5 | STRING | A ticked file's text. |
| prompt_6 | STRING | A ticked file's text. |
| prompt_7 | STRING | A ticked file's text. |
| prompt_8 | STRING | A ticked file's text. |
| prompt_9 | STRING | A ticked file's text. |
| prompt_10 | STRING | A ticked file's text. |
| prompt_11 | STRING | A ticked file's text. |
| prompt_12 | STRING | A ticked file's text. |
| prompt_13 | STRING | A ticked file's text. |
| prompt_14 | STRING | A ticked file's text. |
| prompt_15 | STRING | A ticked file's text. |
| prompt_16 | STRING | A ticked file's text. |