import re
from polos import (
PolosClient, Agent, guardrail, GuardrailContext, GuardrailResult, WorkflowContext
)
@guardrail
def redact_sensitive_data(ctx: WorkflowContext, guardrail_context: GuardrailContext) -> GuardrailResult:
"""Redact email addresses and credit card numbers from agent responses."""
content = guardrail_context.content
if content is None:
return GuardrailResult.continue_with()
content_str = str(content)
modified = content_str
# Redact email addresses
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
modified = re.sub(email_pattern, '[EMAIL_REDACTED]', modified)
# Redact credit card numbers
cc_pattern = r'\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b'
modified = re.sub(cc_pattern, '[CARD_REDACTED]', modified)
# SSN pattern
ssn_pattern = r'\b\d{3}-\d{2}-\d{4}\b'
modified = re.sub(ssn_pattern, '[SSN_REDACTED]', modified)
if modified != content_str:
return GuardrailResult.continue_with(modified_content=modified)
return GuardrailResult.continue_with()
privacy_agent = Agent(
id="privacy-agent",
provider="anthropic",
model="claude-sonnet-4",
system_prompt="You are a customer support agent. Help users with their accounts.",
tools=[get_user_info, update_account],
guardrails=[redact_sensitive_data]
)
response = await privacy_agent.run(
client,
"What's my account information? My email is [email protected]"
)
# Response will have email redacted: "Your email is [EMAIL_REDACTED]"