Use hardcore family metadata in SDXL and captions

This commit is contained in:
2026-06-26 16:43:31 +02:00
parent 8668dfec9d
commit 2f7c359fab
5 changed files with 108 additions and 16 deletions
+35 -1
View File
@@ -5,8 +5,10 @@ import re
from typing import Any
try:
from .hardcore_action_metadata import normalize_hardcore_action_family
from .prompt_hygiene import sanitize_prose_text
except ImportError: # Allows local smoke tests with `python -c`.
from hardcore_action_metadata import normalize_hardcore_action_family
from prompt_hygiene import sanitize_prose_text
@@ -45,6 +47,28 @@ ITEM_LABELS = (
"Clothing",
)
ACTION_FAMILY_CAPTION_LABELS = {
"foreplay": "foreplay action",
"outercourse": "non-penetrative action",
"oral": "oral action",
"penetration": "penetrative action",
"toy_double": "toy-assisted double-contact action",
"climax": "climax action",
}
POSITION_FAMILY_CAPTION_LABELS = {
"penetrative": "penetrative action",
"foreplay": "foreplay action",
"interaction": "interaction beat",
"manual": "manual action",
"oral": "oral action",
"outercourse": "non-penetrative action",
"anal": "anal action",
"climax": "climax action",
"threesome": "three-person action",
"group": "group action",
}
def _clean_text(value: Any) -> str:
text = "" if value is None else str(value)
@@ -100,6 +124,16 @@ def _human_join(parts: list[str]) -> str:
return f"{', '.join(parts[:-1])}, and {parts[-1]}"
def _metadata_action_label(row: dict[str, Any], default: str = "sexual pose") -> str:
position_family = _clean_text(row.get("position_family")).lower()
if position_family in POSITION_FAMILY_CAPTION_LABELS:
return POSITION_FAMILY_CAPTION_LABELS[position_family]
action_family = normalize_hardcore_action_family(row.get("action_family"))
if action_family in ACTION_FAMILY_CAPTION_LABELS:
return ACTION_FAMILY_CAPTION_LABELS[action_family]
return default
def _prompt_cast_descriptors(text: str) -> str:
return _clean_text(text).replace("Woman A / primary creator:", "Woman A:")
@@ -508,7 +542,7 @@ def _configured_cast_from_row(row: dict[str, Any], detail_level: str, keep_style
if role_graph:
parts.append(role_graph)
if item:
parts.append(f"The sexual pose is {item}")
parts.append(f"The {_metadata_action_label(row)} is {item}")
scene_bits = []
if scene:
scene_bits.append(f"set in {scene}")