💻 源码
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)