Symbiotica Prompt Recipe
One pick, and every prompt the category needs switches at once
- order
- text_1
- text_2
- text_3
- text_4
- text_5
- text_6
A food category needs a recipe, an image prompt, a negative, maybe a type rule - several prompt blocks that have to be swapped as a set. Symbiotica Prompt Recipe is the node that serves a saved recipe: one prompt block per output, picked in the panel and stored under prompts/_recipes/<name>.json. Switching recipe switches every prompt the category needs at once. That's the upgrade over Prompt Compose, and the reason Compose is deprecated.
How it works
Recipes are JSON files in the project's prompts/_recipes/ folder. Each has a number of slots, and each slot names a block (or an inline prompt) that the node serves on text_1..text_6. Outputs past the recipe's slot count come back empty, and downstream nodes treat empty as "use the original" rather than erroring.
The clever bit is the category-following mode. "(follow category)" as the recipe value serves the recipe named after the asset's category - so wire Asset Focus's category in and picking the asset upstream picks its prompts automatically, with nothing to set here. There's also a bucket input for rows within a category: wire Asset Focus's bucket in and <category> - <bucket> is served when the book has such a recipe (Food - 3 stages - Drinks), falling back to the plain category otherwise.
The inputs
recipe(required) - the saved preset to serve, or(follow category). The panel writes this widget, and it's what survives a workflow reload.slots- how many blocks this recipe serves (default 3, up to 6). Outputs past it are empty.project_path- the project folder. Unneeded whenorderis wired, since the order carries the project.order(optional) - any pipeline order; it carries the project.category(optional) - with(follow category), this names the recipe.bucket(optional) - Asset Focus'sbucket, for the per-row override.
The outputs
text_1..text_6, each one a recipe slot. They're what you wire into a Prompt Block (to preview and edit a slot on canvas), an LLM node, or a text-join before the sampler.
Install
Same as the rest of the pack - search Symbiotica in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/symbiotica-ai/comfyui-nodes.git symbiotica
pip install -r symbiotica/requirements.txt
Restart after. No key, no model.
Gotchas
The one trap is the version-slot interaction. A block file may hold up to three versions split by <!-- version: name --> markers, and the recipe's slot picks a version (1–3). A slot with no such version falls back to the top of its file. So if you edit a block and the change "isn't there," check whether the recipe is pinning an older version - that's the feature, working as designed. And because recipes are files, they're shared across machines and queues, which is great right up until two people edit the same recipe. Same last-writer-wins caveat as everywhere else in this pack.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| recipe | STRING | The saved preset to serve. Pick it in the panel — the panel writes this widget, and it is what survives a workflow reload. “(follow category)” serves the recipe named after the asset's category instead, so picking a Food asset upstream serves the Food recipe. | |
| slots | COMBO | 3 | How many blocks this recipe serves. Outputs past it come back empty. |
| project_path | STRING | Client project folder holding the prompt book. Unneeded when `order` is wired. | |
| orderopt | SYMBIOTICA_ORDER | Any order from the pipeline — it carries the project, so project_path can stay empty. | |
| categoryopt | STRING | Wire Asset Focus's `category` here and the recipe named after it is the one served — picking the asset then picks its prompts, with nothing to set here. | |
| bucketopt | STRING | Asset Focus's `bucket` — how this row of the category is drawn. With one wired, `<category> - <bucket>` is served when the book has such a recipe (`Food - 3 stages - Drinks`), and the plain category otherwise. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| text_1 | STRING | Slot 1 of the recipe, or empty when the recipe has no such slot. |
| text_2 | STRING | Slot 2 of the recipe, or empty when the recipe has no such slot. |
| text_3 | STRING | Slot 3 of the recipe, or empty when the recipe has no such slot. |
| text_4 | STRING | Slot 4 of the recipe, or empty when the recipe has no such slot. |
| text_5 | STRING | Slot 5 of the recipe, or empty when the recipe has no such slot. |
| text_6 | STRING | Slot 6 of the recipe, or empty when the recipe has no such slot. |