Whyx-PROmpTea / src /safety_filter.py
ArtShumov's picture
feat(prod): rewrite pipeline + NoobAI + ensemble tagger (3xWD14+DeepDanbooru-ready) + 1000 artists + negative templates + history ext + scoring config
e6404d0
Raw
History Blame
1.42 kB
"""Safety / rating policy — the single source of truth for rating conversions.
Historically three separate mappings lived in this module and tag_warehouse
(UI order, tag order, UI->tag ceiling). They are unified here; tag_warehouse
re-exports the canonical constants for backwards compatibility.
"""
SAFETY_TAG_MAP = {
"pg": "safe",
"pg13": "safe",
"pg16": "sensitive",
"r": "nsfw",
"r+": "explicit",
}
# UI-facing rating levels (what the user picks in the rating dropdown).
UI_RATING_ORDER = {"pg": 0, "pg13": 1, "pg16": 2, "r": 3, "r+": 4}
# Pool / tag entry rating levels (the "rating" field of every pool entry).
TAG_RATING_ORDER = {"sfw": 0, "suggestive": 1, "nsfw": 2, "explicit": 3}
# The highest tag-pool rating allowed under a given UI rating.
UI_TO_TAG_CEILING = {
"pg": "sfw",
"pg13": "sfw",
"pg16": "suggestive",
"r": "nsfw",
"r+": "explicit",
}
def get_safety_tag(rating: str) -> str:
return SAFETY_TAG_MAP.get(rating, "safe")
def ui_rating_to_tag_ceiling(user_rating: str) -> str:
"""Map a UI rating (pg/pg13/pg16/r/r+) to the max tag-pool rating allowed."""
return UI_TO_TAG_CEILING.get(user_rating, "sfw")
def is_tag_allowed(tag_rating: str, user_rating: str) -> bool:
tag_level = TAG_RATING_ORDER.get(tag_rating, 0)
ceiling_level = TAG_RATING_ORDER.get(ui_rating_to_tag_ceiling(user_rating), 0)
return tag_level <= ceiling_level