⌨️ FoW - Prompt Refiner Light
One editor for all nine buckets
- clip
- Positive Conditioning
- Negative Conditioning
- Combined Positive Prompt
- Combined Negative Prompt
The flagship node, and the reason this pack exists
FoW - Prompt Refiner Light is what FoW_Suite_LIGHT is actually about. It's a single node with one big button - "Open Prompt Interface" - that opens a draggable, resizable modal where you type your whole prompt into nine labeled boxes: five positive (subject, environment, style, shot, detail) and four negative (static, content, definition, dynamic). It encodes each box, concatenates them into a Positive and a Negative conditioning, and hands you both. No nine-node graph needed; the modal is the graph.
The pack's author, SirWillance, built the whole suite as a two-month first coding project, and it shows in the best way: this node was designed by someone who got tired of ComfyUI's prompt UX, not by someone inventing new ML. The Light tier is deliberately minimal - no tokenization, no per-token weights (the pitch is that Standard/Pro add those). What you get instead is a clean editor and a genuinely unusual collaboration feature: you can save your prompts to a .txt file and hand it to someone with a beefier machine.
How it works
The backend is a straight-forward encode-and-concat. Each non-empty box gets its text cleaned (a leftover " FoW " delimiter convention is converted to commas), encoded through your CLIP, and stacked with ComfyUI's ConditioningConcat:
cleaned_text = text.replace(" FoW ", ", ").replace(" FoWs ", ", ").replace(" FoWe ", ", ").strip()
cond = clip.encode_from_tokens_scheduled(clip.tokenize(cleaned_text))
Empty boxes are skipped; if everything's empty it encodes an empty string so the graph still runs. The modal's buttons are the UI: 💾 saves to PromptRefinerLightOutput.txt (newline-separated positive/negative), ✔ pushes the prompts to ComfyUI, 🧼 clears, and "Show Tips" toggles the guidance alerts that are on by default.
The inputs and outputs that matter
You mostly won't touch the inputs directly - the modal writes into them. They are positive_subject, positive_environment, positive_style, positive_shot, positive_detail, and negative_static, negative_content, negative_definition, negative_dynamic (all multiline strings), plus the required clip (CLIP) input.
The outputs are the useful part:
- Positive Conditioning and Negative Conditioning (CONDITIONING) - straight into a KSampler.
- Combined Positive Prompt and Combined Negative Prompt (STRING) - the joined text, handy for logging or a text node.
Installing it
One install, whole suite:
cd ComfyUI/custom_nodes
git clone https://github.com/SirWillance/FoW_Suite_LIGHT
Restart ComfyUI, and it appears under "🧿 FoW - Light". ComfyUI Manager also has it - search "Force of Will Suite Light". No dependencies, no model downloads; it runs on your checkpoint's CLIP.
Where people get burned
The save-to-txt feature is the fiddly one. It writes newline-separated positive/negative to PromptRefinerLightOutput.txt, and the README's own troubleshooting says the most common failure is a format issue (not newline-separated) or a path problem after a Manager reinstall - so if the save button does nothing, check the file landed and restart ComfyUI. The bigger conceptual trap: nine labeled boxes can convince you that organizing the prompt is the result. It isn't. On SDXL-lineage models this structure genuinely helps; on LLM-encoded models the boxes still work as an instruction, but the KB's prompt-engineering essay is clear that structure beats keywords there too. And if you're running a distilled checkpoint at CFG 1, the negative side of this node is mostly decoration - same reason as every other negative in this pack. Still, as a "type here, get conditioning" node, it's the cleanest one in the suite, and for a beginner that's worth a lot.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| positive_subjectopt | STRING | — | |
| positive_environmentopt | STRING | — | |
| positive_styleopt | STRING | — | |
| positive_shotopt | STRING | — | |
| positive_detailopt | STRING | — | |
| negative_staticopt | STRING | — | |
| negative_contentopt | STRING | — | |
| negative_definitionopt | STRING | — | |
| negative_dynamicopt | STRING | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| Positive Conditioning | CONDITIONING | — |
| Negative Conditioning | CONDITIONING | — |
| Combined Positive Prompt | STRING | — |
| Combined Negative Prompt | STRING | — |