684 lines
29 KiB
Markdown
684 lines
29 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.
|
|
|
|
For Insta/OF pairs, slots also expose character-level overrides:
|
|
|
|
- `softcore_expression_intensity` and `hardcore_expression_intensity`: override
|
|
the option-node expression fallback for that character and that output half.
|
|
- `softcore_outfit`: overrides the character's softcore clothing. For `Woman A`
|
|
this replaces the generated teaser outfit; for partners it replaces random
|
|
partner styling.
|
|
- `hardcore_clothing`: adds direct character clothing/nudity wording in the
|
|
hardcore output. A `Woman A` hardcore clothing override replaces the global
|
|
`hardcore_clothing_continuity` text to avoid contradictory clothing 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`: fallback when no connected character slot
|
|
sets `softcore_expression_intensity`. `0.0` is mild/controlled, `0.5` is sensual,
|
|
`1.0` strongly favors more heated softcore faces.
|
|
- `hardcore_expression_intensity`: fallback when no connected character slot
|
|
sets `hardcore_expression_intensity`. `0.0` is controlled, `0.5` is balanced
|
|
hardcore, `1.0` strongly favors stronger hardcore 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. It is a fallback for Woman A; `hardcore_clothing` on
|
|
`SxCP Woman Slot` or `SxCP Man Slot` takes priority for that character.
|
|
- `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.
|