Flux Pseudo Negative
Flux has no negative prompt. This node fakes one for you.
- modified_prompt
- llm_input
FLUX.1 Dev and Schnell are guidance-distilled: CFG is baked into the weights, so the negative prompt box silently does nothing at their designed settings, and cranking real CFG up just burns the image. The workaround the community settled on is dumber and cheaper than any fancy node - restate your "don'ts" as "do"s. Flux Pseudo Negative automates exactly that. You type the negative prompt you wish Flux could read, it flips the words into positive attributes, and staples them onto your positive prompt. The name is a lie in a good way: it doesn't call any API, needs no key, and nothing about it touches the sampler.
The author is upfront about what this is. The README says the idea "will probably render this completely useless" once real negative support lands for Flux, and that he shipped it anyway because the work was done. That's the honest review too. For the cost of one custom node you get a "blurry, bad anatomy, dull colors" that actually moves Flux output - not as precisely as a real negative, but it moves.
How it works
Under the hood it's a pipeline of dictionary lookups and NLP fallbacks. First a PhraseHandler in flux_utils.py checks your negative prompt against a built-in map of roughly 150 common defects - "bad composition" becomes "well-composed", "washed out colors" becomes "vibrant colors", "bad anatomy" becomes "accurate anatomy" - matched as phrases up to four words long. Anything left over goes through an antonym cascade: your custom dictionary, then WordNet, then NLTK, then a BERT fill-mask model (bert-base-uncased) that completes "The opposite of X is [MASK]". First strategy that returns a different word wins. The result, plus your positive prompt, comes out as modified_prompt.
Two things the docs don't fully prepare you for. The strength slider is computed (sentiment from TextBlob times your value) but never actually applied in the shipped code - the antonyms are just concatenated, so don't expect that slider to visibly change anything yet. And complexity is really a two-way switch: basic appends the plain antonyms, while advanced and expert both expand each antonym through BERT for nearby words - expert currently behaves like advanced with fancier labeling.
The LLM half is optional, and not what you think
use_llm_full and use_llm_fallback sound like the node is calling a model. It isn't. It builds a system-prompted conversion request as a string and hands it to you in the second output, llm_input - you wire that into a separate LLM node (local or API) that returns a rewritten prompt. The system_prompt_choice field picks between three tested prompts the pack ships; custom_system_prompt replaces them. Skip the whole LLM path and the node still works fine.
The inputs that matter
negative_prompt- the whole point of the node. Phrase-level complaints work far better than single words.positive_prompt- what gets augmented; leave it blank and you just get the converted attributes.custom_antonyms- oneword:antonympair per line. This is the fix-it-yourself knob, and honestly the highest-leverage input on the panel: a few hand-written pairs beat BERT guessing.
modified_prompt goes straight into your CLIP/T5 text encode for Flux.
Installing
Via ComfyUI Manager, search "FluxPseudoNegative". Or:
cd ComfyUI/custom_nodes
git clone https://github.com/NeuralSamurAI/ComfyUI-FluxPseudoNegativePrompt
Then restart ComfyUI. The requirements.txt covers nltk, textblob, and requests, but the real surprise is the first run: NLTK downloads its data at import, and the node loads a ~440 MB BERT model on first use, so your first execution needs internet and a moment of patience. torch and transformers are imported but not in requirements.txt - torch ships with ComfyUI and transformers is almost always present, but if the node fails to load, pip install transformers fixes it.
Where people get burned
- Leave
use_conceptnetoff. It's the only true API call in the pack (toapi.conceptnet.io), and the author's own caveat says it's "not working as intended." - Polysemy happens. "Gross" might come back as "disgusting" - or as the total of a bill. WordNet returns the most common antonym and can't read context.
- Don't expect the console to be quiet. Every strategy logs every tag; it's verbose by design, not an error.
- Set expectations. Keyword antonyms are blunt, and the KB's own research finds generic quality lists are contested while naming a specific visible defect works. If all you need is "no blurry, no watermark," a few
custom_antonymsentries get you most of the value without the 440 MB download. For serious steering on distilled models, modern nodes like NAG or PerpNegGuider are the more precise answer - but for "make my Flux prompts less garbage," this little node works today.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| positive_prompt | STRING | — | |
| negative_prompt | STRING | — | |
| strength | FLOAT | 0.50–1 | — |
| complexity | COMBO | 3 options: basic, advanced, expert | |
| system_prompt_choice | COMBO | 3 options: default, prompt_1, prompt_2 | |
| custom_antonymsopt | STRING | — | |
| use_conceptnetopt | BOOLEAN | false | — |
| use_llm_fullopt | BOOLEAN | false | — |
| use_llm_fallbackopt | BOOLEAN | false | — |
| custom_system_promptopt | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| modified_prompt | STRING | — |
| llm_input | STRING | — |