Nodes/Mode_personal_node/Structured Prompt Composer
ComfyUI Node

Structured Prompt Composer

A dropdown-driven prompt builder that never makes up its mind for you

By transcendedhacker·Created 8 months ago·Updated 8 months ago· 0
Structured Prompt Composer
    • prompt
    library
    modelsdxl
    subject
    age
    hair_color
    hair_style
    hair_ornament
    outfit
    outfit_detail
    pose
    mood
    location
    location_detail
    atmosphere
    lighting
    angle
    frame
    filter
    technical
    subject_addon
    age_addon
    hair_color_addon
    hair_style_addon
    hair_ornament_addon
    outfit_addon
    outfit_detail_addon
    pose_addon
    mood_addon
    location_addon
    location_detail_addon
    atmosphere_addon
    lighting_addon
    angle_addon
    frame_addon
    filter_addon
    technical_addon
    custom

    The "Structured Prompt Composer" is the reason the Mode_personal_node pack exists. It's a prompt builder with seventeen dropdown blocks - subject, age, hair color, outfit, pose, mood, lighting, camera angle, all the way down to film filter - that assembles the result into one deterministic string. No randomness, no hidden logic, identical inputs give identical prompts. If you want a repeatable prompt skeleton you can batch through, or you're just tired of watching your own prompts drift further from English with every edit, this is a genuinely useful shape of tool.

    How it works

    Under the hood it's a tiny schema-driven engine. A JSON contract (schema/connector.json) defines the block order, which blocks get weighted, and where BREAK tokens go; the actual option text lives in separate library files (libraries/*.json). You pick an option, the engine looks up its text, optionally appends any addon text you typed, applies weighting, and joins everything with ", ". Three libraries ship: comprehensive_portrait, cyberpunk_neon, and everyday_casual - you switch libraries to swap the whole option set, since ComfyUI dropdowns can't dynamically re-filter each other.

    The output is a single STRING named prompt. It feeds the positive input of your CLIP Text Encode node. Keep the pack's sister node, Structured Negative Prompt, on the negative side and you've got a tidy pair.

    The inputs that actually matter

    You don't need all seventeen dropdowns. Here's what to reach for first:

    • model - sdxl or flux. Pick it honestly, it changes the output syntax (more below).
    • subject, outfit, location - the bones of any scene. Everything else is garnish.
    • None - every dropdown offers it first, and it's the single most useful option in the pack: it omits that block cleanly instead of inserting filler.
    • *_addon - one optional text field per block, appended inline to that block's text. This is your escape hatch when the curated options don't have what you want: pick the closest option, then refine it in the addon box without breaking the structure.
    • custom - a final multiline field, appended after a ", BREAK, ".

    One honest caveat about the content: every subject option is female (Woman, Young Woman, Girl…). This is a portrait photography pack, and specifically a feminine-portrait one. Fine if that's your genre; know it going in.

    The SDXL vs Flux caveat

    Here's where the pack's cleverness only pays off on one model. The engine inserts BREAK tokens at positions 8, 12, and 15, and wraps certain blocks in (text:1.2) style weights - both are CLIP-era techniques that chunk your prompt against SDXL's 77-token boundary and boost attention on key blocks. On SDXL, model = sdxl, this is exactly the right tool for the job: BREAK keeps "forest" from bleeding into the description of your subject.

    On Flux, though, both mechanisms are mostly dead weight. Flux's T5 encoder doesn't parse (x:1.2) weighting the way CLIP does - the parentheses just sit there as literal text - and there's no 77-token boundary for BREAK to break against. The engine even tries (it applies a 0.85 weight multiplier for flux), but the syntax doesn't survive contact with the encoder. So: on SDXL this is a well-tuned tool; on Flux you're mostly paying for the structure, and the weighting/BREAK decorations are noise you'd edit out.

    Installing it

    Both nodes install together, and the pack is dependency-free - no requirements.txt, no model downloads, pure Python. Fastest route: ComfyUI Manager → search Mode_personal_node → install → restart. Or manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/transcendedhacker/Mode_personal_node
    

    Restart ComfyUI and both nodes appear under prompting/structured. Want to add your own options? Edit a library's JSON (format is "Option Name": "prompt text"), save, restart. The engine stays frozen; content just grows.

    Gotchas

    • Console spam. Every single compose prints a wall of [COMPOSER] debug lines to your terminal. Harmless, but noisy if you keep logs.
    • One-commit project. There's exactly one commit (v2.0, Jan 2026) and zero community discussion anywhere I can find. Expect it to work as shipped and don't count on active maintenance - which is fine, because it's finished-feeling and the extension path is plain JSON.
    • License. CC BY-NC 4.0: personal/research use and selling your generated images are fine; commercial redistribution of the software itself isn't.
    • Slow dropdowns? No - the author's own notes say the engine stays responsive even with thousands of options. Scroll, don't worry.

    It's opinionated (portrait, female-subject, SDXL-first), but as a deterministic, reproducible prompt skeleton it does its one job well. On SDXL especially, this is a tidy little time-saver.

    Categoryprompting/structured

    Inputs (37)

    NameTypeDefaultDescription
    libraryCOMBO3 options: comprehensive_portrait, cyberpunk_neon, everyday_casual
    modelCOMBOsdxl2 options: sdxl, flux
    subjectCOMBO6 options: None, Girl, Mature Woman, Teen Girl, Woman, Young Woman
    ageCOMBO8 options: None, 18-22, 23-27, 28-32, 33-37, 38-42, +2
    hair_colorCOMBO29 options: None, Ash Blonde, Auburn, Baby Blue, Blue-Black, Burgundy, +23
    hair_styleCOMBO23 options: None, Afro Texture, Bob Blunt, Box Braids, Crown Braids, Fishtail Braid, +17
    hair_ornamentCOMBO15 options: None, Bandana, Barrette, Bobby Pins, Claw Clip, Crown, +9
    outfitCOMBO30 options: None, Black Velvet Mini, Bodycon Midi, Boho Blouse Skirt, Button Down Shorts, Cotton Shirt, +24
    outfit_detailCOMBO11 options: None, Flowing Movement, Glossy Finish, Loose Draping, Matte Surface, Natural Compression, +5
    poseCOMBO21 options: None, Arm Over Eyes, Cat Arch, Cross Legged, Crouching Low, Deep Squat, +15
    moodCOMBO16 options: None, Blood Red Tension, Clinical Detachment, Cyberpunk Nightlife, Delicate Lace, Dramatic Noir, +10
    locationCOMBO16 options: None, Apartment Living Room, Art Gallery, Beach Shore, Bedroom Corner, Cafe Booth, +10
    location_detailCOMBO11 options: None, Blue Hour Twilight, Early Morning Haze, Fresh Daylight, Golden Sunset Hour, Late Night, +5
    atmosphereCOMBO16 options: None, Cold Metallic Grey, Cool Pale Blue, Deep Blue Fog, Deep Purple Glitter, Ethereal Dreamy, +10
    lightingCOMBO15 options: None, Backlit Haze, Beauty Dish, Candlelight Flicker, Diffused Streetlight, Even Shade, +9
    angleCOMBO19 options: None, Birds-Eye View, Close-Up Face, Cowboy Shot, Dutch Angle, Extreme Close-Up, +13
    frameCOMBO11 options: None, Center Framing, Deep DOF, Frame Within Frame, Leading Lines, Negative Space, +5
    filterCOMBO16 options: None, Bleach Bypass, CineStill 800T, Cyberpunk Neon, Film Noir, Kodachrome 64, +10
    technicalCOMBO13 options: None, 35mm Wide, 50mm Natural, 70mm Standard, 85mm Portrait, Anamorphic, +7
    subject_addonoptSTRING
    age_addonoptSTRING
    hair_color_addonoptSTRING
    hair_style_addonoptSTRING
    hair_ornament_addonoptSTRING
    outfit_addonoptSTRING
    outfit_detail_addonoptSTRING
    pose_addonoptSTRING
    mood_addonoptSTRING
    location_addonoptSTRING
    location_detail_addonoptSTRING
    atmosphere_addonoptSTRING
    lighting_addonoptSTRING
    angle_addonoptSTRING
    frame_addonoptSTRING
    filter_addonoptSTRING
    technical_addonoptSTRING
    customoptSTRING

    Outputs (1)

    NameTypeDescription
    promptSTRING