Filter incompatible SDXL route tags

This commit is contained in:
2026-06-27 18:41:17 +02:00
parent 5ca5f1b858
commit cac4fe47cd
4 changed files with 123 additions and 5 deletions
+24 -4
View File
@@ -52,6 +52,14 @@ HARDCORE_NOISE_TERMS = (
"the scene contains",
)
INCOMPATIBLE_SDXL_TAGS = {
"penetration": ("oral sex", "outercourse", "anal sex", "manual stimulation"),
"oral": ("penetrative sex", "penetration", "anal sex", "outercourse"),
"outercourse": ("penetrative sex", "penetration", "oral sex", "anal sex"),
"manual": ("penetrative sex", "penetration", "oral sex", "anal sex"),
"anal": ("oral sex", "outercourse"),
}
def _json(value: Any) -> str:
return json.dumps(value, ensure_ascii=True, sort_keys=True)
@@ -235,7 +243,13 @@ def _text_issues(label: str, value: Any, *, min_len: int = 8) -> list[str]:
return issues
def _formatter_issues(name: str, formats: dict[str, Any], *, is_pov: bool = False) -> list[str]:
def _formatter_issues(
name: str,
formats: dict[str, Any],
*,
row: dict[str, Any] | None = None,
is_pov: bool = False,
) -> list[str]:
issues: list[str] = []
krea = formats["krea"]
sdxl = formats["sdxl"]
@@ -274,6 +288,12 @@ def _formatter_issues(name: str, formats: dict[str, Any], *, is_pov: bool = Fals
for noise in HARDCORE_NOISE_TERMS:
if noise in lower_krea:
issues.append(f"{name}.krea_prompt: hardcore_noise:{noise}")
if isinstance(row, dict):
family = str(row.get("action_family") or "").strip()
sdxl_lower = f", {sdxl_prompt.lower()}, "
for tag in INCOMPATIBLE_SDXL_TAGS.get(family, ()):
if f", {tag}, " in sdxl_lower:
issues.append(f"{name}.sdxl_prompt: incompatible_family_tag:{family}:{tag}")
if is_pov:
if "viewer" not in lower_krea or "first-person" not in lower_krea:
issues.append(f"{name}.krea_prompt: pov_wording_missing")
@@ -324,7 +344,7 @@ def _case_report(
is_pov: bool = False,
) -> dict[str, Any]:
formats = _format_metadata(metadata, target)
issues = _formatter_issues(name, formats, is_pov=is_pov)
issues = _formatter_issues(name, formats, row=metadata, is_pov=is_pov)
issues.extend(_route_metadata_issues(name, metadata))
if target == "softcore":
issues.extend(_softcore_issues(f"{name}.krea_prompt", formats["krea"].get("krea_prompt")))
@@ -354,11 +374,11 @@ def _pair_reports(name: str, pair: dict[str, Any], *, include_prompts: bool) ->
hard_row = dict(pair.get("hardcore_row") or {})
soft_formats = _format_metadata(pair, "softcore")
hard_formats = _format_metadata(pair, "hardcore")
soft_issues = _formatter_issues(f"{name}.softcore", soft_formats)
soft_issues = _formatter_issues(f"{name}.softcore", soft_formats, row=soft_row)
soft_issues.extend(_route_metadata_issues(f"{name}.softcore", soft_row))
soft_issues.extend(_softcore_issues(f"{name}.softcore.krea_prompt", soft_formats["krea"].get("krea_prompt")))
hard_is_pov = bool(hard_row.get("pov_character_labels"))
hard_issues = _formatter_issues(f"{name}.hardcore", hard_formats, is_pov=hard_is_pov)
hard_issues = _formatter_issues(f"{name}.hardcore", hard_formats, row=hard_row, is_pov=hard_is_pov)
hard_issues.extend(_route_metadata_issues(f"{name}.hardcore", hard_row))
reports = [
{
+45
View File
@@ -4604,7 +4604,30 @@ def smoke_sdxl_tag_policy() -> None:
_expect(deps.axis_value_tags is sdxl_tag_policy.axis_value_tags, "SDXL route deps lost axis-value tag policy")
_expect(deps.camera_tags is sdxl_tag_policy.camera_tags, "SDXL route deps lost camera tag policy")
_expect(deps.explicit_tags is sdxl_tag_policy.explicit_tags, "SDXL route deps lost explicit tag policy")
_expect(
deps.filter_incompatible_route_tags is sdxl_tag_policy.filter_incompatible_route_tags,
"SDXL route deps lost route-family tag filter",
)
_expect(deps.softcore_pair_tags is sdxl_tag_policy.softcore_pair_tags, "SDXL route deps lost softcore pair tag policy")
mouth_nearby_tags = sdxl_tag_policy.explicit_tags(
"missionary penetration with mouth close to the ear",
1.29,
)
_expect("penetration" in mouth_nearby_tags, "SDXL explicit tags lost penetration signal")
_expect("oral sex" not in mouth_nearby_tags, "SDXL explicit tags should not treat nearby mouth wording as oral")
outercourse_filtered_tags = sdxl_tag_policy.filter_incompatible_route_tags(
["outercourse", "penis licking", "oral sex", "penetration"],
_fixture_hardcore_row(
action_family="outercourse",
position_family="outercourse",
position_key="penis_licking",
position_keys=["penis_licking"],
),
)
_expect("outercourse" in outercourse_filtered_tags, "SDXL route filter removed matching outercourse tag")
_expect("penis licking" in outercourse_filtered_tags, "SDXL route filter removed specific outercourse key")
_expect("oral sex" not in outercourse_filtered_tags, "SDXL route filter kept incompatible oral tag")
_expect("penetration" not in outercourse_filtered_tags, "SDXL route filter kept incompatible penetration tag")
stale_character_row = {
"prompt": "Characters: 99-year-old adult man, stale body, stale skin, stale hair, stale eyes.",
@@ -4731,6 +4754,28 @@ def smoke_sdxl_tag_routes() -> None:
).as_text()
for required in ("(naked:1.29)", "pussy", "penis", "penetration"):
_expect(required in metadata_tags, f"SDXL row tags lost structured explicit metadata tag: {required}")
outercourse_noise_row = _fixture_hardcore_row(
item="penis-licking outercourse position with tongue along the penis shaft",
pose="configured outercourse pose",
role_graph="Woman A bends low while her tongue runs along Man A's penis shaft.",
source_role_graph="Woman A bends low while her tongue runs along Man A's penis shaft.",
item_axis_values={
"position": "penis-licking outercourse position",
"outer_act": "tongue along the penis shaft",
},
action_family="outercourse",
position_family="outercourse",
position_key="penis_licking",
position_keys=["penis_licking"],
)
outercourse_noise_tags = sdxl_tag_routes.row_core_tags_result(
sdxl_tag_routes.SDXLRowTagRequest(outercourse_noise_row, 1.29),
deps,
).as_text()
_expect("outercourse" in outercourse_noise_tags, "SDXL outercourse row lost matching family tag")
_expect("penis licking" in outercourse_noise_tags, "SDXL outercourse row lost specific position key")
_expect("oral sex" not in outercourse_noise_tags, "SDXL outercourse row kept incompatible oral tag")
_expect("penetration" not in outercourse_noise_tags, "SDXL outercourse row kept incompatible penetration tag")
pair = pb.build_insta_of_pair(
row_number=1,