🪠️ WWAA JSON Prompt Builder
Build structured JSON prompts from dropdowns, not typing
- json_prompt
Prompt syntax has moved on. Modern LLM-encoded models like Qwen-class and Flux.2 read natural language, and the current advice for structured, repeatable generation is to keep your fields separate - which is exactly what JSON does. WWAA JSON Prompt Builder is a giant form that turns ~30 labelled fields and dropdowns into one clean JSON string, so you get consistent, schema-shaped prompts without hand-typing braces.
The mental model is a photography brief: you fill in the scene, the subject, the environment, the lighting, and the output parameters, and the node assembles it all. Its defaults are suspiciously specific - a retro balloon photo shoot with direct flash and a disposable camera look - which tells you this was built for a particular character-photo workflow at WeirdWonderfulAI.Art. Ignore those defaults and it becomes a general structured-prompt generator.
The inputs that matter
There are a lot, but you'll realistically touch these:
scene_description- the free-text scene, the one required field you type into.subject_category- human/animal/object/abstract/landscape/architecture; it decides whether the subject-detail fields get used.enable_subject_details- master switch for the whole subject block (hair, face, pose, clothing…). Flip it off for pure landscapes and the form stops shoving empty fields at you.lighting,mood,photography_style,camera_angle- dropdowns with sensible presets, each paired with a*_customtext box for when a preset doesn't fit.aspect_ratioandrender_intent- output-level metadata, useful if you're piping this JSON to an LLM or a workflow that parses it.custom_fields- free-form extra key-value pairs (newline separated) when the form genuinely lacks a field.include_empty_fieldsandindent_json- the first drops empty strings from the output to keep it lean; the second controls pretty-printing. If you're feeding a captioner or LLM that's picky,indent_json: falsegives you compact single-line JSON.
Output is a single json_prompt string, which you'd usually wire into a prompt encoder or an LLM node that understands structured input.
Install
In ComfyUI Manager, search "WWAA Custom Nodes" and install. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/hgabha/WWAA-CustomNodes
# restart ComfyUI
The pack declares zero extra requirements - numpy, Pillow, torch only, all stock - so there's no dependency roulette. Look under the 🪠️ WWAA menu.
Should you use it?
Honest take: if you write prompts by hand and like it, this form will feel like bureaucracy. It earns its keep in two scenarios - when you want consistent, repeatable structure across hundreds of generations (LoRA dataset captions, batch photography-style work), and when a downstream LLM or captioner genuinely consumes JSON and you want field separation you can rely on. For everyone else, it's a fun toy and a decent way to see how a professional studio structures a prompt. Just remember: the JSON is a prompt, not magic. A good JSON brief still needs good words inside it.
Inputs (34)
| Name | Type | Default | Description |
|---|---|---|---|
| scene_description | STRING | A retro indoor photo shoot with pastel balloons. | — |
| subject_category | COMBO | human | 6 options: human, animal, object, abstract, landscape, architecture |
| enable_subject_details | BOOLEAN | true | — |
| gender_presentationopt | COMBO | N/A | 5 options: male, female, non-binary, androgynous, N/A |
| age_bracketopt | COMBO | N/A | 6 options: child, teen, young_adult, middle_aged, elderly, N/A |
| hair_lengthopt | COMBO | N/A | 7 options: bald, very_short, short, medium, long, very_long, +1 |
| hair_styleopt | STRING | — | |
| hair_coloropt | STRING | — | |
| facial_expressionopt | STRING | — | |
| makeup_detailsopt | STRING | — | |
| face_accessoriesopt | STRING | — | |
| body_poseopt | STRING | — | |
| clothingopt | STRING | — | |
| body_featuresopt | STRING | — | |
| subject_descriptionopt | STRING | — | |
| backgroundopt | STRING | plain white wall with colorful balloons | — |
| flooropt | STRING | white or light-colored, scattered balloons | — |
| lightingopt | COMBO | direct_flash | 10 options: natural_soft, natural_harsh, studio_soft, studio_harsh, direct_flash, rim_light, +4 |
| lighting_customopt | STRING | high contrast, vintage tone | — |
| moodopt | COMBO | playful | 10 options: joyful, serene, melancholic, energetic, mysterious, romantic, +4 |
| mood_customopt | STRING | retro, slightly chaotic energy | — |
| photography_styleopt | COMBO | disposable_camera | 10 options: digital_modern, film_35mm, film_medium_format, disposable_camera, polaroid, vintage_90s, +4 |
| photography_customopt | STRING | 90s disposable camera look, slightly grainy | — |
| color_paletteopt | STRING | warm whites, soft pinks, reds, and blues | — |
| aspect_ratioopt | COMBO | 3:4 | 8 options: 1:1, 3:4, 4:3, 16:9, 9:16, 2:3, +2 |
| aspect_ratio_customopt | STRING | — | |
| render_intentopt | COMBO | photo | 6 options: photo, illustration, 3d_render, painting, sketch, mixed_media |
| camera_angleopt | COMBO | high_angle | 8 options: eye_level, high_angle, low_angle, bird_eye, worm_eye, dutch_angle, +2 |
| camera_angle_customopt | STRING | subject looking up | — |
| depth_of_fieldopt | COMBO | shallow | 4 options: shallow, medium, deep, bokeh |
| output_lightingopt | STRING | harsh frontal flash | — |
| include_empty_fieldsopt | BOOLEAN | false | — |
| indent_jsonopt | BOOLEAN | true | — |
| custom_fieldsopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| json_prompt | STRING | — |