Photo Magazine Prompt Generator
Not a generator — it's the spec-writer for a magazine shoot
- reference_image
- prompt
The name oversells it. PhotoMagazinePromptGenerator doesn't generate an image prompt and it doesn't generate images. What it actually does is build a structured spec - a prompt for an LLM - that tells an LLM to plan out a full photo-magazine spread: a model name, a shooting style, a scene, and a page count. You feed that spec to an LLM node, it replies with JSON, and a sibling node called PhotoMagazineParser turns that JSON into a list of per-page image prompts. So think of this as stage one of a four-stage pipeline, not a stand-alone generator.
This is a niche workflow and the pack is honest about that. The defaults are Chinese-first (the default photo_style is 自然清新, "natural fresh"), and it's aimed at people making 寫真集-style sets - a real but specific use case. If you just want one good prompt, skip it. If you want a coherent 8-page "magazine" with the same model in different scenes, this is the scaffold.
How it works
The mechanism is almost boringly simple. The node reads a .md template from the pack's DesignPrompt/ folder and does a Python str.format() injection: your model_name, features, photo_style, custom_scene, and content_pages get dropped into {placeholder} slots, and the whole thing comes out as one STRING output. That string is the LLM's job assignment.
One trap worth knowing: the optional reference_image input does not analyze the photo. When you connect one, the node swaps your features text for an {EXTRACT_FROM_IMAGE} placeholder and prints console hints telling you to load the extract_person_features.md template in your LLM node. The actual feature extraction happens in the LLM, not here. Cute, but easy to mistake for magic.
The inputs that matter
template- dropdown of.mdfiles inDesignPrompt/. Pick which "shooting plan" spec the LLM receives.model_name- the model's name (小美, Lisa…), feeds the magazine's premise.photo_style- shooting style, free text.custom_scene- optional scene setting; empty = LLM decides.content_pages- how many pages/spreads to plan (3–30, default 8).features- optional person description; leave blank and the template tells the LLM to infer from the name.reference_image(optional) - wires in the placeholder path described above.
Output: a single prompt (STRING) that goes into an LLM node - this pack ships OpenRouterLLM and OpenAIHelper, or the local QwenGPUInference. From there: parser → prompt list → your sampler.
The real gotcha
The DesignPrompt/ folder in the current release ships with only README.md - the actual generation templates (photomagazine_json_output.md, photomagazine_simple.md) are documented but not included. So out of the box your dropdown may only offer README.md, which isn't a working template. The fix is the pack's own DesignPrompt/README.md, which is a decent template-authoring guide: required variables ({model_name}, {features}, {photo_style}, {custom_scene}, {content_pages}, {features_description}), and the {{ / }} escaping you need for JSON braces. Write your own .md, restart ComfyUI, and it appears in the dropdown.
Install
Standard for this pack:
cd ComfyUI/custom_nodes
git clone https://github.com/dseditor/ComfyUI-ListHelper
Then restart ComfyUI. ComfyUI Manager also finds it if you search "ComfyUI-ListHelper". No extra Python packages for this node - regex, accelerate, reportlab in the pack's requirements cover the pack as a whole.
If a template isn't in the dropdown after you add it, restart ComfyUI. If your {variables} come through verbatim, check your braces - it's a Python format string and the names are exact.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| template | COMBO | README.md | 1 options: README.md |
| model_name | STRING | — | |
| photo_style | STRING | 自然清新 | — |
| custom_scene | STRING | — | |
| content_pages | INT | 83–30 | — |
| features | STRING | — | |
| reference_imageopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |