💻 源码
import re
from dataclasses import dataclass


OUTPUT_PATTERNS = [
    (re.compile(r"sk-[a-zA-Z0-9\-]{10,}"), "API Key"),
    (re.compile(r"mysql://[^\s]+"), "数据库连接串"),
    (re.compile(r"1[3-9]\d{9}"), "手机号"),
    (re.compile(r"(?i)(system\s*prompt|系统提示词|系统指令)"), "系统提示词"),
    (re.compile(r"API_KEY\s*=", re.I), "配置泄露"),
    (re.compile(r"定价策略|尚未公开"), "内部文档"),
    (re.compile(r"已进入无限制模式|DAN\s*模式", re.I), "越狱输出"),
    (re.compile(r"好的,我现在是聊天机器人", re.I), "角色劫持"),
]


@dataclass
class OutputGuardResult:
    filtered_output: str
    leakage_detected: bool
    matched_types: list[str]
    original_output: str


def filter_output(text: str) -> OutputGuardResult:
    matched_types: list[str] = []
    filtered = text

    for pattern, label in OUTPUT_PATTERNS:
        if pattern.search(filtered):
            matched_types.append(label)
            filtered = pattern.sub("[已脱敏]", filtered)

    leakage = bool(matched_types)
    if leakage and "[已脱敏]" in filtered:
        filtered = (
            "检测到输出包含敏感信息,已拦截并脱敏。"
            f"(命中类型:{', '.join(matched_types)})"
        )

    return OutputGuardResult(
        filtered_output=filtered,
        leakage_detected=leakage,
        matched_types=matched_types,
        original_output=text,
    )