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 Builderprompt_builder / SxCP Global Seedprompt_builder / SxCP Seed Controlprompt_builder / SxCP Seed Lockerprompt_builder / util / SxCP SDXL Bucket Sizeprompt_builder / SxCP Camera Controlprompt_builder / SxCP Camera Orbit Controlprompt_builder / SxCP Qwen Camera Translatorprompt_builder / SxCP For Loop Startprompt_builder / SxCP For Loop Endprompt_builder / SxCP Loop Appendprompt_builder / SxCP Accumulatorprompt_builder / util / SxCP Preview Any As Textprompt_builder / SxCP Category Presetprompt_builder / SxCP Cast Controlprompt_builder / SxCP Cast Biasprompt_builder / SxCP Generation Profileprompt_builder / SxCP Ethnicity Listprompt_builder / SxCP Hair Lengthprompt_builder / SxCP Hair Colorprompt_builder / SxCP Hair Style/Cutprompt_builder / SxCP Character Manual Detailsprompt_builder / SxCP Advanced Filtersprompt_builder / SxCP Prompt Builder From Configsprompt_builder / SxCP Woman Slotprompt_builder / SxCP Man Slotprompt_builder / SxCP Character Slotprompt_builder / SxCP Character Profile Saveprompt_builder / SxCP Character Profile Loadprompt_builder / SxCP Caption Naturalizerprompt_builder / SxCP Krea2 Formatterprompt_builder / SxCP Insta/OF Optionsprompt_builder / SxCP Insta/OF Prompt Pair
It outputs:
promptnegative_promptcaptionmetadata_jsoncategorysubcategory
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 Presetoutputscategory_configfor broad intent such as legacy random, full random, women casual, men casual, couple casual, provocative erotic, or hardcore pose.SxCP Cast Controloutputscast_configplus rawwomen_countandmen_count, so couple/two-women/two-men/group setups can be reused.SxCP Cast Biasoutputs the same cast sockets, but chooses counts from weighted lists. Withwomen_start_count=1,women_weights=0.6,0.2means 60% one woman and 20% two women; withmen_start_count=0,men_weights=0.5,0.3means 50% no man and 30% one man.SxCP Location Pooloutputslocation_config.replaceuses only the selected/custom location pool;addkeeps the category's own locations and adds yours. Custom lines can be plain location text, orslug: location text.SxCP Composition Pooloutputscomposition_configto control framing separately from location. Use it when category framing mentions unrelated outfit-check details such as shoes, bags, or mirror poses.SxCP Location Themeoutputs matchedlocation_configandcomposition_config. Themes such asclassical_library,semi_public_affair,hotel_corridor,parking_garage, andtheater_backstagekeep scene and framing compatible.SxCP Generation Profileoutputsgeneration_profilefor common behavior presets such as casual-clean, evocative-softcore, hardcore-intense, Krea2-friendly, or Flux-original. Its clothing and pose overrides can berandom, andexpression_intensity_mode=randommakes expression strength vary by seeded row.SxCP Ethnicity Listoutputs a reusable ethnicity filter from checkboxes. It includes broad groups and narrower European/Mediterranean groups such asfrench_european,germanic_european,nordic_european,slavic_european,italian_mediterranean, andiberian_mediterranean. Connectethnicityto a prompt or slotethnicity_listinput, or connectfilter_configto generator-levelfilter_config.SxCP Advanced Filtersoutputsfilter_configfor appearance include checkboxes, figure, and plus-size inclusion.SxCP Prompt Builder From Configsconsumes 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 or
Camera Orbit Control, Location Theme or Location Pool + Composition Pool,
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:
- A regular generation lane: config nodes into
Prompt Builder From Configs, then optionalCaption NaturalizerandKrea2 Formatter. - An Insta/OF dual-generation lane:
Insta/OF Options, seed/camera controls,Insta/OF Prompt Pair, then optional formatter/naturalizer nodes. - 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.
Loop Nodes
SxCP For Loop Start and SxCP For Loop End provide a lightweight replacement
for the easy-use for-loop dependency. They use the same recursive ComfyUI loop
pattern, but add a dedicated collector output for building a result sequence.
Basic loop wiring:
- Connect
For Loop Start.flowtoFor Loop End.flow. - Use
For Loop Start.indexinside the loop for row/seed/index changes. - Connect the per-iteration output you want to keep, such as an image, latent,
prompt, or metadata string, to
For Loop End.collect_value. - Optionally connect
For Loop Start.collectedtoFor Loop End.collected. If omitted, the end node uses the start collector internally. - After the loop finishes, use
For Loop End.collectedas the combined output.
For Loop Start.index is 1-based so it can be wired directly into prompt-builder
row_number inputs. For Loop Start.skip skips the first N iterations while
keeping the remaining row numbers stable. For example, total=10 and skip=1
runs indexes 2..10; skip=5 runs indexes 6..10. This is useful when you
want to resume a loop without changing index-derived seeds or row numbers.
collection_mode controls how values are stored:
auto_batch: concatenates image tensors or latent samples when possible, otherwise falls back to a Python list.image_batch: prefers image tensor batching.latent_batch: prefers latentsamplesbatching.list: always appends each iteration result to a list.string_lines: joins each collected value with newlines.
value1, value2, and later slots are normal carry-through channels for state
you want to update each iteration. They are separate from the collector and grow
dynamically in the UI as you connect them.
SxCP Accumulator stores outputs across executions under a store_key or the
node id. Put it after an image-producing step inside or after a loop and connect
the generated image.
For camera/pose tuning, leave action=append_variant. Every rerun is kept as a
new variant, so you can regenerate row 1 several times without managing ids. If
you connect For Loop Start.index to entry_id, variants are labelled by row
internally; they still append instead of replacing.
For deterministic loop resume/dedupe, set action=replace_by_entry_id and
connect For Loop Start.index to entry_id. Optional entry_tag lets multiple
branches share the same row index without overwriting each other, such as
soft, hard, or upscale.
Its outputs are:
collection: all stored values, or images when no explicitvalueis wired.image_batch: all stored images as one ComfyUI image batch when they share the same height and width. Setimage_batch_mode=resize_to_firstif you want mixed sizes resized into one batch.image_list: a ComfyUI list output containing each stored image separately.image_batch_1..4: same-size grouped batches for mixed-format runs, so a square group and a portrait group can be saved or processed separately.
ComfyUI image batches require matching dimensions. For mixed image formats, use
image_list or the grouped image_batch_1..4 outputs instead of image_batch.
SxCP Accumulator Preview can show images as a wrapped grid or as a carousel.
Set view_mode=carousel to inspect one image at a time with the Prev and
Next buttons. zoom_level controls thumbnail size in grid mode and the image
area in carousel mode; carousel_index stores the selected carousel position.
SxCP Preview Any As Text is a persistent text preview for arbitrary values.
Connect any output to value; the node renders strings directly and formats
dict/list/tensor-like values as readable text. After execution, its
preview_text widget is updated by the frontend and is serialized in the
workflow. Save the workflow after a run and the preview text will still be
there after reload.
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 age,
ethnicity, body, expression, and config inputs. Leave fields on random to let
the generator fill that part from the normal pools.
Use SxCP Character Manual Details when you need exact manual text for a slot:
manual age, manual body, body phrase, skin, hair, eyes, softcore outfit, or
hardcore clothing. Connect Character Manual Details.manual to the slot's
manual input. Manual detail nodes are chainable through their top manual
input/output.
Each slot has slot_seed. Leave it at -1 to follow the generator's normal
person seed. Set any fixed value when the slot's random fields should resolve
as one stable character across scene, pose, outfit, or row rerolls. This seed is
shared by that slot's random age/body/appearance choices, so you can keep the
same participant while changing other generation axes.
Connect SxCP Ethnicity List.ethnicity to a slot's ethnicity_list input when
that character should randomize inside a selected heritage list. This is useful
for narrowing broad groups, for example choosing French/Germanic/Nordic/Slavic
European entries instead of the entire european pool.
Hair can be controlled the same way with chainable characteristic nodes. Connect
the final hair_config output to a slot's hair_config input:
Hair Length -> Hair Color -> Hair Style/Cut -> Woman Slot.hair_config
Each hair node only changes its own axis and passes the rest through. For
example, select long in Hair Length, select the blonde variants you allow in
Hair Color, then select waves and ponytail in Hair Style/Cut. If the slot's
manual details include hair, that exact text overrides the hair config.
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 usefull; men usecompact.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_intensityandhardcore_expression_intensity: override the option-node expression fallback for that character and that output half.softcore_outfitandhardcore_clothingare provided bySxCP Character Manual Detailsand connected through the slot'smanualinput. ForWoman A, a hardcore clothing override replaces the globalhardcore_clothing_continuitytext 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, a character_slot, or from manual fields. The profile stores
age, body/body phrase, skin, hair, eyes, figure, and subject type. To save a
Woman Slot, connect Woman Slot.character_slot to
Character Profile Save.character_slot, set source=character_slot, enter a
name, run the workflow once so the save node caches that exact profile, then
click Save Profile Now. The button writes the cached profile directly and does
not queue or regenerate the workflow, so it saves the character you just liked.
Otherwise the node just outputs profile JSON for direct wiring. Saved files are
written under profiles/<profile_name>.json; saved profile files are ignored by
git. The hidden save_now trigger remains for legacy/API use, but the visible
button does not use it.
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 load-time override fields. Leave them blank or on keep_profile to
use the saved value; fill only the attributes you want to change for this
workflow, such as override_age, override_body, override_skin,
override_hair, override_eyes, override_figure, or
override_descriptor_detail. Overrides affect both the character_profile and
character_cast outputs, but they do not rewrite the saved profile file.
The load node 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 for the
older single-primary-character path. Connect character_cast instead when you
want the loaded profile to act like a slot in a cast chain.
When loaded through character_profile, profile reuse applies to structured
JSON-category single woman/man rows and to the primary creator in Insta/OF pair
mode. When loaded through character_cast, the same saved appearance behaves
like an auto-labeled slot and can participate in couple/group casts. The outfit,
scene, pose, expression, and composition can still change while the saved
character appearance remains stable.
SxCP Global Seed is the simplest reproducibility node. Set global_seed,
connect its seed output to the prompt node's seed input, and connect its
seed_config output to the prompt node's seed_config input. With the same
row number, settings, category files, and sampler seed, this recreates the same
prompt result. Manual fields and explicitly fixed per-axis or character-slot
seeds still override the global seed for those parts.
SxCP Seed Control outputs seed_config, which can be connected to the prompt
builder's optional seed_config input. When an axis is set to random, the
visible seed value is materialized before the workflow queues, and that exact
value is used for the queued prompt. The mode returns to random after queueing
so the next run can reroll. Use Lock Random Seeds Now on the node when you want
to convert the current random axes into fixed reusable seeds.
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 SDXL Bucket Size randomly selects one of the built-in SDXL bucket
resolutions and outputs width, height, and a resolution string. Use
orientation to restrict the pool to portrait, square, or landscape. Leave
bucket_index=0 for random selection, or set bucket_index to pick a specific
position inside the filtered pool. Connect SxCP Global Seed or Seed Locker's
seed_config when the bucket choice must be reproducible.
SxCP Krea2 Resolution Selector is a simple size picker: choose megapixels
and aspect_ratio, then use the output width and height. It assumes local
Krea2 Turbo 2K limits, searches for the best multiple-of-16 size, and clamps the
selected megapixel target when that aspect ratio cannot fit it. max_for_aspect
returns the largest valid size for the chosen ratio. The official Krea API
aspect ratios are listed first, with a few local helper ratios such as 8:9
after them.
SxCP Camera Control and SxCP Camera Orbit Control output camera_config,
which can be connected to the prompt builder or the Insta/OF pair node. They
make 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, oraction_cam.shot_size:auto,full_body,three_quarter,waist_up,close_up, orextreme_close_up.angle:auto,eye_level,high_angle,low_angle,overhead,side_profile,rear_view, ormirror_reflection.lens:auto,smartphone_wide,ultra_wide,portrait_lens,telephoto, ormacro_detail.distance:auto,arm_length,near_body,bedside, orroom_corner.orientation:auto,vertical_story,square_feed, orhorizontal.phone_visibility:auto,phone_visible,phone_hidden,screen_reflection, orring_light_visible.priority:soft_hint,strong, orlocked.camera_detail:offemits no camera sentence,compactemits one short camera sentence, andfullemits the full detailed camera constraint.
SxCP Camera Orbit Control is the numeric/directable version inspired by
multi-angle camera nodes. It maps horizontal_angle, vertical_angle, and
zoom into a stable prompt such as 135-degree back-right quarter view, elevated shot, medium shot. Use it when the model needs an exact front, side,
back-quarter, low, high, or overhead style camera anchor. Its first output is
the same camera_config type, so it can replace SxCP Camera Control anywhere.
Orbit controls:
horizontal_angle:0front,90right side,180back,270left side, with quarter views between them.vertical_angle: negative values are low-angle,0is eye-level, positive values move toward elevated/high-angle.zoom:0-2wide,2-6medium,6-10close unlessframingoverrides it.subject_focus: optionally centers face, torso, hips, full body, main action, contact points, or the environment.include_degrees: keeps the numeric angle in the emitted camera phrase.
If you use ComfyUI-qwenmultiangle, keep its nicer Three.js camera viewer and
add SxCP Qwen Camera Translator after it:
- Connect Qwen Multiangle Camera
promptto translatorqwen_prompt. - Optionally connect Qwen Multiangle Camera
camera_infoto translatorcamera_info; this keeps exact numeric angle/zoom from the viewer. - Connect translator
camera_configtoPrompt Builder,Prompt Builder From Configs, orInsta/OF Prompt Pair.
The translator accepts the Qwen labels such as front-right quarter view,
eye-level shot, and medium shot, then emits the same camera_config format
as the native camera nodes. suppress_phone_visibility is enabled by default so
generic Qwen camera views do not add phone hidden or other phone wording.
For coworking-style locations, the prompt builder also uses the translated
camera geometry to add a location-aware framing sentence. It currently targets
coworking lounge, business cafe, and empty office scenes: front/side/back
views, zoom, and elevation change which desks, windows, laptop tables, glass
partitions, counters, or office rows are kept visible. In male-POV setups this
becomes a first-person spatial description and the external camera sentence is
suppressed.
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, orcaption_or_prompt.detail_level:concise,balanced, ordense.style_policy:drop_style_tailremoves old fixed style tails;keep_style_termskeeps style descriptions in the rewritten text.trigger: defaults tosxcppnl7.include_trigger: prepends the trigger as its own sentence.
It outputs:
natural_captionmethod
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 womanandlate 60s adult manare 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_triggerif you still need a LoRA trigger in the positive prompt. style_mode:preservekeeps the current generated style text,photographicconverts the style tail toward creator-photo language, andminimalomits most style text.- For Insta/OF paired metadata, the node returns both
krea_softcore_promptandkrea_hardcore_prompt, with separate softcore and hardcore negatives. - Insta/OF cast metadata is rewritten as direct named-character prose such as
Woman A is ...andMan A is ..., so Krea2 does not have to interpret aCast descriptors:label. - Man slots set to
presence_mode=povare 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_promptnegative_promptkrea_softcore_promptkrea_hardcore_promptsoftcore_negative_prompthardcore_negative_promptmethod
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_prompthardcore_promptsoftcore_negative_prompthardcore_negative_promptsoftcore_captionhardcore_captionshared_descriptormetadata_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 or
SxCP Camera Orbit Control to the pair node's optional camera_config input.
For different softcore and hardcore camera views, connect separate camera
configs to softcore_camera_config and hardcore_camera_config; those override
the shared camera_config for their side.
Options:
softcore_cast:soloorsame_as_hardcore.hardcore_cast:use_counts,couple,threesome, orgroup.hardcore_women_countandhardcore_men_count: used whenhardcore_castisuse_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, orexplicit_nude. Insta/OF softcore uses dedicated outfit pools so teaser prompts do not randomly pull hardcore-adjacent harness, microwear, or shirtless partner styling.explicit_nudeis available when you want visible nude creator-shot framing without a sex act.hardcore_level:explicitorhardcore.softcore_expression_intensity: fallback when no connected character slot setssoftcore_expression_intensity.0.0is mild/controlled,0.5is sensual,1.0strongly favors more heated softcore faces.hardcore_expression_intensity: fallback when no connected character slot setshardcore_expression_intensity.0.0is controlled,0.5is balanced hardcore,1.0strongly favors stronger hardcore expressions.softcore_expression_enabledandhardcore_expression_enabled: disable the expression sentence for that half of the Insta/OF pair. The intensity values are fallbacks;SxCP Woman Slot/SxCP Man Slotexpression_intensityoverrides them when character slots are connected, and a disabled slot omits that character's expression.platform_style:hybrid,instagram, oronlyfans.continuity:same_creator_same_roomkeeps the scene aligned while each output keeps its own pose/composition;same_creator_new_scenekeeps the same creator descriptor but lets the hardcore scene use its own setting.hardcore_clothing_continuity:none,same_outfit,partially_removed,implied_nude, orexplicit_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_clothingonSxCP Woman SlotorSxCP Man Slottakes priority for that character.softcore_camera_mode:from_camera_configor a base camera mode for the softcore output. The default is stillhandheld_selfie.hardcore_camera_mode:from_camera_config,same_as_softcore, or a separate base camera mode for the hardcore output.from_camera_configis neutral with no connected camera config, and usesSxCP Camera ControlorSxCP Camera Orbit Controlwhen one is connected.- Pair camera inputs: use shared
camera_configfor one camera on both sides, or usesoftcore_camera_configandhardcore_camera_configfor two separate Qwen/Orbit camera controls. camera_detail:from_camera_config,off,compact, orfullfor the pair prompt camera text. Usefrom_camera_configwithSxCP Qwen Camera Translatorso the translator's own detail setting is preserved.hardcore_detail_density:compactkeeps the Krea hardcore rewrite mostly to the position/action sentence,balancedkeeps one useful non-duplicated motion or aftermath detail, anddensekeeps more detail after dedupe. This is separate from expression intensity.
Built-In Categories
The node keeps the original generator controls:
category:auto_weighted,auto_full,woman,man,couple,group_or_layout,custom_random, or a custom JSON category.clothing:random,full, orminimal.minimalis the local adult wardrobe pool. It can roll sheer mesh, see-through lace, transparent layers, body tape, micro pieces, and exposed nipple wording; it is not limited to older softcore-safe euphemisms.minimal_clothing_ratio:-1disables ratio mixing;0.0to1.0mixes minimal/full clothing whenclothingis fixed.ethnicity:any,european,mediterranean_mena,latina,east_asian,southeast_asian,south_asian,black_african,indigenous,mixed,asian, orwhite_asian. Combined filter strings such aslatina+south_asianare also accepted in config JSON.poses:random,standard, orevocative.expression_enabled: disable facial-expression text entirely for this row.expression_intensity:-1randomizes per row;0.0favors mild, neutral, controlled expressions;0.5favors balanced category expressions;1.0strongly favors the most intense expressions available in the selected category. This affects custom JSON categories such asProvocative erotic clothesandHardcore sexual poses.standard_pose_ratio:-1disables ratio mixing;0.0to1.0mixes standard/evocative poses whenposesis fixed.backside_bias:0.0to1.0, applies to evocative single-subject poses.figure:random,curvy,balanced,bombshell.- In split workflows, use
SxCP Advanced Filterscheckboxes instead of negative toggles. Black/African and plus-size are positive include choices there. - Optional
camera_config: connectSxCP Camera ControlorSxCP Camera Orbit Controlto force selfie, phone, lens, angle, numeric orbit, crop, and camera-priority behavior. This applies to custom categories too, includingHardcore sexual poses.
auto_weighted uses the original batch mix: mostly women, then men, couples, and
group/layout rows. auto_full keeps that original random source in the pool but
also rolls the JSON categories, so it can land on casual, erotic, or hardcore
categories from the same easy all-in-one node. custom_random rolls only JSON
categories. 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 clothesMen casual clothesCouple casual clothesProvocative erotic clothesHardcore sexual poses
Example:
{
"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:
{
"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:
{
"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_anywomanmancouplegrouplayoutsceneconfigured_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.
For Hardcore sexual poses, SxCP Hardcore Position Pool also includes an
outercourse family and position checkboxes for boobjob, testicle_sucking,
penis_licking, and footjob. SxCP Hardcore Action Filter exposes
outercourse_only and allow_outercourse so these can be selected separately
from oral or penetration. If a man slot is set to presence_mode=pov, these
positions emit first-person wording from that participant's viewpoint.
Subcategories, templates, and axis values can declare cast constraints:
{
"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_womenmin_men,max_menmin_people,max_peoplecastorrequires: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;-1follows the main seed,0or higher fixes that axis to the entered value.follow_main: always follows the final generator's mainseedinput and ignores the entered axis seed.fixed: always uses the entered axis seed.random: generates a fresh visible axis seed when the workflow queues.
The Lock Random Seeds Now button turns every current random axis into a
visible concrete seed and switches those axes to fixed.
For exact prompt reproduction, SxCP Global Seed is the shortest path:
- Connect
seedto the generatorseedinput. - Connect
seed_configto the generatorseed_configinput. - Keep character
slot_seed=-1when that character should follow the global person seed; setslot_seedonly when that character should be independently pinned.
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, orscene_pose.reroll_seed:-1makes the selected axis follow the main prompt seed;0or higher pins that selected axis to a specific seed.
Seed values in auto mode:
-1: follow the main seed.0or higher: override only that axis.
Axes:
category_seed: category selection whenauto_fullorcustom_randomis used; also drivesSxCP Cast Biaswhen itsseed_configinput is connected.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. ForHardcore sexual poses, this also drives the generated sexual pose content.role_seed: participant choreography for{role_graph}. If left at-1, it followspose_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:
{
"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.