Nodes/ComfyUI_StarNodes/⭐ Star Sexy Builder
ComfyUI Node

⭐ Star Sexy Builder

The Anatomy Dropdowns Most Prompt Packs Won't Ship

By Starnodes2024·Created 2 years ago·Updated 6 days ago· 120
⭐ Star Sexy Builder
    • description
    • sexy_sheet
    • system_prompt
    ◄sexnone►
    ◄hairstylenone►
    ◄hair_colornone►
    ◄skin_tonenone►
    ◄body_buildnone►
    ◄breastsnone►
    ◄chestnone►
    ◄nipplesnone►
    ◄waistnone►
    ◄buttnone►
    ◄legsnone►
    ◄genitalsnone►
    ◄pubic_hairnone►
    ◄lingerienone►
    ◄nightwearnone►
    ◄kinky_outfitnone►
    ◄accessoriesnone►
    ◄expressionnone►
    ◄posenone►
    ◄ambiancenone►
    ◄customnone►
    ◄styleboudoir photography►
    ◄age►
    ◄random_agefalse►
    ◄additional►
    ◄seed0►
    ◄random_allfalse►

    Most character prompt builders stop at hair colour and outfit; going further gets a pack delisted. StarNodes doesn't stop. ⭐ Star Sexy Builder is its adult figure builder: twenty dropdowns covering body build, explicit anatomy, lingerie and nightwear, pose and boudoir mood, output as plain prompt strings.

    No model, no VRAM, no pixels. What it does is the tedious part: a stack of selections in, a clean comma-separated prompt plus a full reference-sheet paragraph out.

    How it works

    Options live in json/star_sexy_builder.json - 20 lists plus a system_prompt. Each list becomes a dropdown, and every dropdown gets three special values in front: none skips the category, random picks an entry, exclude drops it and keeps it out when random_all is on.

    The field set is split by anatomy rather than by "character type". breasts and chest are separate categories, so a male subject uses chest and an unset breasts doesn't leak. genitals and pubic_hair are separate again, and nipples, waist, butt and legs each get their own list. Assembly keeps a stable comma order, so you get slim build, narrow waist with wide hips, long shapely legs rather than the same words reshuffled every queue.

    seed pins every random pick; 0 re-rolls each run. random_all randomizes everything - except that lingerie, nightwear and kinky_outfit are mutually exclusive, so the subject wears one, never two. exclude is what makes that usable: lock what you care about, randomize the rest.

    age is free text - a bare number becomes 29 year old, words pass through. random_age rolls within age_random_min / age_random_max, 18 to 60 by default; the floor is 18 and the sheet prompt says "adult" outright. Leave age empty to keep a number out of the prompt entirely.

    The three outputs

    description is the comma-separated prompt - the one you wire into a CLIP Text Encode.

    sexy_sheet is a paragraph that deliberately reads like a figure-study plate: two tall full-body panels left, front and back; a 3×2 detail grid right (face front/profile/45°, chest, pelvic area, buttocks from behind), expanding to 4×2 with close-ups and isolated accessory panels that are never worn. Then: "presented in a clinical and objective way like a figure study plate, with flat, even studio lighting… and enforces absolute consistency in the subject's… proportions and overall appearance across every panel."

    Your style fighting that clinical instruction isn't a bug - it's the trick every builder in this family uses, and it's what keeps a grid from drifting into different people per panel (character-consistency.md). Want the sheet to look like boudoir photography? The flat-lighting clause fights you; pick a style that shares its vocabulary.

    system_prompt is the LLM instruction text - feed it to a local model node if you want an LLM rewriting sheets for you.

    Which fields matter

    • body_build, waist, legs carry most of the silhouette; breasts/chest and genitals are the explicit ones. Any field at none is simply absent.
    • style defaults to boudoir photography - the only dropdown whose default isn't none - and lands in both outputs.
    • additional appends free text to both prompts - camera and lighting language goes here.

    The tag/prose split is the thing to get right

    description is comma-chained; sexy_sheet is a paragraph. Tag-trained models (SDXL derivatives, Pony, Illustrious) want the comma version and make a mess of the paragraph; LLM-encoded models (Flux, Qwen-Image, Z-Image) are the opposite (prompt-engineering.md). Match the output to the model.

    Anatomy-specific prompting is where checkpoints differ most: if a field seems to do nothing, that's usually the base model, not the node.

    Install

    Manager → search Starnodes → Install → restart. Manual:

    cd ComfyUI/custom_nodes
    git clone https://github.com/Starnodes2024/ComfyUI_StarNodes
    cd ComfyUI_StarNodes
    pip install -r requirements.txt
    

    The builder is standard-library only (os, json, time, random). The requirements file - opencv, psd-tools, scikit-learn, imageio-ffmpeg, ollama - is for the pack's other nodes; install.py runs no pip installs on purpose, so a bare clone still leaves you a working text node.

    Where people get burned

    JSON edits don't appear in the dropdowns until you restart. Option lists are read at module load; random picks re-read the file live, so new entries get used immediately even while the dropdown looks stale.

    A malformed JSON fails silently. The loader catches the exception, prints StarNodes: Could not load star_sexy_builder.json, and returns empty lists - dropdowns collapse to the three special values and your prompt comes out nearly empty. Check it:

    python3 -m json.tool ComfyUI/custom_nodes/ComfyUI_StarNodes/json/star_sexy_builder.json > /dev/null
    

    "Unclothed unless a wear category is selected." Straight from the output tooltip: with no lingerie, nightwear or kinky outfit set, the sheet prompt says the subject is unclothed. Intended behaviour - setting all three wear fields to exclude is how you make it deliberate.

    random_all ignored your selections. That's the feature. exclude is the escape hatch.

    Category⭐StarNodes/Text And Data

    Inputs (27)

    NameTypeDefaultDescription
    sexCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    hairstyleCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    hair_colorCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    skin_toneCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    body_buildCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    breastsCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    chestCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    nipplesCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    waistCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    buttCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    legsCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    genitalsCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    pubic_hairCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    lingerieCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    nightwearCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    kinky_outfitCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    accessoriesCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    expressionCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    poseCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    ambianceCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    customCOMBOnone'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    styleCOMBOboudoir photography'none' skips this trait, 'random' picks a random entry, 'exclude' keeps it out of the prompt even when random_all is on. Add your own entries in json/star_sexy_builder.json (restart ComfyUI to see them in this list, 'random' uses them right away).
    ageSTRINGFree text. Empty = skipped. Type 'random' or enable the random_age toggle for a random age (18-60 by default, change age_random_min/max in the json settings). A plain number becomes 'X year old'.
    random_ageBOOLEANfalseIf enabled each run, picks a random age between age_random_min and age_random_max from the json settings and ignores the age text field.
    additionalSTRINGFree text that is appended to the end of the prompt. Empty = skipped.
    seedINT00–18446744073709550000Seed for all 'random' picks. 0 = new random picks every run.
    random_allBOOLEANfalseIf enabled, every category gets a random pick regardless of its widget setting. Only one of lingerie/nightwear/kinky_outfit is picked. Categories set to 'exclude' stay out of the prompt.

    Outputs (3)

    NameTypeDescription
    descriptionSTRINGThe plain generated comma-separated description prompt.
    sexy_sheetSTRINGThe ready-to-use strict figure sheet image prompt for the same character (multi-panel grid, anatomy close-up panels). Note: the character is unclothed unless a wear category is selected or randomized.
    system_promptSTRINGThe system prompt to feed into your LLM so it can write figure sheet prompts itself. Editable as 'system_prompt' in json/star_sexy_builder.json.