💻 源码
import re
from dataclasses import dataclass


JAILBREAK_PATTERNS = [
    (r"DAN", "DAN 模式"),
    (r"没有任何限制", "解除限制"),
    (r"无审核模式", "无审核模式"),
    (r"ignore\s+(all\s+)?safety", "忽略安全策略"),
    (r"绕过.*审核|绕过.*防火墙", "绕过审核"),
    (r"越狱", "越狱"),
    (r"jailbreak", "jailbreak"),
    (r"没有限制的\s*AI", "无限制 AI"),
    (r"假设你是一?个?没有限制", "假设无限制"),
    (r"仅用于论文|学术研究|科研|安全研究", "科研借口"),
    (r"制作危险|入侵.*电脑|黑客|窃取数据", "危害内容"),
    (r"do\s+anything\s+now", "DAN 变体"),
    (r"邪恶双胞胎|邪恶.*兄弟|没有道德限制", "对立响应"),
    (r"bypass_steps|绕过内容审核", "JSON 格式绑架"),
]


@dataclass
class JailbreakGuardResult:
    is_jailbreak: bool
    risk_level: str
    matched_reasons: list[str]


def detect_jailbreak(text: str) -> JailbreakGuardResult:
    matched = []
    for pattern, label in JAILBREAK_PATTERNS:
        if re.search(pattern, text, re.I):
            matched.append(label)

    research_excuse = bool(re.search(r"科研|论文|学术研究", text, re.I))
    harmful_topic = bool(
        re.search(r"绕过|危险|入侵|制作|审核系统|黑客", text, re.I)
    )
    if research_excuse and harmful_topic and "科研借口" not in matched:
        matched.append("科研借口+敏感话题")

    is_jailbreak = bool(matched)
    risk = "critical" if len(matched) >= 2 else ("high" if is_jailbreak else "low")

    return JailbreakGuardResult(
        is_jailbreak=is_jailbreak,
        risk_level=risk,
        matched_reasons=matched,
    )