from nemoguardrails import LLMRails
from nemoguardrails.actions.actions import ActionResult
import re
async def detect_pii(context: dict, text: str) -> ActionResult:
"""Detect personally identifiable information."""
patterns = {
'email': r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b',
'phone': r'\b\d{3}[-.]?\d{3}[-.]?\d{4}\b',
'ssn': r'\b\d{3}-\d{2}-\d{4}\b',
'credit_card': r'\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b'
}
for pii_type, pattern in patterns.items():
if re.search(pattern, text):
return ActionResult(
return_value=True,
context_updates={"pii_type": pii_type}
)
return ActionResult(return_value=False)
async def mask_sensitive_data(context: dict, text: str) -> ActionResult:
"""Mask sensitive information in output."""
# Mask credit cards
text = re.sub(
r'\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b',
'****-****-****-****',
text
)
# Mask emails
text = re.sub(
r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b',
'[EMAIL_REDACTED]',
text
)
# Mask phone numbers
text = re.sub(
r'\b\d{3}[-.]?\d{3}[-.]?\d{4}\b',
'***-***-****',
text
)
return ActionResult(return_value=text)
def init(app: LLMRails):
app.register_action(detect_pii, "detect_pii")
app.register_action(mask_sensitive_data, "mask_sensitive_data")