Files
ComfyUI-Ethanfel-Prompt-Bui…/README.md
T
2026-06-24 18:02:30 +02:00

671 lines
28 KiB
Markdown

# ComfyUI Prompt Builder
Custom ComfyUI node for building prompts from the existing `generate_prompt_batches.py`
generator without writing image batches.
The node is registered as:
- `prompt_builder / SxCP Prompt Builder`
- `prompt_builder / SxCP Seed Control`
- `prompt_builder / SxCP Seed Locker`
- `prompt_builder / SxCP Camera Control`
- `prompt_builder / SxCP Category Preset`
- `prompt_builder / SxCP Cast Control`
- `prompt_builder / SxCP Generation Profile`
- `prompt_builder / SxCP Advanced Filters`
- `prompt_builder / SxCP Prompt Builder From Configs`
- `prompt_builder / SxCP Woman Slot`
- `prompt_builder / SxCP Man Slot`
- `prompt_builder / SxCP Character Slot`
- `prompt_builder / SxCP Character Profile Save`
- `prompt_builder / SxCP Character Profile Load`
- `prompt_builder / SxCP Caption Naturalizer`
- `prompt_builder / SxCP Krea2 Formatter`
- `prompt_builder / SxCP Insta/OF Options`
- `prompt_builder / SxCP Insta/OF Prompt Pair`
It outputs:
- `prompt`
- `negative_prompt`
- `caption`
- `metadata_json`
- `category`
- `subcategory`
## Split Workflow Nodes
The original `SxCP Prompt Builder` remains available as the full all-in-one
node. For cleaner workflows, use the split nodes:
- `SxCP Category Preset` outputs `category_config` for broad intent such as
women casual, men casual, couple casual, provocative erotic, or hardcore pose.
- `SxCP Cast Control` outputs `cast_config` plus raw `women_count` and
`men_count`, so couple/two-women/two-men/group setups can be reused.
- `SxCP Generation Profile` outputs `generation_profile` for common behavior
presets such as casual-clean, evocative-softcore, hardcore-intense,
Krea2-friendly, or Flux-original.
- `SxCP Advanced Filters` outputs `filter_config` for appearance include
checkboxes, figure, and plus-size inclusion.
- `SxCP Prompt Builder From Configs` consumes those config outputs and produces
the same prompt, negative, caption, metadata, category, and subcategory
outputs as the full builder.
The practical compact workflow is:
`Category Preset` + `Cast Control` + `Generation Profile` + optional
`Advanced Filters`, `Seed Locker` or `Seed Control`, `Camera Control`,
`Woman Slot` / `Man Slot`, and `Character Profile`
into `Prompt Builder From Configs`.
An importable default workflow is included at
`examples/default_task_lanes_workflow.json`. It is laid out by task instead of
as one long chain:
1. A regular generation lane: config nodes into `Prompt Builder From Configs`,
then optional `Caption Naturalizer` and `Krea2 Formatter`.
2. An Insta/OF dual-generation lane: `Insta/OF Options`, seed/camera controls,
`Insta/OF Prompt Pair`, then optional formatter/naturalizer nodes.
3. Profile save/load tools parked as an adjacent side branch. They can be wired
manually into either generation lane, but they are not part of the default
main path.
## Character Profiles
`SxCP Woman Slot` and `SxCP Man Slot` are the scalable per-participant control
nodes. `Cast Control` still decides how many women and men are generated; slot
nodes decide who those people are. Each slot defines one participant with
optional overrides for age, ethnicity, body/body phrase, skin, hair, and eyes.
Leave any field on `random` or blank to let the generator fill that part from
the normal pools; set exact values only where you want control.
Use `Woman Slot` for women because it exposes woman-focused body choices and a
`figure_bias` selector. Use `Man Slot` for men because it exposes man-focused
body choices and omits figure bias. The older generic `SxCP Character Slot`
remains available for compatibility and manual mixed use, but the gendered
slots are the cleaner default.
Each slot also has `descriptor_detail`, which controls how much appearance text
is emitted into named-cast descriptors:
- `auto`: women use `full`; men use `compact`.
- `full`: age, body, skin, hair, and eyes.
- `medium`: age, body, skin, and hair.
- `compact`: age, body, and skin.
- `minimal`: age and body only.
`SxCP Man Slot` defaults to `compact`, which keeps men readable in Krea-style
couple/group prompts without turning every partner into a fully detailed primary
character. Set a man slot to `full` when the partner needs exact hair/eye detail.
`SxCP Man Slot` also has `presence_mode`. Use `visible` for a normal rendered
partner. Use `pov` when that man is the first-person camera participant: he
remains part of the cast and role graph, but his appearance descriptor and
per-character expression text are omitted, and pose wording is rendered from
the POV participant's viewpoint. The generic `SxCP Character Slot` exposes the
same field, but it only has an effect when `subject_type=man`.
Slots also expose `expression_enabled` and `expression_intensity`. Disable
`expression_enabled` when that character should not receive a face/expression
directive. Leave `expression_intensity` at `-1` to use the generator or Insta/OF
option fallback. Set it from `0.0` to `1.0` to make expression selection
character-driven. For configured casts, matching enabled slots emit
per-character expression text such as `Woman A has ...; Man A has ...`; Krea
formatting naturalizes those labels in pair prompts.
Slots are chainable through the `character_cast` input/output. In automatic
label mode, the slot closest to the final generator becomes `A` for its gender,
the next upstream slot becomes `B`, then `C`, and so on. Example:
`Woman slot 3 -> Woman slot 2 -> Woman slot 1 -> Insta/OF Prompt Pair`
In that chain, `Woman slot 1` resolves as `Woman A`, `Woman slot 2` resolves as
`Woman B`, and `Woman slot 3` resolves as `Woman C`. Men resolve separately the
same way, so the closest man slot becomes `Man A`.
Connect the final `character_cast` output to `SxCP Prompt Builder`,
`SxCP Prompt Builder From Configs`, or `SxCP Insta/OF Prompt Pair`. It applies
to JSON/custom single woman/man rows, JSON/custom configured-cast rows such as
`Hardcore sexual poses`, and Insta/OF named casts. The older profile save/load
nodes remain useful for one reusable primary character, but slots are better
when you need different settings for each participant.
`SxCP Character Profile Save` extracts a reusable woman/man profile from
`metadata_json` or from manual fields. The profile stores age, body/body phrase,
skin, hair, eyes, figure, and subject type. It only writes a file when
the `Save Profile Now` button is clicked; otherwise it just outputs profile JSON
for direct wiring. Saved files are written under `profiles/<profile_name>.json`;
saved profile files are ignored by git. The button is backed by the hidden
`save_now` trigger and queues the workflow once.
`SxCP Character Profile Load` has an `enabled` switch. When disabled, it returns
an empty profile so connected prompt builders ignore it. When enabled, it loads
a saved profile by selector or passes through a connected fallback profile JSON.
It also has explicit file-operation triggers:
- `Delete Selected Profile`: deletes the selected saved profile.
- `Rename Selected Profile` + `rename_to`: renames the selected saved profile.
Delete and rename are conservative: if both triggers are enabled together,
nothing happens; rename does not overwrite an existing target profile. The
buttons are backed by hidden `delete_now` and `rename_now` triggers and queue
the workflow once.
Connect the loader's `character_profile` output to `SxCP Prompt Builder`,
`SxCP Prompt Builder From Configs`, or `SxCP Insta/OF Prompt Pair`.
Profile reuse currently applies to structured JSON-category single woman/man
rows and to the primary creator in Insta/OF pair mode. The outfit, scene, pose,
expression, and composition can still change while the saved character
appearance remains stable.
`SxCP Seed Control` outputs `seed_config`, which can be connected to the prompt
builder's optional `seed_config` input.
`SxCP Seed Locker` is the fast version for iteration. Set `base_seed` to a seed
you like, choose one `reroll_axis`, and connect its `seed_config`. All other
axes stay frozen to `base_seed`; the rerolled axis follows `reroll_seed`, or the
main prompt seed when `reroll_seed=-1`.
`SxCP Camera Control` outputs `camera_config`, which can be connected to the
prompt builder or the Insta/OF pair node. It makes camera/framing first-class
instead of relying on a weak phrase inside the prompt.
Camera controls:
- `camera_mode`: `disabled`, `standard`, `handheld_selfie`, `mirror_selfie`,
`phone_tripod`, `creator_pov`, `bed_selfie`, `bathroom_mirror`,
`phone_flash`, or `action_cam`.
- `shot_size`: `auto`, `full_body`, `three_quarter`, `waist_up`, `close_up`,
or `extreme_close_up`.
- `angle`: `auto`, `eye_level`, `high_angle`, `low_angle`, `overhead`,
`side_profile`, `rear_view`, or `mirror_reflection`.
- `lens`: `auto`, `smartphone_wide`, `ultra_wide`, `portrait_lens`,
`telephoto`, or `macro_detail`.
- `distance`: `auto`, `arm_length`, `near_body`, `bedside`, or `room_corner`.
- `orientation`: `auto`, `vertical_story`, `square_feed`, or `horizontal`.
- `phone_visibility`: `auto`, `phone_visible`, `phone_hidden`,
`screen_reflection`, or `ring_light_visible`.
- `priority`: `soft_hint`, `strong`, or `locked`.
- `camera_detail`: `off` emits no camera sentence, `compact` emits one short
camera sentence, and `full` emits the full detailed camera constraint.
`SxCP Caption Naturalizer` rewrites tag-like captions or labeled prompts into
more natural language. Connect the prompt builder's `metadata_json` output to
`source_text` for the cleanest result. You can also connect `caption` or
`prompt`; in that case the node falls back to prompt-label parsing or comma-tag
cleanup.
When connected to `SxCP Insta/OF Prompt Pair` metadata, the naturalizer emits a
single combined natural caption with the shared descriptor plus separate
softcore and hardcore version descriptions. It uses the final selected
expression and composition from the generated rows, including any expression
pool and intensity settings.
Naturalizer controls:
- `input_hint`: `auto`, `metadata_json`, or `caption_or_prompt`.
- `detail_level`: `concise`, `balanced`, or `dense`.
- `style_policy`: `drop_style_tail` removes old fixed style tails; `keep_style_terms`
keeps style descriptions in the rewritten text.
- `trigger`: defaults to `sxcppnl7`.
- `include_trigger`: prepends the trigger as its own sentence.
It outputs:
- `natural_caption`
- `method`
`SxCP Krea2 Formatter` rewrites an existing prompt or `metadata_json` into a
Krea2-oriented natural-language paragraph. It is a formatter, not a safety or
content downgrade pass: hardcore items, role graphs, sexual pose wording, and
camera controls are preserved. Negative prompts stay separate.
Important behavior:
- Concrete age wording is preserved deliberately. Phrases like
`25-year-old adult woman` and `late 60s adult man` are kept because they help
avoid unwanted young-looking outputs, while generic adult boilerplate is
omitted from the Krea2 rewrite.
- Trigger words are removed by default because Krea2 prompting generally reads
better as natural language. Enable `preserve_trigger` if you still need a LoRA
trigger in the positive prompt.
- `style_mode`: `preserve` keeps the current generated style text,
`photographic` converts the style tail toward creator-photo language, and
`minimal` omits most style text.
- For Insta/OF paired metadata, the node returns both `krea_softcore_prompt` and
`krea_hardcore_prompt`, with separate softcore and hardcore negatives.
- Insta/OF cast metadata is rewritten as direct named-character prose such as
`Woman A is ...` and `Man A is ...`, so Krea2 does not have to interpret a
`Cast descriptors:` label.
- Man slots set to `presence_mode=pov` are not emitted as visible cast prose.
The formatter keeps them in the role graph, rewrites the action from the
first-person viewer position, and adds a POV camera sentence.
It outputs:
- `krea_prompt`
- `negative_prompt`
- `krea_softcore_prompt`
- `krea_hardcore_prompt`
- `softcore_negative_prompt`
- `hardcore_negative_prompt`
- `method`
`SxCP Insta/OF Prompt Pair` is a special paired-output mode. It creates one
primary creator descriptor internally, then returns both a softcore prompt and a
hardcore prompt from that descriptor. This is useful when you want matching
person/look/scene continuity but need two different prompt strengths.
When the hardcore cast includes partners, pair mode also creates deterministic
cast descriptors such as `Woman A` and `Man A`. Use
`softcore_cast=same_as_hardcore`, `hardcore_cast=couple`, and
`continuity=same_creator_same_room` when you want both outputs to reuse the cast
and location. The generated positive prompts are still standalone: each output
lists the relevant cast descriptors directly and does not depend on the image
model carrying context from another prompt.
For per-character control, chain `SxCP Woman Slot` and `SxCP Man Slot` nodes
into the pair node's `character_cast` input. The nearest woman slot controls
the shared primary creator (`Woman A`) in both softcore and hardcore outputs;
additional woman/man slots fill partner descriptors before random fallback
descriptors are used.
For POV pair prompts, set the relevant `SxCP Man Slot` to
`presence_mode=pov`. The softcore output frames the primary creator from that
participant's camera, while the hardcore output keeps the same cast and scene
but converts the role graph into first-person positioning.
It outputs:
- `softcore_prompt`
- `hardcore_prompt`
- `softcore_negative_prompt`
- `hardcore_negative_prompt`
- `softcore_caption`
- `hardcore_caption`
- `shared_descriptor`
- `metadata_json`
The positive Insta/OF outputs do not embed an `Avoid:` section; use the matching
negative prompt outputs when wiring the sampler.
`SxCP Insta/OF Options` outputs `options_json`, which can be connected to the
pair node. Defaults are set so the softcore prompt is solo while the hardcore
prompt can include partners. Softcore defaults to handheld selfie framing;
hardcore defaults to `from_camera_config`, which emits no camera sentence unless
a camera config is connected or you select an explicit hardcore camera mode.
For stronger camera control, connect `SxCP Camera Control` to the pair node's
optional `camera_config` input.
Options:
- `softcore_cast`: `solo` or `same_as_hardcore`.
- `hardcore_cast`: `use_counts`, `couple`, `threesome`, or `group`.
- `hardcore_women_count` and `hardcore_men_count`: used when `hardcore_cast` is
`use_counts`. The pair mode always keeps at least one adult woman as the
primary creator so the shared descriptor remains valid.
- `softcore_level`: `social_tease`, `lingerie_tease`, `implied_nude`,
`explicit_tease`, or `explicit_nude`. Insta/OF softcore uses dedicated outfit
pools so teaser prompts do not randomly pull hardcore-adjacent harness,
microwear, or shirtless partner styling. `explicit_nude` is available when
you want visible nude creator-shot framing without a sex act.
- `hardcore_level`: `explicit` or `hardcore`.
- `softcore_expression_intensity`: `0.0` is mild/controlled, `0.5` is sensual,
`1.0` strongly favors more heated softcore faces.
- `hardcore_expression_intensity`: `0.0` is controlled, `0.5` is balanced
hardcore, `1.0` strongly favors ahegao-style, drooling, fucked-out, climax,
and messy orgasm expressions.
- `softcore_expression_enabled` and `hardcore_expression_enabled`: disable the
expression sentence for that half of the Insta/OF pair. The intensity values
are fallbacks; `SxCP Woman Slot` / `SxCP Man Slot` `expression_intensity`
overrides them when character slots are connected, and a disabled slot omits
that character's expression.
- `platform_style`: `hybrid`, `instagram`, or `onlyfans`.
- `continuity`: `same_creator_same_room` keeps the scene aligned while each
output keeps its own pose/composition; `same_creator_new_scene` keeps the same
creator descriptor but lets the hardcore scene use its own setting.
- `hardcore_clothing_continuity`: `none`, `same_outfit`, `partially_removed`,
`implied_nude`, or `explicit_nude`. This controls whether the hardcore prompt
references the softcore outfit, uses it displaced/removed, or makes Woman A
explicitly nude.
- `softcore_camera_mode`: base camera mode for the softcore output.
- `hardcore_camera_mode`: `from_camera_config`, `same_as_softcore`, or a
separate base camera mode for the hardcore output. `from_camera_config` is
neutral with no connected camera config, and uses `SxCP Camera Control` when
one is connected.
- `camera_detail`: `off`, `compact`, or `full` for the pair prompt camera text.
- `hardcore_detail_density`: `compact` keeps the Krea hardcore rewrite mostly
to the position/action sentence, `balanced` keeps one useful non-duplicated
motion or aftermath detail, and `dense` keeps more detail after dedupe. This
is separate from expression intensity.
## Built-In Categories
The node keeps the original generator controls:
- `category`: `auto_weighted`, `woman`, `man`, `couple`, `group_or_layout`, or a custom JSON category.
- `clothing`: `full` or `minimal`.
- `minimal_clothing_ratio`: `-1` disables mixing; `0.0` to `1.0` mixes minimal/full clothing.
- `ethnicity`: `any`, `european`, `mediterranean_mena`, `latina`,
`east_asian`, `southeast_asian`, `south_asian`, `black_african`,
`indigenous`, `mixed`, `asian`, or `white_asian`. Combined filter strings
such as `latina+south_asian` are also accepted in config JSON.
- `poses`: `standard` or `evocative`.
- `expression_enabled`: disable facial-expression text entirely for this row.
- `expression_intensity`: `0.0` favors mild, neutral, controlled expressions;
`0.5` favors balanced category expressions; `1.0` strongly favors the most
intense expressions available in the selected category. This affects custom
JSON categories such as `Provocative erotic clothes` and `Hardcore sexual
poses`.
- `standard_pose_ratio`: `-1` disables mixing; `0.0` to `1.0` mixes standard/evocative poses.
- `backside_bias`: `0.0` to `1.0`, applies to evocative single-subject poses.
- `figure`: `curvy`, `balanced`, `bombshell`.
- In split workflows, use `SxCP Advanced Filters` checkboxes instead of negative
toggles. Black/African and plus-size are positive include choices there.
- Optional `camera_config`: connect `SxCP Camera Control` to force selfie,
phone, lens, angle, distance, crop, and camera-priority behavior. This applies
to custom categories too, including `Hardcore sexual poses`.
`auto_weighted` uses the original batch mix: mostly women, then men, couples, and
group/layout rows. Direct categories generate only that selected category.
## Custom Categories
Add or edit JSON files in `categories/*.json`. Each file can define new main
categories, subcategories, and optional extensions to the built-in pools. Restart
or reload ComfyUI after changing JSON so dropdown choices are rebuilt.
Included JSON categories:
- `Casual clothes`
- `Men casual clothes`
- `Couple casual clothes`
- `Provocative erotic clothes`
- `Hardcore sexual poses`
Example:
```json
{
"version": 1,
"categories": [
{
"name": "Casual clothes",
"slug": "casual_clothes",
"subject_type": "woman",
"item_label": "Clothing",
"style": "tasteful adult fashion-editorial coloured-pencil comic illustration",
"subcategories": [
{
"name": "Streetwear",
"slug": "streetwear",
"items": [
"oversized hoodie with slim jeans and clean sneakers",
"cropped bomber jacket with cargo pants and chunky trainers"
],
"scenes": [
{
"slug": "city_crosswalk",
"prompt": "sunlit city crosswalk with storefront reflections"
}
],
"poses": [
"standing with one hand in a pocket",
"walking forward with a casual runway stride"
]
}
]
}
]
}
```
Custom categories do not need a Python generator. If no `prompt_template` is
provided, the node uses a generic composer that selects subject appearance,
scene, pose, expression, composition, and a random item from the selected
subcategory.
Reusable banks can be defined with top-level `scene_pools`,
`expression_pools`, and `composition_pools` in any `categories/*.json` file.
Categories, subcategories, and items can reference them with `scene_pools`,
`expression_pools`, and `composition_pools`; referenced pools are merged with
any local `scenes`, `expressions`, or `compositions`. This keeps expansion
scalable without duplicating the same bedroom, selfie, mirror, creator,
expression, camera, or group-sex framing across every subcategory.
Set `"inherit_scenes": false`, `"inherit_expressions": false`, or
`"inherit_compositions": false` on a subcategory or item when it should use only
its own pools instead of also inheriting parent category values. This is useful
for narrow subcategories such as group scenes, fetish sets, outdoor-only sets,
or any category where generic parent wording would be a bad match.
Example:
```json
{
"expression_pools": {
"creator_tease_faces": [
"direct creator-shot eye contact",
"heavy-lidded bedroom gaze"
]
},
"composition_pools": {
"creator_selfie_frames": [
"handheld selfie crop from face to hips",
"mirror selfie with phone visible and body framed clearly"
]
},
"scene_pools": {
"creator_selfie_rooms": [
{
"slug": "bedroom_phone_tripod",
"prompt": "private creator bedroom with a phone tripod, rumpled bedding, and warm lamps"
}
]
},
"categories": [
{
"name": "Example",
"subcategories": [
{
"name": "Selfie set",
"inherit_scenes": false,
"inherit_expressions": false,
"inherit_compositions": false,
"scene_pools": ["creator_selfie_rooms"],
"expression_pools": ["creator_tease_faces"],
"composition_pools": ["creator_selfie_frames"],
"items": ["simple outfit prompt"]
}
]
}
]
}
```
For large categories, prefer `item_templates` plus `item_axes` instead of writing
every final item by hand:
```json
{
"name": "Example clothes",
"subject_type": "woman",
"subcategories": [
{
"name": "Lingerie",
"item_templates": [
"{color} {fabric} {top} with {bottom} and {stockings}"
],
"item_axes": {
"color": ["black", "red", "ivory"],
"fabric": ["lace", "satin", "transparent mesh"],
"top": ["balconette bra", "open-cup bra"],
"bottom": ["matching thong", "high-cut g-string"],
"stockings": ["thigh-high stockings", "fishnet stockings"]
}
}
]
}
```
The node chooses one template, fills each placeholder from the matching axis,
then records the selected axis values in `metadata_json`.
Supported `subject_type` values:
- `single_any`
- `woman`
- `man`
- `couple`
- `group`
- `layout`
- `scene`
- `configured_cast`
`configured_cast` uses the node's `women_count` and `men_count` inputs. It adds
template fields for `{women_count}`, `{men_count}`, `{person_count}`,
`{cast_summary}`, `{scene_kind}`, and `{role_graph}`. This is intended for
categories where the same prompt generator should support couples, threesomes,
and larger groups.
`{role_graph}` is a generated choreography sentence that assigns roles to the
cast, such as who penetrates, who receives oral, and who joins from the side.
It is currently most useful for `Hardcore sexual poses`.
Subcategories, templates, and axis values can declare cast constraints:
```json
{
"name": "Threesomes",
"min_people": 3,
"item_axes": {
"act": [
{
"text": "strap-on penetration and cunnilingus",
"cast": "women_only"
},
{
"text": "male/male oral and anal contact",
"cast": "men_only"
},
{
"text": "front-and-back penetration",
"cast": "mixed"
}
]
}
}
```
Supported constraints:
- `min_women`, `max_women`
- `min_men`, `max_men`
- `min_people`, `max_people`
- `cast` or `requires`: `women_only`, `men_only`, `mixed`, `has_women`,
`has_men`, `solo`, `couple`, `threesome`, `group`
If an exact subcategory has a larger minimum cast size than the current
`women_count` and `men_count`, the node raises the effective cast count to that
minimum instead of failing. The original and effective counts are recorded in
`metadata_json.cast_count_adjustment`. Other impossible cast constraints still
raise a clear error instead of generating an impossible prompt.
When both cast counts are `0`, custom category selection treats the effective
configured cast as one adult woman so random filtering still has a valid cast.
Use the `subcategory` dropdown to select either `random` or an exact
`Main category / Subcategory` path. Exact paths override the `category` dropdown,
which is useful because ComfyUI does not provide dependent dropdowns from Python
alone.
## Seed Control
The main `seed` input is still the default master seed. Connect `SxCP Seed
Control` to `seed_config` when you want to lock or vary specific axes. Each
axis has its own mode plus seed value:
- `auto`: legacy behavior; `-1` follows the main seed, `0` or higher fixes that
axis to the entered value.
- `follow_main`: always follows the final generator's main `seed` input and
ignores the entered axis seed.
- `fixed`: always uses the entered axis seed.
- `random`: generates a fresh axis seed when the node runs.
For normal prompt iteration, `SxCP Seed Locker` is usually simpler:
- `base_seed`: the seed whose character/location/etc. you want to keep.
- `reroll_axis`: `none`, `content`, `person`, `scene`, `pose`, `role`,
`expression`, `composition`, `content_pose`, or `scene_pose`.
- `reroll_seed`: `-1` makes the selected axis follow the main prompt seed;
`0` or higher pins that selected axis to a specific seed.
Seed values in `auto` mode:
- `-1`: follow the main seed.
- `0` or higher: override only that axis.
Axes:
- `category_seed`: custom category selection when `custom_random` is used.
- `subcategory_seed`: random subcategory selection.
- `content_seed`: generated item content, such as outfit wording.
- `person_seed`: appearance/person selection.
- `scene_seed`: scene/environment selection.
- `pose_seed`: body pose selection. For `Hardcore sexual poses`, this also drives the generated sexual pose content.
- `role_seed`: participant choreography for `{role_graph}`. If left at `-1`, it follows `pose_seed`.
- `expression_seed`: facial expression selection.
- `composition_seed`: camera/composition selection.
Example workflow: if the person and scene are right but the pose is wrong, keep
`person_seed` and `scene_seed` fixed, then change `pose_seed`. If the cast roles
are wrong but the act wording is good, change `role_seed`. If the clothing or
sexual act wording is wrong, change `content_seed`; for pose-driven categories,
change `pose_seed`.
## Pool Extensions
Use `pool_extensions` to add new entries to built-in pools without editing
Python:
```json
{
"pool_extensions": {
"women_clothes": ["relaxed high-waist jeans with a fitted ribbed tank top"],
"men_clothes": ["clean white T-shirt with relaxed jeans and canvas sneakers"],
"poses": ["standing with a relaxed hand-on-hip pose"],
"expressions": ["easygoing half-smile"],
"scenes": [
{
"slug": "city_cafe",
"prompt": "quiet city cafe terrace with morning light and small round tables"
}
]
}
}
```
Known extension pools:
`women_clothes`, `women_clothes_minimal`, `men_clothes`, `men_clothes_minimal`,
`couple_outfits`, `couple_outfits_minimal`, `poses`, `evocative_poses`,
`backside_poses`, `expressions`, `compositions`, `props`, `figure_curvy`,
`figure_athletic`, `figure_bombshell`, `scenes`, `group_scenes`,
`layouts_full`, `layouts_minimal`, `group_compositions`, `group_ages`.
## Templates
A category, subcategory, or individual item can provide `prompt_template` and
`caption_template`. Templates can use these fields:
`{trigger}`, `{main_category}`, `{subcategory}`, `{item}`, `{item_label}`,
`{subject}`, `{subject_phrase}`, `{age}`, `{body}`, `{body_phrase}`, `{skin}`,
`{hair}`, `{eyes}`, `{figure}`, `{scene}`, `{pose}`, `{expression}`,
`{composition}`, `{style}`, `{positive_suffix}`, `{negative_prompt}`,
`{women_count}`, `{men_count}`, `{person_count}`, `{cast_summary}`,
`{scene_kind}`, `{role_graph}`.
If `prepend_trigger_to_prompt` is enabled, the node prepends the trigger to the
positive prompt. Disable it for output closer to the original script's `prompt`
field.