Prompter
Prompter writes your prompt for you — and can hand back conditioning, ready to sample
- lm
- image
- clip
- config
- text
- conditioning
"Prompt enhancer" nodes have a bad name among people who've actually tested them, and mostly for two reasons: the model leaks its chat scaffolding into your conditioning (assistant, "Here's your enhanced prompt:", a markdown fence), or it invents detail you never asked for and dresses it as enhancement. Subject drift, arriving as a confident paragraph.
Prompter is the packaged version of the fix people converged on: narrow the job. You give it a short informal brief, a reference photo, or both. It writes one paragraph. It does not chat.
What it produces
Two outputs. text is the prompt - the model's answer, whitespace stripped, positive only. conditioning is that same prompt encoded by whatever CLIP you connect to the clip input, exactly as core's CLIP Text Encode encodes it. Both at once, which is unusual and convenient: plain models use conditioning and go straight to the sampler; anything that needs a specialist text-encode node (a model-specific encoder, a prompt scheduler) takes text instead.
Wire conditioning without a CLIP and the run stops with a message telling you to connect one or encode the text yourself. Leave conditioning unlinked and text works fine with no CLIP anywhere - that's the normal case if you only wanted a prompt.
One wrinkle: if you link conditioning after a run without it, the downstream node gets ComfyUI's cached result and Prompter doesn't re-run, so that node blocks with the same message while the rest of the workflow carries on. Fix is to re-queue. Confusing the first time and completely fine after.
The negative prompt is not Prompter's business. It writes the positive only.
instructions, the knob that matters
This is where the node earns its keep, because it splits the job by who owns the person's appearance.
include identity- the person's appearance gets written. From a brief: as far as the brief goes and in the brief's own words, nothing invented past that. From a photo: the opening fills in ethnicity, decade of life, build, hair, eyes, skin.exclude identity- nothing about how the person looks. This is the character-LoRA mode: your LoRA carries the face, so the prompt must not fight it. The class word (womanorman) comes from the brief - the gender it states, or the one its cues suggest (bridal fittingreads woman,barber at workreads man), or from the person in the image. And it still copies everything removable: clothing, footwear, jewelry, held objects. That distinction is the right one. A jacket can be handed to someone else; a jawline can't.none- no prompt at all. Brief and/or image go in raw, for a prompter LoRA of your own.
A connected instruction replaces the built-in prompt for any mode, none included, and it goes before the brief with a blank line between. This is the escape hatch: the built-ins are written for a natural-language pipeline (one paragraph, 150–200 words, opening on the shot type and camera height, no style or quality tail), which is exactly right for an LLM-encoded base and probably not what you want on a booru-style anime model. Write your own instructions text and go tag-based.
The other inputs
text - the brief. Short, informal, any language. With include identity / exclude identity and a brief, a connected image is ignored - that surprises people. The image is a fallback for when you have nothing to say, not a supplement.
image - one frame only. A batch is a hard error with a message telling you to pick a frame. Long side capped at 1024, never enlarged, matching how a captioner/prompter LoRA was trained.
seed - control starts at fixed, so re-queueing gives you ComfyUI's cached prompt. Randomize when you're fishing for a better phrasing.
config - replaces the node's own sampling with an LM Config's. Without one, Prompter uses temperature 0.7, top_p 0.8, top_k 20, no presence penalty - the decoding its own prompt files were built and served with. Connect a config and change nothing and you get the model's defaults instead, penalty of 1.5 included, which is a different feel on a paragraph-length output.
The model itself comes from an LM Loader on lm, which is required and has no default.
With keep_model_loaded off on the loader, the chat model is unloaded before the CLIP encodes - so the text encoder gets the VRAM back. Small thing, thoughtful.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/0xBeycan/ComfyUI-BCNodes
pip install -r ComfyUI-BCNodes/requirements.txt
Restart, then search prompter or prompt enhancer. (Yes, prompt enhancer finds it. The author knows what people type.) No third-party dependency of its own; the pack's opencv/postfx/caption-audit requirements belong to other nodes.
Model files download on first use into models/Qwen-LM/ from beycanai/Qwen-LM; console reports every 10%.
Getting burned
Neither brief nor image is an error with a plain-English message. Fair enough.
600 tokens is the answer cap. A prompt at 150–200 words is well under half that, so you won't hit it with the built-ins - but your own instruction asking for something much longer will get truncated mid-thought with no drama. That's a silent quality loss, not an error.
A prompt is not an approval. The built-in exclude identity mode is trying to keep appearance out of the prompt; it has no idea what your LoRA will do with the rest of it. Read what it wrote before you hand it to a 20-step sampler.
Enhancement is a convenience, not a writer. The people who've tested local models hardest for this job keep landing in the same place: an 8B model removes the blank-page problem and doesn't do the writing for you. If the output reads generic, that's usually the brief being generic, not the model being bad.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| lm | BC_LM | The chat model, from an LM Loader: its model, precision and LoRA (at its strength), and whether it stays loaded after this node (off: unloaded once the prompt is written, before the clip encode, after an error too). | |
| text | STRING | The brief: the picture you want, short and informal, in any language. With include / exclude identity it follows the built-in brief prompt and a connected image is not used; with none it is the user text itself, after the image when one is connected. Empty (or only whitespace): the image alone is used. | |
| instructions | COMBO | include identity | The built-in prompt. include identity: the person's appearance is written (as the brief gives it, or read off the image). exclude identity: nothing about how the person looks, for a character LoRA that carries it. Both write the subject as a woman or a man, from the brief (the gender it states, else the one its cues suggest) or the image, in one paragraph that opens with the shot type and camera height. A brief uses the brief prompt, an image alone the image prompt. none: no prompt, the model gets the brief and / or the image alone (a prompter LoRA of your own). A connected instruction replaces it. |
| seed | INT | 00–18446744073709550000 | The sampling seed. Its control starts at fixed, so queueing again gives the cached prompt instead of a new run; set it to randomize for a new prompt each time. |
| imageopt | IMAGE | A reference photograph: one image (a batch of more frames is an error). Used when the brief is empty, or with instructions none (the image, then the brief); with include / exclude identity and a brief it is not used. The model sees it with its long side capped at 1024 (never enlarged), then sized as its family sizes images. | |
| instructionopt | STRING | Your own prompt in place of the built-in one, with any instructions value: before the brief, a blank line between, or after the image when the brief is empty. Not connected, or only whitespace: instructions decides. The answer is cut at 600 tokens. | |
| clipopt | CLIP | A CLIP (text encoder) for the conditioning output: the prompt is encoded as the standard CLIP Text Encode encodes it. Not connected: leave conditioning unlinked (linked, it is an error asking for a CLIP); text works either way. | |
| configopt | BC_LM_CONFIG | Sampling from an LM Config node in place of Prompter's own (temperature 0.7, top_p 0.8, top_k 20, no presence penalty): the model's thinking-off defaults with the fields edited there, or fed by a link, over them. Not connected: Prompter's own. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| text | STRING | The prompt the model wrote, its surrounding whitespace stripped: the positive prompt. Take it to your own encode node when the workflow needs another one. |
| conditioning | CONDITIONING | The prompt encoded by the connected CLIP, as CLIP Text Encode encodes it: the positive conditioning only (the negative comes from elsewhere). Needs the clip input. |