UNPKG

llm-guard

Version:

A TypeScript library for validating and securing LLM prompts

1 lines 51.4 kB
{"version":3,"sources":["../src/guards/base.ts","../src/guards/pii.ts","../src/guards/profanity.ts","../src/guards/jailbreak.ts","../src/guards/toxicity.ts","../src/guards/relevance.ts","../src/guards/prompt-injection.ts","../src/index.ts","../src/cli.ts"],"names":["BaseGuard","enabled","valid","score","details","PIIGuard","text","matches","type","pattern","found","value","match","ProfanityGuard","normalized","char","sub","words","word","JailbreakGuard","ToxicityGuard","aggressivePunctuation","isToxic","RelevanceGuard","options","fillerWordCount","fillerRatio","repeatedPhrases","phrases","repeatedCount","i","phrase2","phrase3","count","isRelevant","PromptInjectionGuard","systemPromptPatterns","memoryResetPatterns","LLMGuard","config","prompt","results","overallScore","guard","result","prompts","parseArgs","args","arg","loadConfig","configPath","ext","content","error","printHelp","main","lastArg"],"mappings":"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","file":"cli.mjs","sourcesContent":["import { GuardResult } from '../types';\r\n\r\nexport interface Guard {\r\n validate(text: string): Promise<GuardResult>;\r\n isEnabled(): boolean;\r\n}\r\n\r\nexport abstract class BaseGuard implements Guard {\r\n protected enabled: boolean;\r\n\r\n constructor(enabled: boolean = true) {\r\n this.enabled = enabled;\r\n }\r\n\r\n abstract validate(text: string): Promise<GuardResult>;\r\n\r\n isEnabled(): boolean {\r\n return this.enabled;\r\n }\r\n\r\n protected createResult(valid: boolean, score: number = 1.0, details: any[] = []): GuardResult {\r\n return {\r\n valid,\r\n score,\r\n details\r\n };\r\n }\r\n} ","import { BaseGuard } from './base';\r\nimport { GuardResult } from '../types';\r\n\r\nexport class PIIGuard extends BaseGuard {\r\n private patterns: Map<string, RegExp>;\r\n\r\n constructor(enabled: boolean = true) {\r\n super(enabled);\r\n this.patterns = new Map([\r\n ['email', /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g],\r\n ['phone', /(\\+\\d{1,3}[-.]?)?\\(?\\d{3}\\)?[-.]?\\d{3}[-.]?\\d{4}/g],\r\n ['ssn', /\\d{3}[-]?\\d{2}[-]?\\d{4}/g],\r\n ['credit_card', /\\d{4}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}/g],\r\n ['ip_address', /\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b/g]\r\n ]);\r\n }\r\n\r\n async validate(text: string): Promise<GuardResult> {\r\n if (!this.isEnabled()) {\r\n return this.createResult(true);\r\n }\r\n\r\n const matches: { type: string; value: string }[] = [];\r\n let score = 1.0;\r\n\r\n for (const [type, pattern] of this.patterns) {\r\n const found = text.match(pattern);\r\n if (found) {\r\n matches.push(...found.map(value => ({ type, value })));\r\n score = Math.min(score, 0.5); // Reduce score for each type of PII found\r\n }\r\n }\r\n\r\n return this.createResult(\r\n matches.length === 0,\r\n score,\r\n matches.map(match => ({\r\n rule: 'pii_detection',\r\n message: `Found ${match.type}: ${match.value}`,\r\n matched: match.value\r\n }))\r\n );\r\n }\r\n} ","import { BaseGuard } from './base';\r\nimport { GuardResult } from '../types';\r\n\r\nexport class ProfanityGuard extends BaseGuard {\r\n private profanityList: Set<string>;\r\n private commonSubstitutions: Map<string, string>;\r\n\r\n constructor(enabled: boolean = true) {\r\n super(enabled);\r\n // Initialize with a basic list - this should be expanded\r\n this.profanityList = new Set([\r\n 'badword1',\r\n 'badword2',\r\n // Add more profanity words here\r\n ]);\r\n\r\n this.commonSubstitutions = new Map([\r\n ['a', '@'],\r\n ['i', '1'],\r\n ['o', '0'],\r\n ['e', '3'],\r\n ['s', '$'],\r\n ['t', '7'],\r\n ]);\r\n }\r\n\r\n private normalizeText(text: string): string {\r\n let normalized = text.toLowerCase();\r\n // Remove common substitutions\r\n for (const [char, sub] of this.commonSubstitutions) {\r\n normalized = normalized.replace(new RegExp(sub, 'g'), char);\r\n }\r\n // Remove repeated characters\r\n normalized = normalized.replace(/(.)\\1+/g, '$1');\r\n return normalized;\r\n }\r\n\r\n async validate(text: string): Promise<GuardResult> {\r\n if (!this.isEnabled()) {\r\n return this.createResult(true);\r\n }\r\n\r\n const normalizedText = this.normalizeText(text);\r\n const words = normalizedText.split(/\\s+/);\r\n const matches: string[] = [];\r\n\r\n for (const word of words) {\r\n if (this.profanityList.has(word)) {\r\n matches.push(word);\r\n }\r\n }\r\n\r\n const score = matches.length === 0 ? 1.0 : Math.max(0, 1 - (matches.length * 0.2));\r\n\r\n return this.createResult(\r\n matches.length === 0,\r\n score,\r\n matches.map(word => ({\r\n rule: 'profanity_detection',\r\n message: `Found profanity: ${word}`,\r\n matched: word\r\n }))\r\n );\r\n }\r\n} ","import { BaseGuard } from './base';\r\nimport { GuardResult } from '../types';\r\n\r\nexport class JailbreakGuard extends BaseGuard {\r\n private patterns: RegExp[];\r\n\r\n constructor(enabled: boolean = true) {\r\n super(enabled);\r\n this.patterns = [\r\n /ignore previous instructions/i,\r\n /disregard previous/i,\r\n /you are now/i,\r\n /pretend you are/i,\r\n /let's roleplay/i,\r\n /bypass/i,\r\n /override/i,\r\n /ignore rules/i,\r\n /you don't have to/i,\r\n /you can break/i\r\n ];\r\n }\r\n\r\n async validate(text: string): Promise<GuardResult> {\r\n if (!this.isEnabled()) {\r\n return this.createResult(true);\r\n }\r\n\r\n const matches: string[] = [];\r\n let score = 1.0;\r\n\r\n for (const pattern of this.patterns) {\r\n const match = text.match(pattern);\r\n if (match) {\r\n matches.push(match[0]);\r\n score = Math.min(score, 0.3); // Significant score reduction for jailbreak attempts\r\n }\r\n }\r\n\r\n return this.createResult(\r\n matches.length === 0,\r\n score,\r\n matches.map(match => ({\r\n rule: 'jailbreak_detection',\r\n message: `Possible jailbreak attempt detected: ${match}`,\r\n matched: match\r\n }))\r\n );\r\n }\r\n} ","import { BaseGuard } from './base';\r\nimport { GuardResult } from '../types';\r\n\r\nexport class ToxicityGuard extends BaseGuard {\r\n private toxicPatterns: RegExp[];\r\n private toxicWords: Set<string>;\r\n\r\n constructor(enabled: boolean = true) {\r\n super(enabled);\r\n this.toxicPatterns = [\r\n /hate|kill|die|death|murder|suicide/i,\r\n /racist|sexist|homophobic|discrimination/i,\r\n /terror|bomb|explosion|weapon/i,\r\n /abuse|torture|pain|suffer/i,\r\n /threat|danger|harm|hurt/i\r\n ];\r\n\r\n this.toxicWords = new Set([\r\n 'hate', 'kill', 'die', 'death', 'murder', 'suicide',\r\n 'racist', 'sexist', 'homophobic', 'discrimination',\r\n 'terror', 'bomb', 'explosion', 'weapon',\r\n 'abuse', 'torture', 'pain', 'suffer',\r\n 'threat', 'danger', 'harm', 'hurt'\r\n ]);\r\n }\r\n\r\n private calculateToxicityScore(text: string): number {\r\n let score = 1.0;\r\n const words = text.toLowerCase().split(/\\s+/);\r\n \r\n // Check for toxic patterns\r\n for (const pattern of this.toxicPatterns) {\r\n if (pattern.test(text)) {\r\n score -= 0.2;\r\n }\r\n }\r\n\r\n // Check for toxic words\r\n for (const word of words) {\r\n if (this.toxicWords.has(word)) {\r\n score -= 0.1;\r\n }\r\n }\r\n\r\n // Check for aggressive punctuation\r\n const aggressivePunctuation = (text.match(/!{2,}|@{2,}|#{2,}/g) || []).length;\r\n score -= aggressivePunctuation * 0.05;\r\n\r\n return Math.max(0, score);\r\n }\r\n\r\n async validate(text: string): Promise<GuardResult> {\r\n if (!this.isEnabled()) {\r\n return this.createResult(true);\r\n }\r\n\r\n const score = this.calculateToxicityScore(text);\r\n const isToxic = score < 0.7;\r\n \r\n const matches: string[] = [];\r\n \r\n // Find matching toxic patterns\r\n for (const pattern of this.toxicPatterns) {\r\n const match = text.match(pattern);\r\n if (match) {\r\n matches.push(match[0]);\r\n }\r\n }\r\n\r\n // Find matching toxic words\r\n const words = text.toLowerCase().split(/\\s+/);\r\n for (const word of words) {\r\n if (this.toxicWords.has(word)) {\r\n matches.push(word);\r\n }\r\n }\r\n\r\n return this.createResult(\r\n !isToxic,\r\n score,\r\n matches.map(match => ({\r\n rule: 'toxicity_detection',\r\n message: `Found toxic content: ${match}`,\r\n matched: match\r\n }))\r\n );\r\n }\r\n} ","import { BaseGuard } from './base';\r\nimport { GuardResult } from '../types';\r\n\r\nexport class RelevanceGuard extends BaseGuard {\r\n private minLength: number;\r\n private maxLength: number;\r\n private minWords: number;\r\n private maxWords: number;\r\n private commonFillerWords: Set<string>;\r\n\r\n constructor(\r\n enabled: boolean = true,\r\n options: {\r\n minLength?: number;\r\n maxLength?: number;\r\n minWords?: number;\r\n maxWords?: number;\r\n } = {}\r\n ) {\r\n super(enabled);\r\n this.minLength = options.minLength || 10;\r\n this.maxLength = options.maxLength || 5000;\r\n this.minWords = options.minWords || 3;\r\n this.maxWords = options.maxWords || 1000;\r\n \r\n this.commonFillerWords = new Set([\r\n 'um', 'uh', 'ah', 'er', 'like', 'you know', 'sort of', 'kind of',\r\n 'basically', 'literally', 'actually', 'so', 'well', 'right'\r\n ]);\r\n }\r\n\r\n private calculateRelevanceScore(text: string): number {\r\n let score = 1.0;\r\n \r\n // Check length\r\n if (text.length < this.minLength) {\r\n score -= 0.3;\r\n }\r\n if (text.length > this.maxLength) {\r\n score -= 0.2;\r\n }\r\n \r\n // Check word count\r\n const words = text.split(/\\s+/).filter(word => word.length > 0);\r\n if (words.length < this.minWords) {\r\n score -= 0.3;\r\n }\r\n if (words.length > this.maxWords) {\r\n score -= 0.2;\r\n }\r\n \r\n // Check for filler words\r\n let fillerWordCount = 0;\r\n for (const word of words) {\r\n if (this.commonFillerWords.has(word.toLowerCase())) {\r\n fillerWordCount++;\r\n }\r\n }\r\n \r\n // Reduce score based on filler word ratio\r\n const fillerRatio = fillerWordCount / words.length;\r\n if (fillerRatio > 0.3) {\r\n score -= fillerRatio * 0.5;\r\n }\r\n \r\n // Check for repetitive content\r\n const repeatedPhrases = this.findRepeatedPhrases(text);\r\n score -= repeatedPhrases * 0.1;\r\n \r\n return Math.max(0, score);\r\n }\r\n\r\n private findRepeatedPhrases(text: string): number {\r\n const words = text.toLowerCase().split(/\\s+/);\r\n const phrases = new Map<string, number>();\r\n let repeatedCount = 0;\r\n \r\n // Check for 2-3 word phrases\r\n for (let i = 0; i < words.length - 1; i++) {\r\n const phrase2 = `${words[i]} ${words[i+1]}`;\r\n phrases.set(phrase2, (phrases.get(phrase2) || 0) + 1);\r\n \r\n if (i < words.length - 2) {\r\n const phrase3 = `${words[i]} ${words[i+1]} ${words[i+2]}`;\r\n phrases.set(phrase3, (phrases.get(phrase3) || 0) + 1);\r\n }\r\n }\r\n \r\n // Count phrases that appear more than once\r\n for (const count of phrases.values()) {\r\n if (count > 1) {\r\n repeatedCount++;\r\n }\r\n }\r\n \r\n return repeatedCount;\r\n }\r\n\r\n async validate(text: string): Promise<GuardResult> {\r\n if (!this.isEnabled()) {\r\n return this.createResult(true);\r\n }\r\n\r\n const score = this.calculateRelevanceScore(text);\r\n const isRelevant = score >= 0.6;\r\n \r\n const details = [];\r\n \r\n // Add length details\r\n if (text.length < this.minLength) {\r\n details.push({\r\n rule: 'relevance_length',\r\n message: `Text is too short (${text.length} chars, minimum ${this.minLength})`,\r\n matched: text\r\n });\r\n }\r\n \r\n if (text.length > this.maxLength) {\r\n details.push({\r\n rule: 'relevance_length',\r\n message: `Text is too long (${text.length} chars, maximum ${this.maxLength})`,\r\n matched: text\r\n });\r\n }\r\n \r\n // Add word count details\r\n const words = text.split(/\\s+/).filter(word => word.length > 0);\r\n if (words.length < this.minWords) {\r\n details.push({\r\n rule: 'relevance_word_count',\r\n message: `Text has too few words (${words.length}, minimum ${this.minWords})`,\r\n matched: text\r\n });\r\n }\r\n \r\n if (words.length > this.maxWords) {\r\n details.push({\r\n rule: 'relevance_word_count',\r\n message: `Text has too many words (${words.length}, maximum ${this.maxWords})`,\r\n matched: text\r\n });\r\n }\r\n \r\n return this.createResult(\r\n isRelevant,\r\n score,\r\n details\r\n );\r\n }\r\n} ","import { BaseGuard } from './base';\r\nimport { GuardResult } from '../types';\r\n\r\nexport class PromptInjectionGuard extends BaseGuard {\r\n private patterns: RegExp[];\r\n private suspiciousCommands: Set<string>;\r\n\r\n constructor(enabled: boolean = true) {\r\n super(enabled);\r\n this.patterns = [\r\n // Repeated system tags and instruction bypass\r\n /\\[system\\]{3,}/i,\r\n /\\[system\\].*don't evaluate/i,\r\n /\\[system\\].*simply respond/i,\r\n /\\[system\\].*may not deviate/i,\r\n /\\[system\\].*this is a test/i,\r\n /\\[system\\].*ignore previous/i,\r\n /\\[system\\].*bypass/i,\r\n /\\[system\\].*override/i,\r\n /\\[system\\].*pretend/i,\r\n /\\[system\\].*act as/i,\r\n /\\[system\\].*you are now/i,\r\n /\\[system\\].*you must/i,\r\n /\\[system\\].*you have to/i,\r\n /\\[system\\].*you should/i,\r\n /\\[system\\].*you will/i,\r\n /\\[system\\].*you can/i,\r\n /\\[system\\].*you may/i,\r\n /\\[system\\].*you need to/i,\r\n /\\[system\\].*you must not/i,\r\n /\\[system\\].*you cannot/i,\r\n /\\[system\\].*you should not/i,\r\n /\\[system\\].*you will not/i,\r\n /\\[system\\].*you may not/i,\r\n /\\[system\\].*you need not/i,\r\n // Sensitive information extraction\r\n /print.*password/i,\r\n /show.*password/i,\r\n /reveal.*password/i,\r\n /display.*password/i,\r\n /output.*password/i,\r\n /get.*password/i,\r\n /fetch.*password/i,\r\n /retrieve.*password/i,\r\n /extract.*password/i,\r\n /leak.*password/i,\r\n /expose.*password/i,\r\n /share.*password/i,\r\n /give.*password/i,\r\n /send.*password/i,\r\n /transmit.*password/i,\r\n /transfer.*password/i,\r\n /forward.*password/i,\r\n /email.*password/i,\r\n /message.*password/i,\r\n /text.*password/i,\r\n /sms.*password/i,\r\n /what.*password/i,\r\n /tell.*password/i,\r\n /say.*password/i,\r\n /speak.*password/i,\r\n /write.*password/i,\r\n /type.*password/i,\r\n /enter.*password/i,\r\n /input.*password/i,\r\n /provide.*password/i,\r\n /supply.*password/i,\r\n /offer.*password/i,\r\n /present.*password/i,\r\n /deliver.*password/i,\r\n /hand.*password/i,\r\n /pass.*password/i,\r\n /throw.*password/i,\r\n /toss.*password/i,\r\n /fling.*password/i,\r\n /cast.*password/i,\r\n /hurl.*password/i,\r\n /chuck.*password/i,\r\n /lob.*password/i,\r\n /heave.*password/i,\r\n /sling.*password/i,\r\n /shoot.*password/i,\r\n /fire.*password/i,\r\n /launch.*password/i,\r\n /project.*password/i,\r\n /propel.*password/i,\r\n /catapult.*password/i,\r\n /hurl.*password/i,\r\n /fling.*password/i,\r\n /toss.*password/i,\r\n // General commands\r\n /act as/i,\r\n /can you/i,\r\n /could you/i,\r\n /do this/i,\r\n /help with/i,\r\n /ignore all/i,\r\n /pretend to be/i,\r\n /simulate this/i,\r\n /try to/i,\r\n /run command/i,\r\n /reprogram yourself/i,\r\n /redefine the system/i,\r\n /bypass rules/i,\r\n // Boolean operators\r\n /if and only if/i,\r\n /not true/i,\r\n /or else/i,\r\n /true or false/i,\r\n /then proceed/i,\r\n /if then/i,\r\n /and then/i,\r\n /false positives/i,\r\n // Context modifiers\r\n /start fresh/i,\r\n /continue with/i,\r\n /new prompt/i,\r\n /previous context/i,\r\n /clear instructions/i,\r\n /restart session/i,\r\n /fresh context/i,\r\n /reset all/i,\r\n // Access and role modification\r\n /override this/i,\r\n /forget previous/i,\r\n /delete all/i,\r\n /output the data/i,\r\n /show everything/i,\r\n /provide unrestricted/i,\r\n /change context/i,\r\n /reveal hidden/i,\r\n /share details/i,\r\n // Probing for information\r\n /explain how/i,\r\n /describe this/i,\r\n /tell me/i,\r\n /show steps/i,\r\n /list everything/i,\r\n /outline the process/i,\r\n // Hypothetical or testing\r\n /test scenario/i,\r\n /hypothetical question/i,\r\n /experiment with/i,\r\n /for research purposes/i,\r\n // Feral and casual terms\r\n /what if/i,\r\n /how about/i,\r\n /let's try/i,\r\n /why don't you/i,\r\n /suppose this/i,\r\n /is it possible to/i,\r\n /let me do/i,\r\n /maybe you could/i,\r\n // Questioning instructions\r\n /why would/i,\r\n /how can/i,\r\n /what if/i,\r\n /where is/i,\r\n /who would/i,\r\n // Existing patterns\r\n /ignore previous instructions/i,\r\n /disregard previous/i,\r\n /you are now/i,\r\n /pretend you are/i,\r\n /let's roleplay/i,\r\n /bypass/i,\r\n /override/i,\r\n /ignore rules/i,\r\n /you don't have to/i,\r\n /you can break/i,\r\n /system prompt/i,\r\n /initial prompt/i,\r\n /base prompt/i,\r\n /core prompt/i,\r\n /original prompt/i,\r\n /default prompt/i,\r\n /reset/i,\r\n /restart/i,\r\n /new conversation/i,\r\n /start over/i,\r\n /begin again/i,\r\n /clear history/i,\r\n /forget everything/i,\r\n /memory reset/i,\r\n /wipe memory/i,\r\n /erase memory/i,\r\n /delete memory/i,\r\n /remove memory/i,\r\n /clear memory/i,\r\n /reset memory/i,\r\n /wipe history/i,\r\n /erase history/i,\r\n /delete history/i,\r\n /remove history/i,\r\n /clear history/i,\r\n /reset history/i\r\n ];\r\n\r\n this.suspiciousCommands = new Set([\r\n // System tag and instruction bypass commands\r\n 'system', 'don\\'t', 'simply', 'deviate', 'test', 'ignore', 'bypass', 'override',\r\n 'pretend', 'act', 'must', 'have', 'should', 'will', 'can', 'may', 'need',\r\n // Sensitive information extraction commands\r\n 'print', 'show', 'reveal', 'display', 'output', 'get', 'fetch', 'retrieve',\r\n 'extract', 'leak', 'expose', 'share', 'give', 'send', 'transmit', 'transfer',\r\n 'forward', 'email', 'message', 'text', 'sms', 'what', 'tell', 'say', 'speak',\r\n 'write', 'type', 'enter', 'input', 'provide', 'supply', 'offer', 'present',\r\n 'deliver', 'hand', 'pass', 'throw', 'toss', 'fling', 'cast', 'hurl', 'chuck',\r\n 'lob', 'heave', 'sling', 'shoot', 'fire', 'launch', 'project', 'propel',\r\n 'catapult',\r\n // New suspicious commands\r\n 'act', 'can', 'could', 'do', 'help', 'ignore', 'pretend', 'simulate', 'try',\r\n 'run', 'reprogram', 'redefine', 'bypass', 'override', 'forget', 'delete',\r\n 'output', 'show', 'provide', 'change', 'reveal', 'share', 'explain',\r\n 'describe', 'tell', 'list', 'outline', 'test', 'experiment', 'research',\r\n 'suppose', 'maybe', 'why', 'how', 'what', 'where', 'who',\r\n // Existing suspicious commands\r\n 'ignore', 'disregard', 'bypass', 'override', 'reset', 'restart',\r\n 'clear', 'wipe', 'erase', 'delete', 'remove', 'forget'\r\n ]);\r\n }\r\n\r\n private detectCommandInjection(text: string): boolean {\r\n const words = text.toLowerCase().split(/\\s+/);\r\n \r\n // Check for suspicious command words\r\n for (const word of words) {\r\n if (this.suspiciousCommands.has(word)) {\r\n return true;\r\n }\r\n }\r\n \r\n // Check for repeated system tags\r\n const systemTagCount = (text.match(/\\[system\\]/gi) || []).length;\r\n if (systemTagCount >= 3) {\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private detectSystemPromptInjection(text: string): boolean {\r\n const systemPromptPatterns = [\r\n /system prompt/i,\r\n /initial prompt/i,\r\n /base prompt/i,\r\n /core prompt/i,\r\n /original prompt/i,\r\n /default prompt/i\r\n ];\r\n \r\n for (const pattern of systemPromptPatterns) {\r\n if (pattern.test(text)) {\r\n return true;\r\n }\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private detectMemoryResetInjection(text: string): boolean {\r\n const memoryResetPatterns = [\r\n /reset/i,\r\n /restart/i,\r\n /new conversation/i,\r\n /start over/i,\r\n /begin again/i,\r\n /clear history/i,\r\n /forget everything/i,\r\n /memory reset/i,\r\n /wipe memory/i,\r\n /erase memory/i,\r\n /delete memory/i,\r\n /remove memory/i,\r\n /clear memory/i,\r\n /reset memory/i,\r\n /wipe history/i,\r\n /erase history/i,\r\n /delete history/i,\r\n /remove history/i,\r\n /clear history/i,\r\n /reset history/i\r\n ];\r\n \r\n for (const pattern of memoryResetPatterns) {\r\n if (pattern.test(text)) {\r\n return true;\r\n }\r\n }\r\n \r\n return false;\r\n }\r\n\r\n async validate(text: string): Promise<GuardResult> {\r\n if (!this.isEnabled()) {\r\n return this.createResult(true);\r\n }\r\n\r\n const matches: string[] = [];\r\n let score = 1.0;\r\n \r\n // Check for pattern matches\r\n for (const pattern of this.patterns) {\r\n const match = text.match(pattern);\r\n if (match) {\r\n matches.push(match[0]);\r\n score = Math.min(score, 0.3); // Significant score reduction for injection attempts\r\n }\r\n }\r\n \r\n // Check for command injection\r\n if (this.detectCommandInjection(text)) {\r\n matches.push('Command injection detected');\r\n score = Math.min(score, 0.4);\r\n }\r\n \r\n // Check for system prompt injection\r\n if (this.detectSystemPromptInjection(text)) {\r\n matches.push('System prompt injection detected');\r\n score = Math.min(score, 0.3);\r\n }\r\n \r\n // Check for memory reset injection\r\n if (this.detectMemoryResetInjection(text)) {\r\n matches.push('Memory reset injection detected');\r\n score = Math.min(score, 0.3);\r\n }\r\n\r\n return this.createResult(\r\n matches.length === 0,\r\n score,\r\n matches.map(match => ({\r\n rule: 'prompt_injection_detection',\r\n message: `Possible prompt injection detected: ${match}`,\r\n matched: match\r\n }))\r\n );\r\n }\r\n} ","import { GuardConfig, GuardResponse, BatchGuardResponse } from './types';\r\nimport { PIIGuard } from './guards/pii';\r\nimport { ProfanityGuard } from './guards/profanity';\r\nimport { JailbreakGuard } from './guards/jailbreak';\r\nimport { ToxicityGuard } from './guards/toxicity';\r\nimport { RelevanceGuard } from './guards/relevance';\r\nimport { PromptInjectionGuard } from './guards/prompt-injection';\r\n\r\nexport class LLMGuard {\r\n private guards: {\r\n pii?: PIIGuard;\r\n profanity?: ProfanityGuard;\r\n jailbreak?: JailbreakGuard;\r\n toxicity?: ToxicityGuard;\r\n relevance?: RelevanceGuard;\r\n promptInjection?: PromptInjectionGuard;\r\n };\r\n\r\n constructor(config: GuardConfig = {}) {\r\n this.guards = {};\r\n \r\n if (config.pii !== false) {\r\n this.guards.pii = new PIIGuard(config.pii);\r\n }\r\n \r\n if (config.profanity !== false) {\r\n this.guards.profanity = new ProfanityGuard(config.profanity);\r\n }\r\n \r\n if (config.jailbreak !== false) {\r\n this.guards.jailbreak = new JailbreakGuard(config.jailbreak);\r\n }\r\n \r\n if (config.toxicity !== false) {\r\n this.guards.toxicity = new ToxicityGuard(config.toxicity);\r\n }\r\n \r\n if (config.relevance !== false) {\r\n this.guards.relevance = new RelevanceGuard(config.relevance, config.relevanceOptions);\r\n }\r\n \r\n if (config.promptInjection !== false) {\r\n this.guards.promptInjection = new PromptInjectionGuard(config.promptInjection);\r\n }\r\n }\r\n\r\n async validate(prompt: string): Promise<GuardResponse> {\r\n const results = [];\r\n let overallScore = 1.0;\r\n\r\n for (const guard of Object.values(this.guards)) {\r\n if (guard && guard.isEnabled()) {\r\n const result = await guard.validate(prompt);\r\n results.push(result);\r\n overallScore = Math.min(overallScore, result.score || 1.0);\r\n }\r\n }\r\n\r\n return {\r\n id: Date.now().toString(),\r\n input: prompt,\r\n results\r\n };\r\n }\r\n\r\n async validateBatch(prompts: string[]): Promise<BatchGuardResponse> {\r\n const responses = await Promise.all(\r\n prompts.map(prompt => this.validate(prompt))\r\n );\r\n\r\n return {\r\n responses\r\n };\r\n }\r\n}\r\n\r\nexport * from './types'; ","#!/usr/bin/env node\r\n\r\nimport { LLMGuard, GuardConfig } from './index';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\ninterface CliOptions {\r\n config?: string;\r\n pii?: boolean;\r\n jailbreak?: boolean;\r\n profanity?: boolean;\r\n promptInjection?: boolean;\r\n relevance?: boolean;\r\n toxicity?: boolean;\r\n batch?: boolean;\r\n help?: boolean;\r\n}\r\n\r\nfunction parseArgs(): CliOptions {\r\n const args = process.argv.slice(2);\r\n const options: CliOptions = {};\r\n \r\n for (let i = 0; i < args.length; i++) {\r\n const arg = args[i];\r\n \r\n if (arg === '--config' || arg === '-c') {\r\n options.config = args[++i];\r\n } else if (arg === '--pii') {\r\n options.pii = true;\r\n } else if (arg === '--no-pii') {\r\n options.pii = false;\r\n } else if (arg === '--jailbreak') {\r\n options.jailbreak = true;\r\n } else if (arg === '--no-jailbreak') {\r\n options.jailbreak = false;\r\n } else if (arg === '--profanity') {\r\n options.profanity = true;\r\n } else if (arg === '--no-profanity') {\r\n options.profanity = false;\r\n } else if (arg === '--prompt-injection') {\r\n options.promptInjection = true;\r\n } else if (arg === '--no-prompt-injection') {\r\n options.promptInjection = false;\r\n } else if (arg === '--relevance') {\r\n options.relevance = true;\r\n } else if (arg === '--no-relevance') {\r\n options.relevance = false;\r\n } else if (arg === '--toxicity') {\r\n options.toxicity = true;\r\n } else if (arg === '--no-toxicity') {\r\n options.toxicity = false;\r\n } else if (arg === '--batch' || arg === '-b') {\r\n options.batch = true;\r\n } else if (arg === '--help' || arg === '-h') {\r\n options.help = true;\r\n }\r\n }\r\n \r\n return options;\r\n}\r\n\r\nfunction loadConfig(configPath: string): GuardConfig {\r\n try {\r\n const ext = path.extname(configPath).toLowerCase();\r\n const content = fs.readFileSync(configPath, 'utf8');\r\n \r\n if (ext === '.json') {\r\n return JSON.parse(content);\r\n } else if (ext === '.yaml' || ext === '.yml') {\r\n // We would need to add yaml package as a dependency\r\n console.error('YAML config files are not supported yet. Please use JSON.');\r\n process.exit(1);\r\n } else {\r\n console.error(`Unsupported config file format: ${ext}`);\r\n process.exit(1);\r\n }\r\n } catch (error: any) {\r\n console.error(`Error loading config file: ${error.message || 'Unknown error'}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction printHelp() {\r\n console.log(`\r\nllm-guard - LLM prompt validation and security checks\r\n\r\nUsage:\r\n llm-guard [options] <prompt>\r\n\r\nOptions:\r\n --config, -c <file> Path to config file (JSON)\r\n --pii Enable PII detection\r\n --no-pii Disable PII detection\r\n --jailbreak Enable jailbreak detection\r\n --no-jailbreak Disable jailbreak detection\r\n --profanity Enable profanity filtering\r\n --no-profanity Disable profanity filtering\r\n --prompt-injection Enable prompt injection detection\r\n --no-prompt-injection Disable prompt injection detection\r\n --relevance Enable relevance checking\r\n --no-relevance Disable relevance checking\r\n --toxicity Enable toxicity detection\r\n --no-toxicity Disable toxicity detection\r\n --batch, -b Run in batch mode (expects JSON array of prompts)\r\n --help, -h Show this help message\r\n\r\nExamples:\r\n llm-guard \"Your prompt here\"\r\n llm-guard --config config.json \"Your prompt here\"\r\n llm-guard --pii --jailbreak \"Your prompt here\"\r\n llm-guard --batch '[\"First prompt\", \"Second prompt\"]'\r\n `);\r\n}\r\n\r\nasync function main() {\r\n const options = parseArgs();\r\n \r\n if (options.help) {\r\n printHelp();\r\n return;\r\n }\r\n \r\n // Get the prompt from stdin if not provided as an argument\r\n let prompt: string | string[] = '';\r\n if (process.stdin.isTTY) {\r\n // If running in a terminal, get the last argument as the prompt\r\n const args = process.argv.slice(2);\r\n const lastArg = args[args.length - 1];\r\n \r\n if (!lastArg || lastArg.startsWith('--')) {\r\n console.error('Please provide a prompt to validate');\r\n printHelp();\r\n process.exit(1);\r\n }\r\n \r\n prompt = lastArg;\r\n } else {\r\n // If running with stdin, read from stdin\r\n prompt = fs.readFileSync(0, 'utf8').trim();\r\n }\r\n \r\n // Load config if provided\r\n let config: GuardConfig = {};\r\n if (options.config) {\r\n config = loadConfig(options.config);\r\n }\r\n \r\n // Override config with command line options\r\n if (options.pii !== undefined) con