Compose Manager
Stop rebuilding your prompt library every session
- compose_data
- image
- compose_data
Prompt Composer is the fun half of FranckyB's Prompt Manager pack: a card-based builder where you click fragments - attire, expression, camera, style - and it spits out a finished prompt with the LoRAs attached. Compose Manager is the boring half, and it's the one you'll be glad exists three weeks from now, because it saves that whole setup as a named entry you can bring back later.
Think of it as a save slot for a prompt recipe rather than a snippet of text: the sentence, plus the LoRA stack, the strengths and a thumbnail so you can recognise it in a dropdown of forty entries.
What it actually does
It has exactly one output, compose_data, and its job is to produce a normalised version of one - edited, thumbnailed, and written into your saved prompt library. The save itself is a button on the node: it posts your library data to the pack's own endpoint and refreshes the dropdowns, so you never touch a JSON file by hand.
The mechanism, straight out of nodes/prompt_composer_manager.py: the incoming payload goes through the pack's ensure_v2_recipe_data() normaliser, the LoRA stack from the composer's lora_stack is folded into the output model block, the prompt text is written into positive_prompt on model_a, and the result is tagged _source: PromptComposerManager so the pack knows which node wrote it. Only one thumbnail survives, picked in priority order: the image input if you wired one, otherwise one already travelling inside the incoming data. Either way it's stored as a base64 data URL.
It's also an output node, like a Save Image: it always executes even if nothing downstream consumes it. Treat it as the terminal node for a composer graph.
The inputs that matter
Three required fields. category picks the shelf in your library, name picks the entry on it, and text is a multiline string with the tooltip "Edit prompt text directly". The category and name dropdowns come from your library file - the pack reads user/default/prompt_manager_data.json while building the node definition - so on a fresh install they hold whatever you've saved so far, not shipped presets.
Then two optional ones:
compose_data- the interesting one. It'sforceInput, so it's a socket and not a typeable field, and it accepts bothCOMPOSE_DATA(from Prompt Composer) and the olderRECIPE_DATAtype the pack's experimental recipe nodes emit. Leave it unwired and the node has nothing to save.image- an IMAGE input used purely as the saved thumbnail. It does not affect the prompt in any way. Wire your KSampler output here and you get a picture next to the entry.
The output, compose_data, goes back into Prompt Composer's own compose_data input - that's the round trip. To make the restored data actually take effect, use the second row of toggles on Prompt Composer: Sync rebuilds the fragment graph from the incoming data, Prompt uses the prompt stored in it, LoRA uses the LoRAs stored alongside it. Without those on, the composer keeps its local edits and your saved entry just sits there looking connected and doing nothing.
Installing it
Anything in this pack installs the same way. Via ComfyUI Manager, search "Prompt Manager" and install, or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/FranckyB/ComfyUI-Prompt-Manager.git
cd ComfyUI-Prompt-Manager
pip install -r requirements.txt
Then restart ComfyUI. The README also walks you through installing llama.cpp and dropping .gguf files into models/gguf - ignore that for this node, it's for the pack's Prompt Generator. Compose Manager needs nothing beyond requirements.txt, which in practice means huggingface_hub.
Where your data lives: everything is JSON under user/default, thumbnails inlined as base64, plus a backup folder of five daily copies. Those thumbnails inflate the file fast, so export your library now and then and keep the export somewhere else.
Gotchas
The saved entry loses to anything connected. Resolution order in the code is: live incoming compose_data, then the node's retained workflow data, then the saved library entry, then a prompt built from that entry's stored text and LoRAs. So if a composer stays wired into compose_data while you browse the dropdown, the live data wins - disconnect the wire to load from your library.
Same story for the text field. The outgoing prompt is the resolved positive_prompt or your typed text, in that order, so typing in text won't override a saved or connected prompt.
The library file is shared. Prompt Manager, Prompt Manager (Basic) and this node all read and write prompt_manager_data.json, so a recipe saved here appears in the Prompt Manager dropdowns and vice versa. The pack's Prompt Browser node is the tidier way to edit, rename or delete those entries, and to import/export the JSON. Convenient - but one clumsy hand-edit breaks three nodes at once, hence the backup folder.
It carries no LoRA stack on its own. The single compose_data output is the whole payload; LoRA names, strengths and trigger words travel inside it. Applying them happens on the Prompt Composer side, via the LoRA toggle. And a missing thumbnail isn't a bug - no image wired in means no preview, and this payload is pack-internal JSON rather than the workflow chunk ComfyUI embeds in your PNGs, so nothing will conjure one for you.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| category | COMBO | Composition | 2 options: Composition, Environment |
| name | COMBO | 19 options: , Aerial Bird's Eye View, Alien Planet Landscape, Desert Oasis Settlement, Dynamic Action Scene, Enchanted Ancient Forest, +13 | |
| text | STRING | Edit prompt text directly | |
| compose_dataopt | RECIPE_DATA,COMPOSE_DATA | Connected compose data to edit/forward | |
| imageopt | IMAGE | Optional image input used as the saved thumbnail when present. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| compose_data | COMPOSE_DATA | — |