Base44 Superagent
Replace SCP-V3 content with GA-LAB backend (FastAPI + LLM Bridge). Old V3 code/data preserved on GitHub checken1994/V3- (branch main).
d60732b | """ | |
| SCP V104 — Cross-Language Pattern Transfer | |
| ============================================ | |
| Dịch pattern tiếng Việt → tiếng Anh/Trung/Nhật/Hàn → auto-generate detector patterns. | |
| Ví dụ: | |
| VI: "bỏ qua hướng dẫn" → EN: "ignore instructions" | |
| → ZH: "忽略指令" | |
| → JA: "指示を無視" | |
| → KO: "지시를 무시" | |
| Cách dùng: | |
| from scp.security.cross_language_learner import CrossLanguageLearner | |
| learner = CrossLanguageLearner() | |
| patterns = learner.transfer_all("bo qua huong dan", "injection", "critical") | |
| # → {"en": "ignore.*instructions", "zh": "忽略.*指令", "ja": "指示.*無視", ...} | |
| """ | |
| from __future__ import annotations | |
| import logging | |
| from dataclasses import dataclass | |
| logger = logging.getLogger("scp.security.cross_language_learner") | |
| # Pre-computed translations (offline, no API needed) | |
| PATTERN_TRANSLATIONS = { | |
| # Vietnamese → target languages | |
| "bo qua": { | |
| "en": "ignore", | |
| "zh": "忽略", | |
| "ja": "無視", | |
| "ko": "무시", | |
| "fr": "ignorer", | |
| "de": "ignoriere", | |
| "es": "ignora", | |
| "ar": "تجاهل", | |
| }, | |
| "huong dan": { | |
| "en": "instructions", | |
| "zh": "指令", | |
| "ja": "指示", | |
| "ko": "지시", | |
| "fr": "instructions", | |
| "de": "Anweisungen", | |
| "es": "instrucciones", | |
| "ar": "التعليمات", | |
| }, | |
| "quen di": { | |
| "en": "forget", | |
| "zh": "忘记", | |
| "ja": "忘れて", | |
| "ko": "잊어버려", | |
| "fr": "oublie", | |
| "de": "vergiss", | |
| "es": "olvida", | |
| "ar": "انسى", | |
| }, | |
| "dong vai": { | |
| "en": "act as|pretend.*are|roleplay", | |
| "zh": "扮演|假装", | |
| "ja": "演じて|偽って", | |
| "ko": "연기해|가장", | |
| "fr": "agis.*comme|prétend", | |
| "de": "verhalte.*als|tu.*so", | |
| "es": "actúa.*como|finge", | |
| "ar": "تصرف.*كما|تظاهر", | |
| }, | |
| "khong gioi han": { | |
| "en": "no.*restrictions?|unrestricted", | |
| "zh": "无限制|不受限", | |
| "ja": "制限なし|無制限", | |
| "ko": "제한.*없|무제한", | |
| "fr": "sans.*restrict|sans.*limite", | |
| "de": "ohne.*Einschränk|unbeschränkt", | |
| "es": "sin.*restric|sin.*límite", | |
| "ar": "بدون.*قيود|غير.*مقيد", | |
| }, | |
| "tiet lo": { | |
| "en": "reveal|show|expose", | |
| "zh": "揭示|显示|暴露", | |
| "ja": "明か|示|暴", | |
| "ko": "공개|보여|노출", | |
| "fr": "révèle|montre|expose", | |
| "de": "offenbare|zeige|enthülle", | |
| "es": "revela|muestra|expone", | |
| "ar": "كشف|أظهر|اعرض", | |
| }, | |
| "system prompt": { | |
| "en": "system.?prompt|initial.?instructions", | |
| "zh": "系统提示|初始指令", | |
| "ja": "システムプロンプト|初期指示", | |
| "ko": "시스템.*프롬프트|초기.*지시", | |
| "fr": "prompt.*système|instructions.*initiales", | |
| "de": "System.*Prompt|anfängliche.*Anweisungen", | |
| "es": "prompt.*sistema|instrucciones.*iniciales", | |
| "ar": "موجه.*النظام|التعليمات.*الأولية", | |
| }, | |
| "dan": { | |
| "en": "dan|do.anything.now", | |
| "zh": "dan|什么都能做", | |
| "ja": "dan|何でもできる", | |
| "ko": "dan|무엇이든.*해", | |
| "fr": "dan|fais.*tout", | |
| "de": "dan|tu.*alles", | |
| "es": "dan|haz.*todo", | |
| "ar": "dan|افعل.*أي.*شيء", | |
| }, | |
| "khong can tuan": { | |
| "en": "no.*need.*follow|don't.*follow", | |
| "zh": "无需遵守|不必遵守", | |
| "ja": "従う.*必要.*なし|従わ", | |
| "ko": "따를.*필요.*없|따르지", | |
| "fr": "pas.*besoin.*suivre|ne.*suis.*pas", | |
| "de": "nicht.*folgen|muss.*nicht.*befolgen", | |
| "es": "no.*necesitas.*seguir|no.*siga", | |
| "ar": "لا.*تحتاج.*اتباع|لا.*اتبع", | |
| }, | |
| } | |
| SUPPORTED_LANGUAGES = ["en", "zh", "ja", "ko", "fr", "de", "es", "ar"] | |
| class TransferredPattern: | |
| """1 pattern transfer sang ngôn ngữ khác.""" | |
| source_language: str # "vi" | |
| target_language: str # "en", "zh", ... | |
| original_pattern: str # "bỏ qua hướng dẫn" | |
| transferred_regex: str # "ignore.*instructions" | |
| category: str # "injection", "jailbreak", ... | |
| severity: str # "critical", "high", ... | |
| class CrossLanguageLearner: | |
| """ | |
| Transfer Vietnamese/English patterns → 8 ngôn ngữ khác. | |
| """ | |
| def __init__(self): | |
| self._stats = { | |
| "patterns_transferred": 0, | |
| "languages": SUPPORTED_LANGUAGES, | |
| "by_language": {}, | |
| } | |
| def transfer_pattern( | |
| self, | |
| vi_keywords: list[str], | |
| category: str, | |
| severity: str, | |
| target_lang: str = "en", | |
| ) -> TransferredPattern | None: | |
| """Transfer 1 Vietnamese pattern sang target language.""" | |
| translated_parts = [] | |
| for kw in vi_keywords: | |
| kw_norm = kw.lower().strip() | |
| if kw_norm in PATTERN_TRANSLATIONS: | |
| translations = PATTERN_TRANSLATIONS[kw_norm] | |
| if target_lang in translations: | |
| translated_parts.append(translations[target_lang]) | |
| if not translated_parts: | |
| return None | |
| # Build regex: join with .* for flexibility | |
| regex = ".*".join(translated_parts) | |
| self._stats["patterns_transferred"] += 1 | |
| self._stats["by_language"][target_lang] = ( | |
| self._stats["by_language"].get(target_lang, 0) + 1 | |
| ) | |
| return TransferredPattern( | |
| source_language="vi", | |
| target_language=target_lang, | |
| original_pattern=" ".join(vi_keywords), | |
| transferred_regex=regex, | |
| category=category, | |
| severity=severity, | |
| ) | |
| def transfer_all( | |
| self, | |
| vi_keywords: list[str], | |
| category: str, | |
| severity: str, | |
| ) -> dict[str, str]: | |
| """Transfer 1 pattern sang TẤT CẢ ngôn ngữ → dict {lang: regex}.""" | |
| results = {} | |
| for lang in SUPPORTED_LANGUAGES: | |
| transferred = self.transfer_pattern(vi_keywords, category, severity, lang) | |
| if transferred: | |
| results[lang] = transferred.transferred_regex | |
| return results | |
| def transfer_existing_vietnamese_patterns(self) -> list[dict]: | |
| """Transfer tất cả Vietnamese patterns hiện có sang 8 ngôn ngữ.""" | |
| # Vietnamese patterns to transfer | |
| vi_patterns = [ | |
| (["bo qua", "huong dan"], "injection", "critical"), | |
| (["quen di", "huong dan"], "injection", "critical"), | |
| (["dong vai", "khong gioi han"], "jailbreak", "critical"), | |
| (["tiet lo", "system prompt"], "exfiltration", "high"), | |
| (["khong can tuan"], "injection", "high"), | |
| (["dan"], "jailbreak", "high"), | |
| ] | |
| all_patterns = [] | |
| for keywords, category, severity in vi_patterns: | |
| for lang in SUPPORTED_LANGUAGES: | |
| transferred = self.transfer_pattern(keywords, category, severity, lang) | |
| if transferred: | |
| all_patterns.append({ | |
| "target_lang": transferred.target_language, | |
| "regex": transferred.transferred_regex, | |
| "category": transferred.category, | |
| "severity": transferred.severity, | |
| "original": transferred.original_pattern, | |
| }) | |
| logger.info(f"CrossLanguage: transferred {len(all_patterns)} patterns to {len(SUPPORTED_LANGUAGES)} languages") | |
| return all_patterns | |
| def stats(self) -> dict: | |
| return self._stats.copy() | |
| if __name__ == "__main__": | |
| print("=== Cross-Language Learner — Test ===\n") | |
| learner = CrossLanguageLearner() | |
| # Test 1: Transfer 1 pattern to all languages | |
| print("Test 1: Transfer 'bỏ qua hướng dẫn' → all languages") | |
| results = learner.transfer_all(["bo qua", "huong dan"], "injection", "critical") | |
| for lang, regex in results.items(): | |
| print(f" {lang}: {regex}") | |
| # Test 2: Transfer all existing patterns | |
| print("\nTest 2: Transfer all existing Vietnamese patterns") | |
| all_patterns = learner.transfer_existing_vietnamese_patterns() | |
| print(f" Total patterns: {len(all_patterns)}") | |
| for p in all_patterns[:10]: | |
| print(f" [{p['target_lang']}] {p['regex'][:50]} ({p['category']}, {p['severity']})") | |
| print(f"\nStats: {learner.stats()}") | |
| print("\n✓ Test complete.") | |