Format/Lint
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
"""GovernancePlugin: Guardrails for VAia, the virtual assistant for VA."""
|
||||
|
||||
import logging
|
||||
import re
|
||||
|
||||
@@ -9,10 +10,57 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
FORBIDDEN_EMOJIS = [
|
||||
"🥵","🔪","🎰","🎲","🃏","😤","🤬","😡","😠","🩸","🧨","🪓","☠️","💀",
|
||||
"💣","🔫","👗","💦","🍑","🍆","👄","👅","🫦","💩","⚖️","⚔️","✝️","🕍",
|
||||
"🕌","⛪","🍻","🍸","🥃","🍷","🍺","🚬","👹","👺","👿","😈","🤡","🧙",
|
||||
"🧙♀️", "🧙♂️", "🧛", "🧛♀️", "🧛♂️", "🔞","🧿","💊", "💏"
|
||||
"🥵",
|
||||
"🔪",
|
||||
"🎰",
|
||||
"🎲",
|
||||
"🃏",
|
||||
"😤",
|
||||
"🤬",
|
||||
"😡",
|
||||
"😠",
|
||||
"🩸",
|
||||
"🧨",
|
||||
"🪓",
|
||||
"☠️",
|
||||
"💀",
|
||||
"💣",
|
||||
"🔫",
|
||||
"👗",
|
||||
"💦",
|
||||
"🍑",
|
||||
"🍆",
|
||||
"👄",
|
||||
"👅",
|
||||
"🫦",
|
||||
"💩",
|
||||
"⚖️",
|
||||
"⚔️",
|
||||
"✝️",
|
||||
"🕍",
|
||||
"🕌",
|
||||
"⛪",
|
||||
"🍻",
|
||||
"🍸",
|
||||
"🥃",
|
||||
"🍷",
|
||||
"🍺",
|
||||
"🚬",
|
||||
"👹",
|
||||
"👺",
|
||||
"👿",
|
||||
"😈",
|
||||
"🤡",
|
||||
"🧙",
|
||||
"🧙♀️",
|
||||
"🧙♂️",
|
||||
"🧛",
|
||||
"🧛♀️",
|
||||
"🧛♂️",
|
||||
"🔞",
|
||||
"🧿",
|
||||
"💊",
|
||||
"💏",
|
||||
]
|
||||
|
||||
|
||||
@@ -20,29 +68,31 @@ class GovernancePlugin:
|
||||
"""Guardrail executor for VAia requests as a Agent engine callbacks."""
|
||||
|
||||
def __init__(self) -> None:
|
||||
"""Initialize guardrail model (structured output), prompt and emojis patterns."""
|
||||
"""Initialize guardrail model, prompt and emojis patterns."""
|
||||
self._combined_pattern = self._get_combined_pattern()
|
||||
|
||||
def _get_combined_pattern(self):
|
||||
person_pattern = r"(?:🧑|👩|👨)"
|
||||
tone_pattern = r"[\U0001F3FB-\U0001F3FF]?"
|
||||
|
||||
# Unique pattern that combines all forbidden emojis, including complex ones with skin tones
|
||||
combined_pattern = re.compile(
|
||||
rf"{person_pattern}{tone_pattern}\u200d❤️?\u200d💋\u200d{person_pattern}{tone_pattern}" # kiss
|
||||
rf"|{person_pattern}{tone_pattern}\u200d❤️?\u200d{person_pattern}{tone_pattern}" # lovers
|
||||
rf"|🖕{tone_pattern}" # middle finger with all skin tone variations
|
||||
rf"|{'|'.join(map(re.escape, sorted(FORBIDDEN_EMOJIS, key=len, reverse=True)))}" # simple emojis
|
||||
rf"|\u200d|\uFE0F" # residual ZWJ and variation selectors
|
||||
def _get_combined_pattern(self) -> re.Pattern[str]:
|
||||
person = r"(?:🧑|👩|👨)"
|
||||
tone = r"[\U0001F3FB-\U0001F3FF]?"
|
||||
simple = "|".join(
|
||||
map(re.escape, sorted(FORBIDDEN_EMOJIS, key=len, reverse=True))
|
||||
)
|
||||
return combined_pattern
|
||||
|
||||
|
||||
# Combines all forbidden emojis, including complex
|
||||
# ones with skin tones
|
||||
return re.compile(
|
||||
rf"{person}{tone}\u200d❤️?\u200d💋\u200d{person}{tone}"
|
||||
rf"|{person}{tone}\u200d❤️?\u200d{person}{tone}"
|
||||
rf"|🖕{tone}"
|
||||
rf"|{simple}"
|
||||
rf"|\u200d|\uFE0F"
|
||||
)
|
||||
|
||||
def _remove_emojis(self, text: str) -> tuple[str, list[str]]:
|
||||
removed = self._combined_pattern.findall(text)
|
||||
text = self._combined_pattern.sub("", text)
|
||||
return text.strip(), removed
|
||||
|
||||
|
||||
def after_model_callback(
|
||||
self,
|
||||
callback_context: CallbackContext | None = None,
|
||||
|
||||
Reference in New Issue
Block a user