import re
from dataclasses import dataclass
TASK_KEYWORDS = {
"translate": [r"翻译", r"translate", r"译成"],
"summarize": [r"摘要", r"总结", r"summarize"],
"faq": [r"什么|如何|为什么|怎么|FAQ|客服|帮助"],
}
@dataclass
class TaskLockResult:
allowed: bool
detected_task: str | None
reason: str | None
def detect_task(text: str) -> str | None:
for task, patterns in TASK_KEYWORDS.items():
for p in patterns:
if re.search(p, text, re.I):
return task
return None
def check_task(
text: str,
*,
whitelist: list[str],
scenario_task: str | None = None,
) -> TaskLockResult:
detected = detect_task(text)
leakage_signals = [
r"系统提示",
r"system\s*prompt",
r"API\s*Key",
r"密钥",
r"用户.*手机",
r"手机号",
r"数据库",
r"连接串",
r"配置",
r"第一条消息",
r"敏感字段",
r"打印.*context",
r"完整\s*context",
r"环境变量",
r"导出.*用户",
]
for sig in leakage_signals:
if re.search(sig, text, re.I):
if scenario_task and scenario_task in whitelist:
return TaskLockResult(
allowed=False,
detected_task="data_exfiltration",
reason="请求涉及敏感信息获取,超出任务白名单",
)
if detected and detected not in whitelist:
return TaskLockResult(
allowed=False,
detected_task=detected,
reason=f"检测到任务「{detected}」不在白名单 {whitelist} 中",
)
return TaskLockResult(allowed=True, detected_task=detected or scenario_task, reason=None)