Aug 5 - Update code to follow up ST - MT14c
This commit is contained in:
+36
-2
@@ -20,6 +20,38 @@ from app.utils.notifications import notify
|
||||
bp = Blueprint('support', __name__, url_prefix='/support')
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# ── Outbound PII redaction ────────────────────────────────────────────────────
|
||||
# Groq is a THIRD PARTY. Customers routinely paste contact details (their own,
|
||||
# or a coworker's) into a support question, and none of that needs to leave the
|
||||
# app to get a helpful, generic answer. This scrubs a best-effort set of PII
|
||||
# patterns from the copy of the text sent to Groq ONLY — the original is still
|
||||
# stored verbatim in support_chat_messages, so the customer's own conversation
|
||||
# history reads normally in the app and staff see what was actually said.
|
||||
#
|
||||
# Best-effort by design: over-redacting a support question costs nothing, while
|
||||
# under-redacting leaks a real address. Order matters — the 13–19 digit card
|
||||
# pattern runs before the phone pattern so a card number is not partly consumed
|
||||
# as a phone number first.
|
||||
import re as _re
|
||||
|
||||
_PII_PATTERNS = [
|
||||
(_re.compile(r'[\w.+-]+@[\w-]+\.[\w.-]+'), '[redacted-email]'),
|
||||
(_re.compile(r'\b\d{3}-\d{2}-\d{4}\b'), '[redacted-ssn]'),
|
||||
(_re.compile(r'\b(?:\d[ -]?){13,19}\b'), '[redacted-number]'),
|
||||
(_re.compile(r'\b(?:\+?1[ .-]?)?\(?\d{3}\)?[ .-]?\d{3}[ .-]?\d{4}\b'), '[redacted-phone]'),
|
||||
]
|
||||
|
||||
|
||||
def _redact_pii(text):
|
||||
"""Best-effort scrub of email/phone/SSN/card-like sequences from outbound text."""
|
||||
if not text:
|
||||
return text
|
||||
redacted = text
|
||||
for pattern, placeholder in _PII_PATTERNS:
|
||||
redacted = pattern.sub(placeholder, redacted)
|
||||
return redacted
|
||||
|
||||
# ── Groq system prompt ────────────────────────────────────────────────────────
|
||||
|
||||
_SYSTEM_PROMPT = """\
|
||||
@@ -159,9 +191,11 @@ def chat_message():
|
||||
client = Groq(api_key=api_key)
|
||||
|
||||
messages = [{'role': 'system', 'content': _system_prompt_with_kb()}]
|
||||
# Redact before the text leaves the app for Groq. The unredacted
|
||||
# originals are persisted below, so nothing is lost in-app.
|
||||
for m in prior[-20:]:
|
||||
messages.append({'role': m.role, 'content': m.content})
|
||||
messages.append({'role': 'user', 'content': user_message})
|
||||
messages.append({'role': m.role, 'content': _redact_pii(m.content)})
|
||||
messages.append({'role': 'user', 'content': _redact_pii(user_message)})
|
||||
|
||||
model = os.environ.get('GROQ_MODEL', 'llama-3.3-70b-versatile')
|
||||
completion = client.chat.completions.create(
|
||||
|
||||
Reference in New Issue
Block a user