Extract SDXL tag route assembly
This commit is contained in:
+32
-96
@@ -6,11 +6,13 @@ from typing import Any
|
||||
try:
|
||||
from . import formatter_input as input_policy
|
||||
from . import route_metadata as route_metadata_policy
|
||||
from . import sdxl_tag_routes
|
||||
from . import sdxl_presets as sdxl_policy
|
||||
from .prompt_hygiene import sanitize_negative_text, sanitize_tag_prompt
|
||||
except ImportError: # Allows local smoke tests with `python -c`.
|
||||
import formatter_input as input_policy
|
||||
import route_metadata as route_metadata_policy
|
||||
import sdxl_tag_routes
|
||||
import sdxl_presets as sdxl_policy
|
||||
from prompt_hygiene import sanitize_negative_text, sanitize_tag_prompt
|
||||
|
||||
@@ -283,43 +285,29 @@ def _explicit_tags(text: str, nude_weight: float) -> list[str]:
|
||||
return tags
|
||||
|
||||
|
||||
def _sdxl_tag_route_dependencies() -> sdxl_tag_routes.SDXLTagRouteDependencies:
|
||||
return sdxl_tag_routes.SDXLTagRouteDependencies(
|
||||
clean=_clean,
|
||||
row_value=_row_value,
|
||||
tag_key=_tag_key,
|
||||
add=_add,
|
||||
add_one=_add_one,
|
||||
count_tag=_count_tag,
|
||||
infer_counts=_infer_counts,
|
||||
normal_character_tags=_normal_character_tags,
|
||||
character_tags_from_descriptor=_character_tags_from_descriptor,
|
||||
metadata_family_tags=_metadata_family_tags,
|
||||
formatter_hint_tags=_formatter_hint_tags,
|
||||
camera_tags=_camera_tags,
|
||||
explicit_tags=_explicit_tags,
|
||||
)
|
||||
|
||||
|
||||
def _row_core_tags(row: dict[str, Any], nude_weight: float) -> list[str]:
|
||||
tags: list[str] = []
|
||||
seen: set[str] = set()
|
||||
women, men = _infer_counts(row)
|
||||
for tag in _count_tag(women, men):
|
||||
_add_one(tags, seen, tag)
|
||||
|
||||
for tag in _normal_character_tags(row):
|
||||
_add_one(tags, seen, tag)
|
||||
|
||||
for tag in _metadata_family_tags(row):
|
||||
_add_one(tags, seen, tag)
|
||||
for tag in _formatter_hint_tags(row):
|
||||
_add(tags, seen, tag)
|
||||
|
||||
item = _row_value(row, "item", ("Sexual scene", "Sexual pose", "Erotic outfit", "Clothing")) or _clean(row.get("custom_item"))
|
||||
pose = _row_value(row, "pose", ("Sexual pose", "Pose"))
|
||||
role_graph = _clean(row.get("source_role_graph") or row.get("role_graph"))
|
||||
scene = _row_value(row, "scene_text", ("Setting", "Scene")) or _clean(row.get("scene"))
|
||||
expression = _row_value(row, "character_expression_text") or _row_value(row, "expression", ("Facial expressions", "Facial expression"))
|
||||
composition = _row_value(row, "composition", ("Composition",))
|
||||
for value in (
|
||||
item,
|
||||
pose,
|
||||
role_graph,
|
||||
scene and f"in {scene}",
|
||||
expression,
|
||||
composition,
|
||||
):
|
||||
_add(tags, seen, value)
|
||||
for tag in _camera_tags(row):
|
||||
_add_one(tags, seen, tag)
|
||||
|
||||
combined = " ".join(_clean(value) for value in (item, pose, role_graph, row.get("prompt", "")))
|
||||
for tag in _explicit_tags(combined, nude_weight):
|
||||
_add_one(tags, seen, tag)
|
||||
return tags
|
||||
return sdxl_tag_routes.row_core_tags(
|
||||
sdxl_tag_routes.SDXLRowTagRequest(row, nude_weight),
|
||||
_sdxl_tag_route_dependencies(),
|
||||
)
|
||||
|
||||
|
||||
def _style_prefix(style_preset: str, trigger: str, prepend_trigger: bool, custom_style: str) -> str:
|
||||
@@ -341,69 +329,17 @@ def _quality_tail(quality_preset: str, custom_quality: str) -> str:
|
||||
|
||||
|
||||
def _soft_tags(row: dict[str, Any], root: dict[str, Any], nude_weight: float) -> str:
|
||||
tags = _row_core_tags(row, nude_weight)
|
||||
seen = {_tag_key(tag) for tag in tags}
|
||||
for tag in _formatter_hint_tags(root):
|
||||
_add(tags, seen, tag)
|
||||
descriptor = _clean(root.get("shared_descriptor"))
|
||||
if descriptor and not any("woman" in _tag_key(tag) for tag in tags):
|
||||
for tag in _character_tags_from_descriptor(descriptor):
|
||||
_add_one(tags, seen, tag)
|
||||
partner = root.get("softcore_partner_styling")
|
||||
if isinstance(partner, dict):
|
||||
_add(tags, seen, "; ".join(_clean(item) for item in partner.get("outfits", []) if _clean(item)))
|
||||
_add(tags, seen, partner.get("pose"))
|
||||
_add_one(tags, seen, "sexy")
|
||||
_add_one(tags, seen, "looking at viewer")
|
||||
return ", ".join(tags)
|
||||
return sdxl_tag_routes.soft_tags(
|
||||
sdxl_tag_routes.SDXLPairTagRequest(row, root, nude_weight),
|
||||
_sdxl_tag_route_dependencies(),
|
||||
)
|
||||
|
||||
|
||||
def _hard_tags(row: dict[str, Any], root: dict[str, Any], nude_weight: float) -> str:
|
||||
tags: list[str] = []
|
||||
seen: set[str] = set()
|
||||
try:
|
||||
women = int(root.get("hardcore_women_count") or row.get("women_count") or 1)
|
||||
men = int(root.get("hardcore_men_count") or row.get("men_count") or 1)
|
||||
except (TypeError, ValueError):
|
||||
women, men = 1, 1
|
||||
for tag in _count_tag(women, men):
|
||||
_add_one(tags, seen, tag)
|
||||
|
||||
descriptors = root.get("shared_cast_descriptors")
|
||||
if isinstance(descriptors, list):
|
||||
for descriptor in descriptors:
|
||||
for tag in _character_tags_from_descriptor(descriptor):
|
||||
_add_one(tags, seen, tag)
|
||||
else:
|
||||
for tag in _normal_character_tags(row):
|
||||
_add_one(tags, seen, tag)
|
||||
|
||||
for tag in _metadata_family_tags(row):
|
||||
_add_one(tags, seen, tag)
|
||||
for tag in _formatter_hint_tags(row, root):
|
||||
_add(tags, seen, tag)
|
||||
|
||||
hard_scene = _clean(row.get("scene_text"))
|
||||
hard_item = _clean(row.get("item"))
|
||||
hard_role = _clean(row.get("source_role_graph") or row.get("role_graph"))
|
||||
hard_clothing = _clean(root.get("hardcore_clothing_state"))
|
||||
expression = _clean(row.get("character_expression_text") or row.get("expression"))
|
||||
composition = _clean(row.get("composition"))
|
||||
for value in (
|
||||
hard_role,
|
||||
hard_item,
|
||||
hard_clothing,
|
||||
hard_scene and f"in {hard_scene}",
|
||||
expression,
|
||||
composition,
|
||||
):
|
||||
_add(tags, seen, value)
|
||||
for tag in _camera_tags(row, root.get("hardcore_camera_directive"), root.get("hardcore_camera_config")):
|
||||
_add_one(tags, seen, tag)
|
||||
combined = " ".join([hard_role, hard_item, hard_clothing, expression, composition, root.get("hardcore_prompt", "") or ""])
|
||||
for tag in _explicit_tags(combined, nude_weight):
|
||||
_add_one(tags, seen, tag)
|
||||
return ", ".join(tags)
|
||||
return sdxl_tag_routes.hard_tags(
|
||||
sdxl_tag_routes.SDXLPairTagRequest(row, root, nude_weight),
|
||||
_sdxl_tag_route_dependencies(),
|
||||
)
|
||||
|
||||
|
||||
def _assemble_prompt(
|
||||
|
||||
Reference in New Issue
Block a user