Boy Subject Filter
The node that untangles `1girl, solo, sex`
- processed_text
You've written 1girl, solo, sex and hit Generate. Every one of those is a real Danbooru tag. Together they're a contradiction: solo means one person in the frame, and sex needs two. Booru-trained models don't complain about that, they average it, and you get the not-quite-two-people, not-quite-one-person blur that makes people post "why does my anatomy do this". Boy Subject Filter is a one-job node that untangles exactly that, and does nothing else.
This lives firmly in tag-prompt land - Illustrious, NoobAI, Pony, and the 2026 tag-eating models - where the vocabulary is structured labels rather than prose. It's the same world where 1girl and multiple boys are meaningful strings the model learned, which is why a node can reason about your subject tags at all.
How it decides
The mechanism is dead simple, which is the best thing about it: the node reads your tags, and asks whether any of them only holds with a man in the picture.
That's a whole-tag match against a hardcoded list - sex, hetero, vaginal, anal, oral, fellatio, deepthroat, paizuri, handjob, footjob, doggystyle, missionary, mating press, cowgirl position, gangbang, clothed female nude male and friends - plus a handful of regex families (double penetration, \w+ threesome, \w+ handjob), the male-body tags (penis, erection, precum, testicles, male focus), and anything spelled with the word another ("grabbing another's hand" names a second person by definition).
Two bits of care worth knowing. Matching is on whole tags, never substrings, so sex toy, sexy and unisex sail straight through. And tags starting with after - after sex, after fellatio - are deliberately skipped, because the aftermath is something one person can hold alone. Underscores and capitalisation are ignored on the way in, so Sex_From_Behind is detected like any other.
If nothing in the prompt needs a man, you get your string back untouched, character for character. If something does: solo comes out, and if the prompt counts no boy (1boy, 2boys, multiple boys - the count tags only), then ((1boy)) and your add_tags go on the end. A prompt that already says 1boy just loses solo and gains nothing.
The inputs and the one output
text is the prompt. Note that it's an input socket, not a text box - you can't type into this node. Feed it from whatever produced your prompt: the pack's own TextPrompt, a string primitive, or the tail of your tag-processing chain.
add_tags is the string appended when no boy is counted. The default is (hetero:1.1), (couple:1.1), (deep skin:1.1), and you should look at that for two seconds before leaving it alone, because it's clearly the author's own aesthetic baked in as a default. If you don't want couple framing, or deep skin in every scene, replace it - it's a plain string, whatever you type goes in verbatim.
The single output is processed_text. Wire it into your positive CLIP Text Encode, or into the next prompt node in the chain (LoRA-tag separation, tag filtering) if you have one.
Installing it
It ships in ComfyUI-Alchemine-Pack (GPL-3.0, one author, small - it has essentially no community footprint, so expect the README and the source to be your documentation), under the AlcheminePack/Prompt category.
Easiest path: ComfyUI Manager → search ComfyUI-Alchemine-Pack → install → restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/alchemine/comfyui-alchemine-pack
cd comfyui-alchemine-pack && pip install -r requirements.txt
That requirements file is one line - python-dotenv - and no model downloads are involved for the prompt nodes. Nothing in the pack fails at load time over a missing credential, so a clean restart is the whole install. The rest of the pack's nodes (Grok video, remote-API execution, OpenAI Inference) want tokens and are where any heavier setup would land; none of that touches this node.
Where people get caught
Mostly by expecting it to do more than it does. It reads text, not the image, and it never removes a boy tag - it assumes a counted boy means the picture is already consistent. Tags outside its list are invisible to it; if you're writing something niche that implies a partner and the node doesn't fire, that's a list gap, not a bug you can tune around.
The ((1boy)) and add_tags land at the very end of the string. On tag models earlier tags pull more attention, so if you care where subject tags sit in your ordering, run the output through something that reorders, or splice it in yourself. And the weights in add_tags ((hetero:1.1)) only mean something to a model that reads CLIP weight syntax at all - on the newer LLM-encoded models, the tag is the tag.
One last thing: the pack's ProcessTags chain does not include this node. Color and plural filtering get folded in there, boy handling doesn't - you place Boy Subject Filter yourself, usually right before the text encode.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | — | |
| add_tags | STRING | (hetero:1.1), (couple:1.1), (deep skin:1.1) | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| processed_text | STRING | — |