From 15b28b422f6fbad98518dacbfe4782b518d09a6f Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Sat, 27 Jun 2026 22:14:20 +0200 Subject: [PATCH] Preserve hyphenated SDXL tags --- sdxl_tag_policy.py | 2 +- tools/prompt_route_simulation.py | 7 +++++++ tools/prompt_smoke.py | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/sdxl_tag_policy.py b/sdxl_tag_policy.py index 7bcf4e4..f2f572d 100644 --- a/sdxl_tag_policy.py +++ b/sdxl_tag_policy.py @@ -63,7 +63,7 @@ def split_tag_text(text: Any) -> list[str]: text, flags=re.IGNORECASE, ) - text = re.sub(r"\b(?:and|with)\b", ",", text, flags=re.IGNORECASE) + text = re.sub(r"(? list[str]: return [] +def _sdxl_hyphen_fragment_issues(name: str, sdxl_prompt: str) -> list[str]: + if re.search(r"\b[a-z]+-,\s*-[a-z]+", sdxl_prompt, flags=re.IGNORECASE): + return [f"{name}.sdxl_prompt: broken_hyphenated_tag"] + return [] + + def _trace_dict(formatter_name: str, payload: dict[str, Any]) -> tuple[dict[str, Any], str]: trace_text = str(payload.get("route_trace_json") or "") if not trace_text: @@ -720,6 +726,7 @@ def _formatter_issues( issues.extend(_composition_label_issues(name, prompts)) issues.extend(_sdxl_composition_tag_issues(name, sdxl_prompt)) issues.extend(_sdxl_expression_label_issues(name, sdxl_prompt)) + issues.extend(_sdxl_hyphen_fragment_issues(name, sdxl_prompt)) for label, value in ( (f"{name}.krea_negative", krea.get("negative_prompt")), diff --git a/tools/prompt_smoke.py b/tools/prompt_smoke.py index bd39a4d..06ec3ae 100644 --- a/tools/prompt_smoke.py +++ b/tools/prompt_smoke.py @@ -4676,6 +4676,10 @@ def smoke_sdxl_tag_policy() -> None: _expect("hands braced on thighs" in axis_tags, "SDXL axis tags lost selected detail axis") _expect("close body alignment" in axis_tags, "SDXL axis tags lost split detail axis") _expect("random" not in axis_tags, "SDXL axis tags should ignore random placeholders") + hyphenated_tags = sdxl_tag_policy.split_tag_text("front-and-back penetration with hands on hips") + _expect("front-and-back penetration" in hyphenated_tags, "SDXL tag splitter broke hyphenated and compound") + _expect("front-" not in hyphenated_tags and "-back penetration" not in hyphenated_tags, "SDXL tag splitter emitted broken hyphen fragments") + _expect("hands on hips" in hyphenated_tags, "SDXL tag splitter stopped splitting non-hyphenated with connector") _expect( sdxl_formatter._camera_tags(row) == sdxl_tag_policy.camera_tags(row), "SDXL formatter camera helper should delegate to sdxl_tag_policy",