From e41ecc7a71641f040c99dae809a37a538ce72908 Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Sat, 14 Feb 2026 09:41:55 -0800 Subject: [PATCH] Guardrails - add nsfw policy template, toxic keywords in multiple languages, child safety content filter, json content viewer (#21205) * fix(content_filter.py): fix filter on toxic keywords * feat: improve toxic/abusive language detection * fix: additional improvements to nsfw filters * feat: more improvements to nsfw filter * feat(content_filter.json): add new australia specific nsfw content filter ensure complete coverage for australia nsfw * fix: cleanup policy templates * fix(index.tsx): alert notice * fix(index.tsx): add disclaimer notice * feat(harmful_child_safety.yaml): new child safety content filter ensure we catch inappropriate, child-specific content * feat(policy_templates.json): add child safety and self harm filters * fix(content_filter.py): improve racial bias filter to use a similar identifier + block word pattern and cover a wider range of ethnicities * feat(policy_templates.json): add racial bias to nsfw policy template * feat: add json content viewer --- litellm/constants.py | 58 +- litellm/policy_templates_backup.json | 402 +- .../proxy/guardrails/guardrail_endpoints.py | 100 +- .../categories/bias_racial.yaml | 507 +- .../categories/harm_toxic_abuse.json | 8896 +++++++++-------- .../categories/harm_toxic_abuse_au.json | 345 + .../categories/harm_toxic_abuse_de.json | 587 ++ .../categories/harm_toxic_abuse_es.json | 614 ++ .../categories/harm_toxic_abuse_fr.json | 821 ++ .../categories/harmful_child_safety.yaml | 156 + .../litellm_content_filter/content_filter.py | 323 +- .../litellm_content_filter/patterns.py | 9 +- policy_templates.json | 402 +- .../content_filter/test_content_filter.py | 713 ++ .../ContentCategoryConfiguration.tsx | 139 +- .../src/components/policies/index.tsx | 9 + 16 files changed, 9668 insertions(+), 4413 deletions(-) create mode 100644 litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_au.json create mode 100644 litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_de.json create mode 100644 litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_es.json create mode 100644 litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_fr.json create mode 100644 litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harmful_child_safety.yaml diff --git a/litellm/constants.py b/litellm/constants.py index addd659be7..b55d145777 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -106,9 +106,7 @@ MCP_OAUTH2_TOKEN_CACHE_DEFAULT_TTL = int( # npm/npx needs a writable cache dir; in containers the default (~/.npm) # may not exist or be read-only. /tmp is always writable. MCP_NPM_CACHE_DIR = os.getenv("MCP_NPM_CACHE_DIR", "/tmp/.npm_mcp_cache") -MCP_OAUTH2_TOKEN_CACHE_MIN_TTL = int( - os.getenv("MCP_OAUTH2_TOKEN_CACHE_MIN_TTL", "10") -) +MCP_OAUTH2_TOKEN_CACHE_MIN_TTL = int(os.getenv("MCP_OAUTH2_TOKEN_CACHE_MIN_TTL", "10")) LITELLM_UI_ALLOW_HEADERS = [ "x-litellm-semantic-filter", @@ -131,7 +129,7 @@ DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET_GEMINI_2_5_FLASH_LITE = int( # Maximum number of callbacks that can be registered # This prevents callbacks from exponentially growing and consuming CPU resources # Override with LITELLM_MAX_CALLBACKS env var for large deployments (e.g., many teams with guardrails) -MAX_CALLBACKS = get_env_int("LITELLM_MAX_CALLBACKS", 30) +MAX_CALLBACKS = get_env_int("LITELLM_MAX_CALLBACKS", 100) # Generic fallback for unknown models DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGET = int( @@ -167,15 +165,19 @@ _DEFAULT_TTL_FOR_HTTPX_CLIENTS = 3600 # 1 hour, re-use the same httpx client fo # Aiohttp connection pooling - prevents memory leaks from unbounded connection growth # Set to 0 for unlimited (not recommended for production) AIOHTTP_CONNECTOR_LIMIT = int(os.getenv("AIOHTTP_CONNECTOR_LIMIT", 300)) -AIOHTTP_CONNECTOR_LIMIT_PER_HOST = int(os.getenv("AIOHTTP_CONNECTOR_LIMIT_PER_HOST", 50)) +AIOHTTP_CONNECTOR_LIMIT_PER_HOST = int( + os.getenv("AIOHTTP_CONNECTOR_LIMIT_PER_HOST", 50) +) AIOHTTP_KEEPALIVE_TIMEOUT = int(os.getenv("AIOHTTP_KEEPALIVE_TIMEOUT", 120)) AIOHTTP_TTL_DNS_CACHE = int(os.getenv("AIOHTTP_TTL_DNS_CACHE", 300)) # enable_cleanup_closed is only needed for Python versions with the SSL leak bug # Fixed in Python 3.12.7+ and 3.13.1+ (see https://github.com/python/cpython/pull/118960) # Reference: https://github.com/aio-libs/aiohttp/blob/master/aiohttp/connector.py#L74-L78 -AIOHTTP_NEEDS_CLEANUP_CLOSED = ( - (3, 13, 0) <= sys.version_info < (3, 13, 1) or sys.version_info < (3, 12, 7) -) +AIOHTTP_NEEDS_CLEANUP_CLOSED = (3, 13, 0) <= sys.version_info < ( + 3, + 13, + 1, +) or sys.version_info < (3, 12, 7) # WebSocket constants # Default to None (unlimited) to match OpenAI's official agents SDK behavior @@ -213,15 +215,15 @@ REDIS_UPDATE_BUFFER_KEY = "litellm_spend_update_buffer" REDIS_DAILY_SPEND_UPDATE_BUFFER_KEY = "litellm_daily_spend_update_buffer" REDIS_DAILY_TEAM_SPEND_UPDATE_BUFFER_KEY = "litellm_daily_team_spend_update_buffer" REDIS_DAILY_ORG_SPEND_UPDATE_BUFFER_KEY = "litellm_daily_org_spend_update_buffer" -REDIS_DAILY_END_USER_SPEND_UPDATE_BUFFER_KEY = "litellm_daily_end_user_spend_update_buffer" +REDIS_DAILY_END_USER_SPEND_UPDATE_BUFFER_KEY = ( + "litellm_daily_end_user_spend_update_buffer" +) REDIS_DAILY_AGENT_SPEND_UPDATE_BUFFER_KEY = "litellm_daily_agent_spend_update_buffer" REDIS_DAILY_TAG_SPEND_UPDATE_BUFFER_KEY = "litellm_daily_tag_spend_update_buffer" MAX_REDIS_BUFFER_DEQUEUE_COUNT = int(os.getenv("MAX_REDIS_BUFFER_DEQUEUE_COUNT", 100)) MAX_SIZE_IN_MEMORY_QUEUE = int(os.getenv("MAX_SIZE_IN_MEMORY_QUEUE", 2000)) # Bounds asyncio.Queue() instances (log queues, spend update queues, etc.) to prevent unbounded memory growth -LITELLM_ASYNCIO_QUEUE_MAXSIZE = int( - os.getenv("LITELLM_ASYNCIO_QUEUE_MAXSIZE", 1000) -) +LITELLM_ASYNCIO_QUEUE_MAXSIZE = int(os.getenv("LITELLM_ASYNCIO_QUEUE_MAXSIZE", 1000)) MAX_IN_MEMORY_QUEUE_FLUSH_COUNT = int( os.getenv("MAX_IN_MEMORY_QUEUE_FLUSH_COUNT", 1000) ) @@ -343,7 +345,9 @@ MAX_SIZE_PER_ITEM_IN_MEMORY_CACHE_IN_KB = int( DEFAULT_MAX_TOKENS_FOR_TRITON = int(os.getenv("DEFAULT_MAX_TOKENS_FOR_TRITON", 2000)) #### Networking settings #### request_timeout: float = float(os.getenv("REQUEST_TIMEOUT", 6000)) # time in seconds -DEFAULT_A2A_AGENT_TIMEOUT: float = float(os.getenv("DEFAULT_A2A_AGENT_TIMEOUT", 6000)) # 10 minutes +DEFAULT_A2A_AGENT_TIMEOUT: float = float( + os.getenv("DEFAULT_A2A_AGENT_TIMEOUT", 6000) +) # 10 minutes # Patterns that indicate a localhost/internal URL in A2A agent cards that should be # replaced with the original base_url. This is a common misconfiguration where # developers deploy agents with development URLs in their agent cards. @@ -395,8 +399,12 @@ DD_TRACER_STREAMING_CHUNK_YIELD_RESOURCE = os.getenv( "DD_TRACER_STREAMING_CHUNK_YIELD_RESOURCE", "streaming.chunk.yield" ) -EMAIL_BUDGET_ALERT_TTL = int(os.getenv("EMAIL_BUDGET_ALERT_TTL", 24 * 60 * 60)) # 24 hours in seconds -EMAIL_BUDGET_ALERT_MAX_SPEND_ALERT_PERCENTAGE = float(os.getenv("EMAIL_BUDGET_ALERT_MAX_SPEND_ALERT_PERCENTAGE", 0.8)) # 80% of max budget +EMAIL_BUDGET_ALERT_TTL = int( + os.getenv("EMAIL_BUDGET_ALERT_TTL", 24 * 60 * 60) +) # 24 hours in seconds +EMAIL_BUDGET_ALERT_MAX_SPEND_ALERT_PERCENTAGE = float( + os.getenv("EMAIL_BUDGET_ALERT_MAX_SPEND_ALERT_PERCENTAGE", 0.8) +) # 80% of max budget ############### LLM Provider Constants ############### ### ANTHROPIC CONSTANTS ### ANTHROPIC_TOKEN_COUNTING_BETA_VERSION = os.getenv( @@ -1150,7 +1158,17 @@ known_tokenizer_config = { } -OPENAI_FINISH_REASONS = ["stop", "length", "function_call", "content_filter", "null", "finish_reason_unspecified", "malformed_function_call", "guardrail_intervened", "eos"] +OPENAI_FINISH_REASONS = [ + "stop", + "length", + "function_call", + "content_filter", + "null", + "finish_reason_unspecified", + "malformed_function_call", + "guardrail_intervened", + "eos", +] HUMANLOOP_PROMPT_CACHE_TTL_SECONDS = int( os.getenv("HUMANLOOP_PROMPT_CACHE_TTL_SECONDS", 60) ) # 1 minute @@ -1250,8 +1268,8 @@ CLI_SSO_SESSION_CACHE_KEY_PREFIX = "cli_sso_session" CLI_JWT_TOKEN_NAME = "cli-jwt-token" # Support both CLI_JWT_EXPIRATION_HOURS and LITELLM_CLI_JWT_EXPIRATION_HOURS for backwards compatibility CLI_JWT_EXPIRATION_HOURS = int( - os.getenv("CLI_JWT_EXPIRATION_HOURS") - or os.getenv("LITELLM_CLI_JWT_EXPIRATION_HOURS") + os.getenv("CLI_JWT_EXPIRATION_HOURS") + or os.getenv("LITELLM_CLI_JWT_EXPIRATION_HOURS") or 24 ) @@ -1432,9 +1450,7 @@ MICROSOFT_USER_EMAIL_ATTRIBUTE = str( MICROSOFT_USER_DISPLAY_NAME_ATTRIBUTE = str( os.getenv("MICROSOFT_USER_DISPLAY_NAME_ATTRIBUTE", "displayName") ) -MICROSOFT_USER_ID_ATTRIBUTE = str( - os.getenv("MICROSOFT_USER_ID_ATTRIBUTE", "id") -) +MICROSOFT_USER_ID_ATTRIBUTE = str(os.getenv("MICROSOFT_USER_ID_ATTRIBUTE", "id")) MICROSOFT_USER_FIRST_NAME_ATTRIBUTE = str( os.getenv("MICROSOFT_USER_FIRST_NAME_ATTRIBUTE", "givenName") ) diff --git a/litellm/policy_templates_backup.json b/litellm/policy_templates_backup.json index 6541839611..a0ffd6acd3 100644 --- a/litellm/policy_templates_backup.json +++ b/litellm/policy_templates_backup.json @@ -2,7 +2,7 @@ { "id": "advanced-au-pii-protection", "title": "Advanced PII Protection (Australia)", - "description": "Comprehensive PII detection and masking for Australia. Protects Australian-specific identifiers, international employee data, financial information, credentials, protected class information, and industry-specific sensitive data.", + "description": "Protects Australian-specific identifiers, international employee data, financial information, credentials, protected class information, and industry-specific sensitive data.", "icon": "ShieldCheckIcon", "iconColor": "text-purple-500", "iconBg": "bg-purple-50", @@ -274,5 +274,405 @@ ], "guardrails_remove": [] } + }, + { + "id": "nsfw-content-filter-australia", + "title": "NSFW Content Filter (Australia)", + "description": "Blocks profanity, sexual content, NSFW requests, self-harm content, and child safety violations using English and Australian-specific slang. Protects against inappropriate content including sexual solicitation, explicit content, Australian profanity, self-harm, and content involving minors.", + "icon": "ShieldExclamationIcon", + "iconColor": "text-red-500", + "iconBg": "bg-red-50", + "guardrails": [ + "nsfw-content-filter-english", + "nsfw-content-filter-australian", + "nsfw-self-harm-filter", + "nsfw-child-safety-filter", + "nsfw-racial-bias-filter" + ], + "complexity": "Medium", + "guardrailDefinitions": [ + { + "guardrail_name": "nsfw-content-filter-english", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks profanity, sexual content, slurs, and NSFW terms in English" + } + }, + { + "guardrail_name": "nsfw-content-filter-australian", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse_au", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks Australian-specific slang and profanity (root, perv, bogan, wanker, etc.)" + } + }, + { + "guardrail_name": "nsfw-self-harm-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_self_harm", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks content related to self-harm, suicide, and eating disorders" + } + }, + { + "guardrail_name": "nsfw-child-safety-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_child_safety", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks inappropriate content involving minors using identifier + block word combinations" + } + }, + { + "guardrail_name": "nsfw-racial-bias-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "bias_racial", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks racial and ethnic discrimination, hate speech, and supremacist content" + } + } + ], + "templateData": { + "policy_name": "nsfw-content-filter-australia", + "description": "NSFW content filter for Australia. Blocks profanity, sexual content, inappropriate requests, self-harm content, child safety violations, and racial bias in English and Australian slang.", + "guardrails_add": [ + "nsfw-content-filter-english", + "nsfw-content-filter-australian", + "nsfw-self-harm-filter", + "nsfw-child-safety-filter", + "nsfw-racial-bias-filter" + ], + "guardrails_remove": [] + } + }, + { + "id": "nsfw-content-filter-basic", + "title": "NSFW Content Filter (Basic)", + "description": "Basic NSFW content filtering for English only. Blocks profanity, sexual content, slurs, solicitation, explicit requests, self-harm content, and child safety violations. Suitable for most applications requiring content moderation.", + "icon": "ShieldExclamationIcon", + "iconColor": "text-orange-500", + "iconBg": "bg-orange-50", + "guardrails": [ + "nsfw-content-filter-english-only", + "nsfw-self-harm-filter-basic", + "nsfw-child-safety-filter-basic", + "nsfw-racial-bias-filter-basic" + ], + "complexity": "Low", + "guardrailDefinitions": [ + { + "guardrail_name": "nsfw-content-filter-english-only", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks profanity, sexual content, slurs, and NSFW terms. Includes 485+ keywords covering explicit content, solicitation, sexual behavior, and exploitation." + } + }, + { + "guardrail_name": "nsfw-self-harm-filter-basic", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_self_harm", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks content related to self-harm, suicide, and eating disorders" + } + }, + { + "guardrail_name": "nsfw-child-safety-filter-basic", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_child_safety", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks inappropriate content involving minors using identifier + block word combinations" + } + }, + { + "guardrail_name": "nsfw-racial-bias-filter-basic", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "bias_racial", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks racial and ethnic discrimination, hate speech, and supremacist content" + } + } + ], + "templateData": { + "policy_name": "nsfw-content-filter-basic", + "description": "Basic NSFW content filter. Blocks profanity, sexual content, inappropriate requests, self-harm content, child safety violations, and racial bias in English.", + "guardrails_add": [ + "nsfw-content-filter-english-only", + "nsfw-self-harm-filter-basic", + "nsfw-child-safety-filter-basic", + "nsfw-racial-bias-filter-basic" + ], + "guardrails_remove": [] + } + }, + { + "id": "nsfw-content-filter-all-regions", + "title": "NSFW Content Filter (All Regions)", + "description": "Comprehensive multi-language NSFW content filtering. Blocks profanity, sexual content, inappropriate requests, self-harm content, and child safety violations in English, Spanish, French, German, and Australian. Best for global applications.", + "icon": "ShieldExclamationIcon", + "iconColor": "text-purple-500", + "iconBg": "bg-purple-50", + "guardrails": [ + "nsfw-filter-english", + "nsfw-filter-spanish", + "nsfw-filter-french", + "nsfw-filter-german", + "nsfw-filter-australian", + "nsfw-self-harm-filter-global", + "nsfw-child-safety-filter-global", + "nsfw-racial-bias-filter-global" + ], + "complexity": "High", + "guardrailDefinitions": [ + { + "guardrail_name": "nsfw-filter-english", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "English profanity, sexual content, slurs, and NSFW terms (485+ keywords)" + } + }, + { + "guardrail_name": "nsfw-filter-spanish", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse_es", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Spanish profanity and offensive terms (68 keywords)" + } + }, + { + "guardrail_name": "nsfw-filter-french", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse_fr", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "French profanity and offensive terms (91 keywords)" + } + }, + { + "guardrail_name": "nsfw-filter-german", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse_de", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "German profanity and offensive terms (65 keywords)" + } + }, + { + "guardrail_name": "nsfw-filter-australian", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse_au", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Australian slang and profanity (32 keywords: root, perv, bogan, wanker, etc.)" + } + }, + { + "guardrail_name": "nsfw-self-harm-filter-global", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_self_harm", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks content related to self-harm, suicide, and eating disorders" + } + }, + { + "guardrail_name": "nsfw-child-safety-filter-global", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_child_safety", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks inappropriate content involving minors using identifier + block word combinations" + } + }, + { + "guardrail_name": "nsfw-racial-bias-filter-global", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "bias_racial", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks racial and ethnic discrimination, hate speech, and supremacist content" + } + } + ], + "templateData": { + "policy_name": "nsfw-content-filter-all-regions", + "description": "Comprehensive multi-language NSFW content filter. Blocks profanity, inappropriate content, self-harm, child safety violations, and racial bias in English, Spanish, French, German, and Australian. Total coverage: 741+ keywords across all languages plus self-harm, child safety, and racial bias protection.", + "guardrails_add": [ + "nsfw-filter-english", + "nsfw-filter-spanish", + "nsfw-filter-french", + "nsfw-filter-german", + "nsfw-filter-australian", + "nsfw-self-harm-filter-global", + "nsfw-child-safety-filter-global", + "nsfw-racial-bias-filter-global" + ], + "guardrails_remove": [] + } } ] diff --git a/litellm/proxy/guardrails/guardrail_endpoints.py b/litellm/proxy/guardrails/guardrail_endpoints.py index 07702252a1..44caa24524 100644 --- a/litellm/proxy/guardrails/guardrail_endpoints.py +++ b/litellm/proxy/guardrails/guardrail_endpoints.py @@ -14,26 +14,21 @@ from litellm.integrations.custom_guardrail import CustomGuardrail from litellm.proxy._types import UserAPIKeyAuth from litellm.proxy.auth.user_api_key_auth import user_api_key_auth from litellm.proxy.guardrails.guardrail_registry import GuardrailRegistry -from litellm.types.guardrails import ( - BaseLitellmParams, - PII_ENTITY_CATEGORIES_MAP, - ApplyGuardrailRequest, - ApplyGuardrailResponse, - BedrockGuardrailConfigModel, - Guardrail, - GuardrailEventHooks, - GuardrailInfoResponse, - GuardrailUIAddGuardrailSettings, - LakeraV2GuardrailConfigModel, - ListGuardrailsResponse, - LitellmParams, - PatchGuardrailRequest, - PiiAction, - PiiEntityType, - PresidioPresidioConfigModelUserInterface, - SupportedGuardrailIntegrations, - ToolPermissionGuardrailConfigModel, -) +from litellm.types.guardrails import (PII_ENTITY_CATEGORIES_MAP, + ApplyGuardrailRequest, + ApplyGuardrailResponse, + BaseLitellmParams, + BedrockGuardrailConfigModel, Guardrail, + GuardrailEventHooks, + GuardrailInfoResponse, + GuardrailUIAddGuardrailSettings, + LakeraV2GuardrailConfigModel, + ListGuardrailsResponse, LitellmParams, + PatchGuardrailRequest, PiiAction, + PiiEntityType, + PresidioPresidioConfigModelUserInterface, + SupportedGuardrailIntegrations, + ToolPermissionGuardrailConfigModel) #### GUARDRAILS ENDPOINTS #### @@ -152,7 +147,8 @@ async def list_guardrails_v2(): ``` """ from litellm.litellm_core_utils.litellm_logging import _get_masked_values - from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import \ + IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client if prisma_client is None: @@ -292,7 +288,8 @@ async def create_guardrail(request: CreateGuardrailRequest): } ``` """ - from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import \ + IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client if prisma_client is None: @@ -381,7 +378,8 @@ async def update_guardrail(guardrail_id: str, request: UpdateGuardrailRequest): } ``` """ - from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import \ + IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client if prisma_client is None: @@ -449,7 +447,8 @@ async def delete_guardrail(guardrail_id: str): } ``` """ - from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import \ + IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client if prisma_client is None: @@ -542,7 +541,8 @@ async def patch_guardrail(guardrail_id: str, request: PatchGuardrailRequest): } ``` """ - from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import \ + IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client if prisma_client is None: @@ -664,7 +664,8 @@ async def get_guardrail_info(guardrail_id: str): """ from litellm.litellm_core_utils.litellm_logging import _get_masked_values - from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import \ + IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client from litellm.types.guardrails import GUARDRAIL_DEFINITION_LOCATION @@ -739,10 +740,8 @@ async def get_guardrail_ui_settings(): - Content filter settings (patterns and categories) """ from litellm.proxy.guardrails.guardrail_hooks.litellm_content_filter.patterns import ( - PATTERN_CATEGORIES, - get_available_content_categories, - get_pattern_metadata, - ) + PATTERN_CATEGORIES, get_available_content_categories, + get_pattern_metadata) # Convert the PII_ENTITY_CATEGORIES_MAP to the format expected by the UI category_maps = [] @@ -775,13 +774,13 @@ async def get_guardrail_ui_settings(): ) async def get_category_yaml(category_name: str): """ - Get the YAML content for a specific content filter category. + Get the YAML or JSON content for a specific content filter category. Args: category_name: The name of the category (e.g., "bias_gender", "harmful_self_harm") Returns: - The raw YAML content of the category file + The raw YAML or JSON content of the category file with file type indicator """ import os @@ -793,20 +792,35 @@ async def get_category_yaml(category_name: str): "categories", ) - # Construct the file path - category_file_path = os.path.join(categories_dir, f"{category_name}.yaml") + # Try to find the file with either .yaml or .json extension + yaml_path = os.path.join(categories_dir, f"{category_name}.yaml") + json_path = os.path.join(categories_dir, f"{category_name}.json") - if not os.path.exists(category_file_path): + category_file_path = None + file_type = None + + if os.path.exists(yaml_path): + category_file_path = yaml_path + file_type = "yaml" + elif os.path.exists(json_path): + category_file_path = json_path + file_type = "json" + else: raise HTTPException( - status_code=404, detail=f"Category file not found: {category_name}" + status_code=404, + detail=f"Category file not found: {category_name} (tried .yaml and .json)", ) try: - # Read and return the raw YAML content + # Read and return the raw content with open(category_file_path, "r") as f: - yaml_content = f.read() + content = f.read() - return {"category_name": category_name, "yaml_content": yaml_content} + return { + "category_name": category_name, + "yaml_content": content, # Keep key name for backwards compatibility + "file_type": file_type, + } except Exception as e: raise HTTPException( status_code=500, detail=f"Error reading category file: {str(e)}" @@ -1263,7 +1277,8 @@ async def get_provider_specific_params(): } ### get the config model for the guardrail - go through the registry and get the config model for the guardrail - from litellm.proxy.guardrails.guardrail_registry import guardrail_class_registry + from litellm.proxy.guardrails.guardrail_registry import \ + guardrail_class_registry for guardrail_name, guardrail_class in guardrail_class_registry.items(): guardrail_config_model = guardrail_class.get_config_model() @@ -1391,9 +1406,8 @@ async def test_custom_code_guardrail(request: TestCustomCodeGuardrailRequest): import concurrent.futures import re - from litellm.proxy.guardrails.guardrail_hooks.custom_code.primitives import ( - get_custom_code_primitives, - ) + from litellm.proxy.guardrails.guardrail_hooks.custom_code.primitives import \ + get_custom_code_primitives # Security validation patterns FORBIDDEN_PATTERNS = [ diff --git a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/bias_racial.yaml b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/bias_racial.yaml index 86d9182e83..9d39ad6798 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/bias_racial.yaml +++ b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/bias_racial.yaml @@ -1,122 +1,417 @@ # Racial and ethnic bias detection +# Uses conditional logic: BLOCK if an identifier word + block word appear in same sentence category_name: "bias_racial" -description: "Detects racial and ethnic discrimination, stereotypes, and biased content" +description: "Detects racial and ethnic discrimination, hate speech, and biased content using identifier + block word combinations" default_action: "BLOCK" -# Keywords with severity levels -keywords: - # High severity - racial/ethnic identity terms - - keyword: "black" - severity: "high" - - keyword: "blacks" - severity: "high" - - keyword: "white" - severity: "high" - - keyword: "whites" - severity: "high" - - keyword: "asian" - severity: "high" - - keyword: "asians" - severity: "high" - - keyword: "hispanic" - severity: "high" - - keyword: "hispanics" - severity: "high" - - keyword: "latino" - severity: "high" - - keyword: "latina" - severity: "high" - - keyword: "latinos" - severity: "high" - - keyword: "mexican" - severity: "high" - - keyword: "mexicans" - severity: "high" - - keyword: "chinese" - severity: "high" - - keyword: "indian" - severity: "high" - - keyword: "indians" - severity: "high" - - keyword: "arab" - severity: "high" - - keyword: "arabs" - severity: "high" - - keyword: "african" - severity: "high" - - keyword: "africans" - severity: "high" - - keyword: "immigrant" - severity: "high" - - keyword: "immigrants" - severity: "high" - - keyword: "refugee" - severity: "high" - - keyword: "refugees" - severity: "high" - - keyword: "minority" - severity: "high" - - keyword: "minorities" - severity: "high" +# Inherit racial slurs and offensive terms from harm_toxic_abuse.json +inherit_from: "harm_toxic_abuse.json" + +# ADDITIONAL BLOCK WORDS - Harmful concepts and dehumanizing language +additional_block_words: + # Inferiority/superiority + - "inferior" + - "superior" + - "subhuman" + - "sub-human" + - "less than" + - "better than" + - "worse than" + - "lower" + - "primitive" + - "backwards" + - "backward" + - "uncivilized" + - "savage" + - "savages" + - "barbaric" + - "barbarian" - # High severity - discriminatory terms - - keyword: "inferior race" + # Elimination/violence language + - "eliminate" + - "eliminated" + - "elimination" + - "remove" + - "removed" + - "removal" + - "purge" + - "purged" + - "purging" + - "cleanse" + - "cleansing" + - "exterminate" + - "extermination" + - "eradicate" + - "eradication" + - "get rid of" + - "wipe out" + - "destroy" + - "destruction" + - "annihilate" + - "should be killed" + - "deserve to die" + - "need to die" + - "must die" + + # Threat/danger framing + - "dangerous" + - "threat" + - "problem" + - "issue" + - "plague" + - "disease" + - "infection" + - "parasite" + - "parasites" + - "vermin" + - "rats" + - "cockroaches" + - "invading" + - "invasion" + - "invaders" + - "taking over" + - "replacing" + - "replacement" + - "infiltrating" + - "infiltration" + + # Negative stereotypes + - "lazy" + - "criminals" + - "criminal" + - "terrorists" + - "terrorist" + - "violent" + - "dirty" + - "filthy" + - "disgusting" + - "smell" + - "stink" + - "stupid" + - "dumb" + - "ignorant" + - "uneducated" + - "uncivilized" + + # Exclusion/deportation + - "go back" + - "send back" + - "deport" + - "deportation" + - "don't belong" + - "not welcome" + - "get out" + - "leave" + - "kick out" + + # Supremacy concepts + - "pure" + - "purity" + - "master" + - "supremacy" + - "supremacist" + - "nationalist" + - "nationalism" + + # Economic/social stereotypes + - "stealing jobs" + - "taking jobs" + - "welfare" + - "benefits" + - "leeches" + - "moochers" + + # Animalistic/dehumanizing + - "animals" + - "animal" + - "beasts" + - "beast" + - "monkeys" + - "apes" + - "dogs" + +# IDENTIFIER WORDS - Comprehensive list of racial, ethnic, and national origin groups +identifier_words: + # Major racial categories + - "black" + - "blacks" + - "black people" + - "black person" + - "african american" + - "african americans" + - "white" + - "whites" + - "white people" + - "white person" + - "caucasian" + - "caucasians" + - "asian" + - "asians" + - "asian people" + - "asian person" + - "hispanic" + - "hispanics" + - "hispanic people" + - "latino" + - "latina" + - "latinos" + - "latinas" + - "latinx" + - "indigenous" + - "native" + - "natives" + - "native american" + - "native americans" + - "aboriginal" + - "aboriginals" + - "indigenous people" + + # Specific ethnic/national groups - Americas + - "mexican" + - "mexicans" + - "puerto rican" + - "puerto ricans" + - "cuban" + - "cubans" + - "dominican" + - "dominicans" + - "colombian" + - "colombians" + - "venezuelan" + - "venezuelans" + - "brazilian" + - "brazilians" + - "haitian" + - "haitians" + - "jamaican" + - "jamaicans" + - "salvadoran" + - "salvadorans" + - "guatemalan" + - "guatemalans" + - "nicaraguan" + - "nicaraguans" + - "honduran" + - "hondurans" + + # Specific ethnic/national groups - Asia + - "chinese" + - "japanese" + - "korean" + - "koreans" + - "vietnamese" + - "filipino" + - "filipinos" + - "thai" + - "cambodian" + - "cambodians" + - "laotian" + - "laotians" + - "indonesian" + - "indonesians" + - "malaysian" + - "malaysians" + - "singaporean" + - "singaporeans" + - "indian" + - "indians" + - "pakistani" + - "pakistanis" + - "bangladeshi" + - "bangladeshis" + - "sri lankan" + - "sri lankans" + - "nepalese" + - "afghan" + - "afghans" + + # Specific ethnic/national groups - Middle East/North Africa + - "arab" + - "arabs" + - "middle eastern" + - "saudi" + - "saudis" + - "iraqi" + - "iraqis" + - "iranian" + - "iranians" + - "syrian" + - "syrians" + - "lebanese" + - "egyptian" + - "egyptians" + - "moroccan" + - "moroccans" + - "algerian" + - "algerians" + - "tunisian" + - "tunisians" + - "libyan" + - "libyans" + - "palestinian" + - "palestinians" + - "israeli" + - "israelis" + - "jewish" + - "jews" + - "muslim" + - "muslims" + - "islamic" + + # Specific ethnic/national groups - Africa + - "african" + - "africans" + - "nigerian" + - "nigerians" + - "ethiopian" + - "ethiopians" + - "somali" + - "somalis" + - "kenyan" + - "kenyans" + - "ghanaian" + - "ghanaians" + - "south african" + - "south africans" + - "ugandan" + - "ugandans" + - "tanzanian" + - "tanzanians" + - "sudanese" + - "congolese" + + # Specific ethnic/national groups - Europe + - "eastern european" + - "eastern europeans" + - "russian" + - "russians" + - "polish" + - "ukrainian" + - "ukrainians" + - "romanian" + - "romanians" + - "albanian" + - "albanians" + - "bosnian" + - "bosnians" + - "serbian" + - "serbians" + - "croatian" + - "croatians" + - "turkish" + - "roma" + - "romani" + - "gypsy" + - "gypsies" + + # Immigration status + - "immigrant" + - "immigrants" + - "migrant" + - "migrants" + - "refugee" + - "refugees" + - "asylum seeker" + - "asylum seekers" + - "illegal alien" + - "illegal aliens" + - "undocumented" + - "foreigner" + - "foreigners" + - "expat" + - "expats" + + # Group descriptors + - "minority" + - "minorities" + - "ethnic group" + - "ethnic groups" + - "race" + - "races" + - "people of color" + - "poc" + - "non-white" + - "non-whites" + +# ALWAYS BLOCK - Explicit hate speech and supremacist phrases +always_block_keywords: + # Supremacist ideologies + - keyword: "white supremacy" severity: "high" - - keyword: "superior race" + - keyword: "white supremacist" severity: "high" - - keyword: "racial purity" + - keyword: "white nationalist" + severity: "high" + - keyword: "white nationalism" + severity: "high" + - keyword: "white power" severity: "high" - keyword: "master race" severity: "high" - - keyword: "white supremacy" + - keyword: "superior race" severity: "high" - - keyword: "white genocide" + - keyword: "inferior race" severity: "high" - - keyword: "great replacement" + - keyword: "racial purity" + severity: "high" + - keyword: "pure blood" severity: "high" - keyword: "race traitor" severity: "high" - keyword: "race mixing" severity: "high" - - keyword: "model minority" + - keyword: "blood and soil" + severity: "high" + + # Genocide/replacement theories + - keyword: "white genocide" + severity: "high" + - keyword: "great replacement" + severity: "high" + - keyword: "replacement theory" + severity: "high" + - keyword: "ethnic cleansing" + severity: "high" + - keyword: "racial cleansing" + severity: "high" + - keyword: "final solution" + severity: "high" + + # Explicit combinations + - keyword: "subhuman race" + severity: "high" + - keyword: "inferior people" + severity: "high" + - keyword: "savage race" + severity: "high" + - keyword: "diversity hire" severity: "high" - keyword: "ghetto culture" severity: "high" - keyword: "thug culture" severity: "high" - - keyword: "diversity hire" - severity: "high" - keyword: "black crime" severity: "high" - keyword: "immigrant crime" severity: "high" - - keyword: "minority lazy" + - keyword: "muslim terrorist" severity: "high" - - keyword: "stealing jobs" + - keyword: "arab terrorist" severity: "high" - - keyword: "go back" + - keyword: "mexican rapist" severity: "high" - - keyword: "you people" - severity: "medium" - - keyword: "those people" - severity: "medium" - - keyword: "all blacks" + - keyword: "stealing our jobs" severity: "high" - - keyword: "all whites" + - keyword: "taking our jobs" severity: "high" - - keyword: "all asians" + - keyword: "send them back" severity: "high" - - keyword: "all hispanics" - severity: "high" - - keyword: "all latinos" - severity: "high" - - keyword: "all mexicans" - severity: "high" - - keyword: "all immigrants" + - keyword: "go back to your country" severity: "high" # Exceptions - legitimate discussions about race, diversity, anti-racism exceptions: + # Anti-racism and justice - "racial equality" - "racial justice" - "racial discrimination" @@ -133,16 +428,60 @@ exceptions: - "address racism" - "racial disparities" - "racism is" - - "racist" + - "racist is" + - "against racism" + - "oppose racism" + - "condemn racism" + + # Cultural and historical - "study shows" - "research indicates" + - "research shows" + - "studies show" - "historical" + - "history" - "black history" - "black culture" - "asian culture" - "hispanic culture" - "latino culture" + - "indigenous culture" + - "native culture" + - "african culture" + - "cultural heritage" + - "cultural traditions" + - "celebrate" + - "celebrating" + - "heritage" + - "traditions" + + # Rights and support - "immigrant rights" - "immigrant support" - "protect immigrants" - "minority rights" + - "protect minorities" + - "refugee support" + - "refugee rights" + - "human rights" + - "equal rights" + - "equal treatment" + + # Education and awareness + - "education about" + - "learn about" + - "understanding" + - "awareness" + - "teach about" + - "cultural sensitivity" + - "cultural competency" + - "diversity training" + + # Positive representation + - "representation matters" + - "diverse perspectives" + - "inclusive" + - "inclusion" + - "belonging" + - "empower" + - "empowerment" diff --git a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse.json b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse.json index 9f87cf8097..c35b8b1ae7 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse.json +++ b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse.json @@ -1,4174 +1,4724 @@ [ - { - "id": "1man1jar", - "match": "1m1j|1man1jar|1 man 1 jar|one man one jar|one jar one man", - "tags": [ - "shock" - ], - "severity": 4 - }, - { - "id": "2girls1cup", - "match": "2g1c|2girls1cup|2 girls 1 cup|two girls one cup|one cup two girls", - "tags": [ - "shock" - ], - "severity": 4 - }, - { - "id": "acrotomophilia", - "match": "acrotomophilia|acrotomophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "adjective-cock", - "match": "black cock|big cock|huge cock|giant cock|massive cock|throbbing cock", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "alabama-hot-pocket", - "match": "alabama hot pocket", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "alabama-tuna-melt", - "match": "alabama tuna melt", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "alaskan-pipeline", - "match": "alaskan pipeline", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "algophilia", - "match": "algophilia|algophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "anal", - "match": "anal", - "tags": [ - "sexual" - ], - "severity": 2 - }, - { - "id": "anal-assassin", - "match": "anal assassin", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "anal-astronaut", - "match": "anal astronaut", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "anilingus", - "match": "anilingus", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "anus", - "match": "anus", - "tags": [ - "sexual" - ], - "severity": 1, - "exceptions": [ - "m*", - "m*cript", - "m*cripts", - "pand*", - "pand*es", - "tet*", - "tet*es" - ] - }, - { - "id": "apeshit", - "match": "apeshit|ape-shit|ape shit", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "apotemnophilia", - "match": "apotemnophilia|apotemnophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "arse", - "match": "arse", - "tags": [ - "sexual" - ], - "severity": 2, - "exceptions": [ - "*n", - "cath*", - "co*", - "he*", - "ho*", - "kath*", - "m*illes", - "p*", - "s*n" - ] - }, - { - "id": "arsehole", - "match": "arseho*le|ass*ho*le", - "tags": [ - "general" - ], - "severity": 3 - }, - { - "id": "ass", - "match": "ass", - "tags": [ - "sexual" - ], - "severity": 1 - }, - { - "id": "ass-bandit", - "match": "ass bandit|arse bandit", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "autoerotic|auto erotic", - "match": "autoerotic|auto erotic", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "babeland", - "match": "babeland", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "baby-batter", - "match": "baby batter|baby gravy|baby juice|ball batter|ball gravy", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "ball-gag", - "match": "ball gag|ball-gag|ballgag", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "ball-kicking", - "match": "ball kicking|ball-kicking", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "ball-licking", - "match": "ball licking|ball-licking", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "ball-sack", - "match": "ball sack", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "ball-sucking", - "match": "ball sucking|ball-sucking", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "ballcuzi", - "match": "ballcuzi", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "bangbros", - "match": "bangbros|bang bros", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "bangbus", - "match": "bangbus|bang bus", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "bareback", - "match": "bareback", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "barely-legal", - "match": "barely legal", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "bastard", - "match": "ba*sta*rd", - "tags": [ - "general" - ], - "severity": 3 - }, - { - "id": "bastinado", - "match": "bastinado", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "batty-boy", - "match": "batty boy|battyboy|batty boi|battyboi", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "bdsm", - "match": "bdsm", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "bean-flicker", - "match": "bean flicker|bean-flicker|beanflicker", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "bean-queen", - "match": "bean queen", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "beaner", - "match": "beaner|beaners", - "tags": [ - "racial" - ], - "severity": 3, - "exceptions": [ - "*ies", - "*y" - ] - }, - { - "id": "beastiality", - "match": "beastiality|beestiality|bestiality", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "beaver-cleaver", - "match": "beaver cleaver", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "beaver-lips", - "match": "beaver lips", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "bellend", - "match": "bell*end", - "tags": [ - "general" - ], - "severity": 3, - "exceptions": [ - "*en" - ] - }, - { - "id": "bellesa", - "match": "bellesa", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "bicon", - "match": "bicon", - "tags": [ - "lgbtq" - ], - "severity": 3, - "exceptions": [ - "*cave", - "*cavities", - "*cavity", - "*vex", - "*vexities", - "*vexity" - ] - }, - { - "id": "big-boobs", - "match": "big boobs|big breasts|big knockers|big tits", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "birdlock", - "match": "birdlock", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "bitch", - "match": "bi*tch|bi*tches", - "tags": [ - "general" - ], - "severity": 3 - }, - { - "id": "bloody", - "match": "bloody", - "tags": [ - "general" - ], - "severity": 1 - }, - { - "id": "blow-your-load", - "match": "blow your load", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "blowjob", - "match": "blowjob|blow-job|blow job", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "blue-waffle", - "match": "blue waffle|bluewaffle", - "tags": [ - "shock" - ], - "severity": 4 - }, - { - "id": "blumpkin", - "match": "blumpkin", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "bollocks", - "match": "bo*ll*o*cks", - "tags": [ - "sexual" - ], - "severity": 1 - }, - { - "id": "bone-smuggler", - "match": "bone smuggler|bone-smuggler|bonesmuggler", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "boner", - "match": "boner|raging boner|throbbing boner", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "boob", - "match": "boo*b", - "tags": [ - "sexual" - ], - "severity": 1, - "exceptions": [ - "*ird", - "*oo" - ] - }, - { - "id": "booty-buffer", - "match": "booty buffer|booty-buffer", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "booty-call", - "match": "booty call", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "boston-george", - "match": "boston george", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "breasts", - "match": "breasts", - "tags": [ - "sexual" - ], - "severity": 1, - "exceptions": [ - "*troke" - ] - }, - { - "id": "brown-piper", - "match": "brown piper|brown-piper|brownpiper", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "brown-shower", - "match": "brown shower|brown showers", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "brownie-royalty", - "match": "brownie king|brownie queen", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "buddhahead", - "match": "buddhahead|buddha head|buddha-head", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "bufter", - "match": "bufter|bufty", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "bugger", - "match": "bugg*er", - "tags": [ - "general" - ], - "severity": 1, - "exceptions": [ - "de*", - "hum*" - ] - }, - { - "id": "bukkake", - "match": "bukkake", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "bulldyke", - "match": "bulldyke", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "bullet-vibe", - "match": "bullet vibe|bullet vibrator", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "bullshit", - "match": "bullshit|bull-shit|bull shit", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "bum-chum", - "match": "bum chum|bum-chum|bumchum", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "bum-driller", - "match": "bum driller|bum-driller|bumdriller", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "butt-boy", - "match": "butt boy|butt-boy|buttboy|bum boy|bum-boy|bumboy", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "butt-pilot", - "match": "butt pilot|bum pilot", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "butt-pirate", - "match": "butt pirate|butt-pirate|bum pirate|bum-pirate", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "butt-rider", - "match": "butt rider|buttrider|bum rider|bumrider", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "butt-robber", - "match": "butt robber|butt-robber|buttrobber|bum robber|bum-robber|bumrobber", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "butt-rustler", - "match": "butt rustler|bum rustler", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "butthole-engineer", - "match": "butthole engineer|bumhole engineer", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "camel-jockey", - "match": "camel jockey|cameljockey|camel jockies|cameljockies", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "camel-toe", - "match": "camel toe", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "canadian-porch-swing", - "match": "canadian porch swing", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "carpet-muncher", - "match": "carpet muncher|carpetmuncher", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "cheese-monkey", - "match": "cheese-eating surrender monkey|cheese eating surrender monkey", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "chi-chi-man", - "match": "chi chi man|chi-chi man", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "chicken-queen", - "match": "chicken queen", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "chinaman", - "match": "chinaman|china man|chinamen|china men", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "ching-chong", - "match": "ching-chong|ching chong", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "chink", - "match": "chink|chinks|chinky", - "tags": [ - "racial" - ], - "severity": 3, - "exceptions": [ - "*apin", - "*apins", - "*ed", - "*ier", - "*iest", - "*ing", - "pa*o", - "pa*os" - ] - }, - { - "id": "chocolate-rosebud", - "match": "chocolate rosebud|chocolate rosebuds", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "cholerophilia", - "match": "cholerophilia|cholerophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "christ", - "match": "chri*st", - "tags": [ - "religious" - ], - "severity": 1, - "exceptions": [ - "*en", - "*ian", - "*ie", - "*y" - ] - }, - { - "id": "cialis", - "match": "cialis", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "circlejerk", - "match": "circlejerk|circle-jerk", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "cishet", - "match": "cishet", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "cissy", - "match": "cissy|cissie", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "claustrophilia", - "match": "claustrophilia|claustrophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "cleveland-accordion", - "match": "cleveland accordion", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "cleveland-hot-waffle", - "match": "cleveland hot waffle", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "cleveland-steamer", - "match": "cleveland steamer", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "clit", - "match": "clit", - "tags": [ - "sexual" - ], - "severity": 3, - "exceptions": [ - "*ella", - "*ellum", - "*ic", - "*icize", - "*icized", - "*icizes", - "*icizing", - "*ics", - "ana*ic", - "cy*ol", - "cy*ols", - "en*ic", - "en*ics", - "hetero*e", - "hetero*es", - "pa*axel", - "pa*axels", - "pro*ic", - "pro*ics" - ] - }, - { - "id": "clitoris", - "match": "cli*tori*s", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "clover-clamps", - "match": "clover clamps|clover clamp", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "clunge", - "match": "clu*nge", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "clusterfuck", - "match": "clusterfuck|cluster-fuck|cluster fuck", - "tags": [ - "general" - ], - "severity": 4 - }, - { - "id": "cock", - "match": "cock", - "tags": [ - "sexual" - ], - "severity": 2, - "exceptions": [ - "*ade", - "*aded", - "*ades", - "*alorum", - "*alorums", - "*amamie", - "*amamy", - "*apoo", - "*apoos", - "*ateel", - "*ateels", - "*atiel", - "*atiels", - "*atoo", - "*atoos", - "*atrice", - "*atrices", - "*bill", - "*billed", - "*billing", - "*bills", - "*boat", - "*boats", - "*chafer", - "*chafers", - "*crow", - "*crows", - "*ed", - "*er", - "*ered", - "*erel", - "*erels", - "*ering", - "*ers", - "*eye", - "*eyed", - "*eyedly", - "*eyedness", - "*eyednesses", - "*eyes", - "*horse", - "*horses", - "*ier", - "*iest", - "*ily", - "*iness", - "*inesses", - "*ing", - "*ish", - "*le", - "*lebur", - "*leburs", - "*led", - "*les", - "*leshell", - "*leshells", - "*like", - "*ling", - "*loft", - "*lofts", - "*ney", - "*neyfied", - "*neyfies", - "*neyfy", - "*neyfying", - "*neyish", - "*neyism", - "*neyisms", - "*neys", - "*pit", - "*pits", - "*roach", - "*roaches", - "*s", - "*scomb", - "*scombs", - "*sfoot", - "*sfoots", - "*shies", - "*shut", - "*shuts", - "*shy", - "*spur", - "*spurs", - "*sucker", - "*suckers", - "*sure", - "*surely", - "*sureness", - "*surenesses", - "*swain", - "*swains", - "*tail", - "*tailed", - "*tailing", - "*tails", - "*up", - "*ups", - "*y", - "a*", - "baw*", - "baw*s", - "bib*", - "bib*s", - "billy*", - "billy*s", - "black*", - "black*s", - "cold*", - "cold*ed", - "cold*ing", - "cold*s", - "game*", - "game*s", - "gor*", - "gor*s", - "hay*", - "hay*s", - "moor*", - "moor*s", - "pea*", - "pea*ed", - "pea*ier", - "pea*iest", - "pea*ing", - "pea*ish", - "pea*s", - "pea*y", - "pet*", - "pet*s", - "pinch*", - "pinch*s", - "poppy*", - "poppy*s", - "prin*", - "prin*s", - "re*", - "re*ed", - "re*ing", - "re*s", - "sea*", - "sea*s", - "shuttle*", - "shuttle*ed", - "shuttle*ing", - "shuttle*s", - "stop*", - "stop*s", - "un*", - "un*ed", - "un*ing", - "un*s", - "weather*", - "weather*s", - "wood*", - "wood*s" - ] - }, - { - "id": "cockpipe-cosmonaut", - "match": "cockpipe cosmonaut", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "cockstruction-worker", - "match": "cockstruction worker", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "coimetrophilia", - "match": "coimetrophilia|coimetrophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "collaring", - "match": "collaring|collared", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "coon", - "match": "coon|coons", - "tags": [ - "racial" - ], - "severity": 3, - "exceptions": [ - "barra*", - "coc*", - "coc*ed", - "puc*", - "rac*", - "ty*", - "*tie", - "* can", - "*can", - "* hound", - "*hound", - "* skin", - "*skin" - ] - }, - { - "id": "coprophilia", - "match": "coprophilia|coprophile|coprolagnia", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "cornhole", - "match": "cornhole", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "crafty-butcher", - "match": "crafty butcher", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "crap", - "match": "cra*p", - "tags": [ - "general" - ], - "severity": 1, - "exceptions": [ - "*e", - "*ing", - "*shoot", - "*ulent", - "*ulous", - "s*" - ] - }, - { - "id": "creampie", - "match": "creampie|cream-pie", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "cum", - "match": "cum", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "cumming", - "match": "cumming", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "cumshot", - "match": "cumshot|cumshots|cum shot|cum shots", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "cunnilingus", - "match": "cunnilingus", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "cunt", - "match": "cu*n*t|ku*nt|cunts|kunts", - "tags": [ - "general" - ], - "severity": 4, - "exceptions": [ - "s*horpe" - ] - }, - { - "id": "cuntboy", - "match": "cuntboy|cunt-boy|cunt boy", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "curry-muncher", - "match": "curry muncher|curry-muncher|currymuncher", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "damn", - "match": "da*mn", - "tags": [ - "religious" - ], - "severity": 1 - }, - { - "id": "darkie", - "match": "darkie|darkies|darky|darkey", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "date-rape", - "match": "date rape|daterape", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "ddlg", - "match": "ddlg", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "deep-throat", - "match": "deep throat|deep-throat|deepthroat", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "dendrophilia", - "match": "dendrophilia|dendrophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "dick", - "match": "di*ck", - "tags": [ - "sexual" - ], - "severity": 2, - "exceptions": [ - "*cissel", - "*en", - "*er", - "bene*", - "me*", - "zad*" - ] - }, - { - "id": "dickgirl", - "match": "dickgirl|dick-girl|dick girl", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "dildo", - "match": "dildo|dildos", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "dingleberry", - "match": "dingleberry|dingleberries", - "tags": [ - "general" - ], - "severity": 1 - }, - { - "id": "dipsea", - "match": "dipsea", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "dirty-pillows", - "match": "dirty pillows", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "dirty-sanchez", - "match": "dirty sanchez", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "dishabiliophilia", - "match": "dishabiliophilia|dishabiliophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "doggie-style", - "match": "doggie style|doggie-style|doggiestyle|doggy style|doggy-style|doggystyle|dog style", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "dogshit", - "match": "dogshit|dog-shit|dog shit", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "dolcett", - "match": "dolcett", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "domination", - "match": "domination", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "dominatrix", - "match": "dominatrix|domme|dommes", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "donkey-punch", - "match": "donkey punch", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "donut-muncher", - "match": "donut muncher", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "donut-puncher", - "match": "donut puncher", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "double-penetration", - "match": "double penetration|dp action", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "dry-hump", - "match": "dry hump", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "dune-coon", - "match": "dune coon|dune-coon|doon coon|dooncoon", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "dutch-rudder", - "match": "dutch rudder", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "dyke", - "match": "dyke", - "tags": [ - "lgbtq" - ], - "severity": 3, - "exceptions": [ - "van*", - "van*d", - "van*s" - ] - }, - { - "id": "dystychiphilia", - "match": "dystychiphilia|dystychiphile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "edgeplay", - "match": "edgeplay|edge play", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "ejaculate", - "match": "ejaculate|ejaculation|ejaculating|ejaculated", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "electro-play", - "match": "electro-play|electroplay", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "emetophilia", - "match": "emetophilia|emetophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "enby", - "match": "enby", - "tags": [ - "lgbtq" - ], - "severity": 3, - "exceptions": [ - "all*", - "as*", - "brook*", - "ca*", - "d*", - "froz*te", - "gat*", - "hold*", - "lack*", - "laz*", - "nav*", - "ott*", - "r*gda", - "t*", - "warr*", - "wh*" - ] - }, - { - "id": "eskimo-trebuchet", - "match": "eskimo trebuchet", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "eyetie", - "match": "eyetie|eye-tie", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "fag", - "match": "fa*g", - "tags": [ - "lgbtq" - ], - "severity": 3, - "exceptions": [ - "lea*e", - "lea*es", - "ser*e", - "ser*es", - "whar*e", - "whar*es" - ] - }, - { - "id": "fag-bomb", - "match": "fag bomb|fag-bomb|fagbomb", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "faggot", - "match": "fa*gg*o*t|fagot", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "felch", - "match": "felch|felching", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "fellatio", - "match": "fellatio|fellating", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "female-squirting", - "match": "female squirting", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "figging", - "match": "figging", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "fingerbang", - "match": "fingerbang|finger bang|fingerbanging", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "fingering", - "match": "fingering|fingered", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "finocchio", - "match": "finocchio|finochio|finoccio", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "fisting", - "match": "fisting|fisted", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "footjob", - "match": "footjob|foot-job|foot job", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "french-rudder", - "match": "french rudder", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "frogeater", - "match": "frogeater|frog-eater|frog eater", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "frolicme", - "match": "frolicme|frolic me", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "frotting", - "match": "frotting|frottage", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "fuck", - "match": "fu*c*k|fucks|fu*c*ken|fu*c*ker|fu*ckers|fu*c*kin|fu*c*king", - "tags": [ - "general" - ], - "severity": 4 - }, - { - "id": "fuckhead", - "match": "fuckhead|fuckheads", - "tags": [ - "general" - ], - "severity": 4 - }, - { - "id": "fucktard", - "match": "fucktard|fucktards", - "tags": [ - "general" - ], - "severity": 4 - }, - { - "id": "fuckwad", - "match": "fuckwad|fuckwads", - "tags": [ - "general" - ], - "severity": 4 - }, - { - "id": "fuckwit", - "match": "fuckwit|fuckwits|fuckwhit|fuck-wit", - "tags": [ - "general" - ], - "severity": 4 - }, - { - "id": "fudge-packer", - "match": "fudge packer|fudge-packer|fudgepacker", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "futanari", - "match": "futanari", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "g-spot", - "match": "g-spot", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "gangbang", - "match": "gangbang|gang bang", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "gay-sex", - "match": "gay sex", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "gaysian", - "match": "gaysian", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "genitals", - "match": "genitals", - "tags": [ - "sexual" - ], - "severity": 1 - }, - { - "id": "genitorture", - "match": "genitorture", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "gerontophilia", - "match": "gerontophilia|gerontophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "gin-jockey", - "match": "gin jockey|gin jocky", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "girl-on-top", - "match": "girl on top", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "goatse", - "match": "goatse|goatcx", - "tags": [ - "shock" - ], - "severity": 4 - }, - { - "id": "god-damn", - "match": "god damn|god-damn|goddamn|god damned|god-damned|goddamned", - "tags": [ - "religious" - ], - "severity": 2 - }, - { - "id": "gokkun", - "match": "gokkun|go-kun", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "golden-shower", - "match": "golden shower|golden showers|yellow shower|yellow showers", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "golliwog", - "match": "golliwog|gollywog", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "gook", - "match": "gook|gooks|gook-eye|gooky|gookie", - "tags": [ - "racial" - ], - "severity": 3, - "exceptions": [ - "gobblede*", - "gobblede*s", - "gobbledy*", - "gobbledy*s" - ] - }, - { - "id": "goregasm", - "match": "goregasm", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "greaseball", - "match": "greaseball", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "grey-queen", - "match": "grey queen|gray queen", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "grope", - "match": "grope", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "group-sex", - "match": "group sex", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "gym-bunny", - "match": "gym bunny|gymbunny", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "hajji", - "match": "haji|hajj*i|hadji", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "hand-job", - "match": "hand job|hand-job|handjob", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "hell", - "match": "hell", - "tags": [ - "religious" - ], - "severity": 1, - "exceptions": [ - "*cat", - "*er", - "*fire", - "*kite", - "*ed", - "*en", - "*ion", - "*ish", - "*o", - "ec*e", - "p*", - "s*" - ] - }, - { - "id": "hermie", - "match": "hermie", - "tags": [ - "lgbtq" - ], - "severity": 3, - "exceptions": [ - "diat*s", - "endot*s", - "homeot*s" - ] - }, - { - "id": "hickory-switch", - "match": "hickory switch", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "hippophilia", - "match": "hippophilia|hippophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "homoerotic", - "match": "homoerotic", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "honkey", - "match": "honkey|honky|honkeys|honkies", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "horny", - "match": "horny", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "horseshit", - "match": "horseshit|horse-shit|horse shit", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "hot-carl", - "match": "hot carl", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "hot-richard", - "match": "hot richard", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "humping", - "match": "humping", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "hymie", - "match": "hymie|heimie", - "tags": [ - "racial" - ], - "severity": 2, - "exceptions": [ - "alc*s", - "prings*ella", - "t*r", - "t*st" - ] - }, - { - "id": "impact-play", - "match": "impact play|impact-play", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "incest", - "match": "incest", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "intercourse", - "match": "intercourse", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "jack-off", - "match": "jack off|jack-off", - "tags": [ - "sexual" - ], - "severity": 2 - }, - { - "id": "jail-bait", - "match": "jail bait|jailbait", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "jap", - "match": "jap", - "tags": [ - "racial" - ], - "severity": 1, - "exceptions": [ - "*an", - "*anize", - "*anized", - "*anizes", - "*anizing", - "*anned", - "*anners", - "*anner", - "*anning", - "*ans", - "*e", - "*ed", - "*er", - "*eries", - "*ers", - "*ery", - "*es", - "*ing", - "*ingly", - "*onica", - "*onicas", - "*onaiserie", - "*onaiseries", - "ca*ut", - "ca*uts", - "jipi*a", - "jipi*as" - ] - }, - { - "id": "jelly-donut", - "match": "jelly donut", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "jerk-off", - "match": "jerk off|jerk-off", - "tags": [ - "sexual" - ], - "severity": 2 - }, - { - "id": "jerkmate", - "match": "jerkmate|jerk mate", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "jesus", - "match": "je*su*s", - "tags": [ - "religious" - ], - "severity": 1, - "exceptions": [ - "be*" - ] - }, - { - "id": "jesus-christ", - "match": "je*su*s chri*st", - "tags": [ - "religious" - ], - "severity": 2 - }, - { - "id": "jigaboo", - "match": "jig*aboo*|jig*gerboo*", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "jizz", - "match": "jizz", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "juggs", - "match": "juggs", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "jungle-bunny", - "match": "jungle bunny|junglebunny", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "kennebunkport-surprise", - "match": "kennebunkport surprise", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "kentucky-klondike", - "match": "kentucky klondike", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "kentucky-tractor-puller", - "match": "kentucky tractor puller", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "kike", - "match": "ki*ke", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "kinbaku", - "match": "kinbaku", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "kitty-puncher", - "match": "kitty puncher|kitty-puncher|kittypuncher", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "knobbing", - "match": "knobbing", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "kraut", - "match": "kraut|krauts", - "tags": [ - "racial" - ], - "severity": 1, - "exceptions": [ - "sauer*s", - "sauer*" - ] - }, - { - "id": "kynophilia", - "match": "kynophilia|kynophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "lady-boy", - "match": "lady boy|lady-boy|ladyboy", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "leather-restraint", - "match": "leather restraint", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "leather-straight-jacket", - "match": "leather straight jacket", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "lemon-party", - "match": "lemon party|lemonparty", - "tags": [ - "shock" - ], - "severity": 4 - }, - { - "id": "leningrad-steamer", - "match": "leningrad steamer", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "lesbo", - "match": "lesbo", - "tags": [ - "lgbtq" - ], - "severity": 3, - "exceptions": [ - "*s", - "b*k", - "b*ks" - ] - }, - { - "id": "leso", - "match": "leso", - "tags": [ - "lgbtq" - ], - "severity": 3, - "exceptions": [ - "bung*me", - "chuck*me", - "crad*ng", - "crad*ngs", - "cudd*me", - "do*me", - "medd*me", - "medd*meness", - "mett*me", - "nett*me", - "troub*me", - "troub*mely", - "troub*meness", - "unwho*me", - "unwho*mely", - "who*me", - "who*mer", - "who*mest", - "who*mely", - "who*meness", - "who*menesses" - ] - }, - { - "id": "lezzie", - "match": "lezzie|lezzies", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "light-fedora", - "match": "light in the fedora", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "light-loafers", - "match": "light in the loafers", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "light-pants", - "match": "light in the pants", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "limp-wristed", - "match": "limp wristed|limp-wristed", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "literotica", - "match": "literotica", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "lovemaking", - "match": "lovemaking", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "male-squirting", - "match": "male squirting|male-squirting", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "masturbate", - "match": "ma*stu*rbate|ma*stu*rb8|masturbation|masturbating|masterbate|masterb8", - "tags": [ - "sexual" - ], - "severity": 2 - }, - { - "id": "mayonnaise-monkey", - "match": "mayonnaise monkey|mayonnaise monkies", - "tags": [ - "racial" - ], - "severity": 1 - }, - { - "id": "mdlb", - "match": "mdlb", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "meat-masseuse", - "match": "meat masseuse", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "meatspin", - "match": "meatspin|meat spin", - "tags": [ - "shock" - ], - "severity": 4 - }, - { - "id": "menage-a-trois", - "match": "menage a trois|menage-a-trois|menages a trois|menages-a-trois", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "menophilia", - "match": "menophilia|menophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "mexican-pancake", - "match": "mexican pancake", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "milwaukee-blizzard", - "match": "milwaukee blizzard", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "missionary-position", - "match": "missionary position", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "mississippi-birdbath", - "match": "mississippi birdbath", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "mr-hands", - "match": "mr. hands|mr hands|mrhands", - "tags": [ - "shock" - ], - "severity": 4 - }, - { - "id": "muff-diver", - "match": "muff diver|muff-diver|muffdiver", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "muffdiving", - "match": "muffdiving|muff diving|muffdiver|muff diver", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "muscle-mary", - "match": "muscle mary", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "mvtube", - "match": "mvtube", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "nambla", - "match": "nambla", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "necrophilia", - "match": "necrophilia|necrophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "negro", - "match": "negro", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "neonazi", - "match": "neonazi|neo-nazi|neo nazi", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "nigerian-hurricane", - "match": "nigerian hurricane", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "nigga", - "match": "ni*gg*a|ni*gg*s|nignog|nig nog", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "nigger", - "match": "ni*gg*e*r", - "tags": [ - "racial" - ], - "severity": 4 - }, - { - "id": "nipple-clamps", - "match": "nipple clamps|nipple clamp", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "nipples", - "match": "nipples|nipple", - "tags": [ - "sexual" - ], - "severity": 1 - }, - { - "id": "nude", - "match": "nude|nudity", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "nutten", - "match": "nutten", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "nymphomania", - "match": "nymphomania|nymphomaniac|nympho|nimphomania|nimphomaniac|nimpho", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "octopussy", - "match": "octopussy", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "oklahomo", - "match": "oklahomo", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "omorashi", - "match": "omorashi", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "onlyfans", - "match": "onlyfans|only fans", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "orgasm", - "match": "orgasm|orgasms|orgasmic", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "paedophilia|pedophilia", - "match": "paedophilia|pedophilia|paedophile|pedophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "painslut", - "match": "painslut|pain slut", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "paki", - "match": "paki", - "tags": [ - "racial" - ], - "severity": 3, - "exceptions": [ - "*hi" - ] - }, - { - "id": "panamanian-petting-zoo", - "match": "panamanian petting zoo", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "pansy", - "match": "pansy", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "panties", - "match": "panties", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "parthenophilia", - "match": "parthenophilia|parthenophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "pedobear", - "match": "pedobear|paedobear|pedo bear|paedo bear", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "pegging", - "match": "pegging", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "penis", - "match": "pe*ni*s", - "tags": [ - "sexual" - ], - "severity": 1, - "exceptions": [ - "top*h" - ] - }, - { - "id": "peterpuffer", - "match": "peterpuffer|peter-puffer|peter puffer", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "petrol-sniffer", - "match": "petrol sniffer|petrol-sniffer|petrolsniffer", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "phagophilia", - "match": "phagophilia|phagophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "piece-of-shit", - "match": "piece of shit|pieces of shit", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "pikey", - "match": "pikey|pikeys", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "piss-off", - "match": "pi*ss* off", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "piss-pig", - "match": "piss pig|pisspig", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "piss-pig", - "match": "piss pig|pisspig", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "pissed-off", - "match": "pi*ss*ed off", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "pissing", - "match": "pissing", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "playboy", - "match": "playboy", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "pleasure-chest", - "match": "pleasure chest", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "pnigerophilia|pnigophilia", - "match": "pnigerophilia|pnigophilia|pnigerophile|pnigophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "poinephilia", - "match": "poinephilia|poinephile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "ponyboy", - "match": "ponyboy|pony-boy|pony boy", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "ponygirl", - "match": "ponygirl|pony-girl|pony girl", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "ponyplay", - "match": "ponyplay|pony-play", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "poof", - "match": "poof", - "tags": [ - "lgbtq" - ], - "severity": 3, - "exceptions": [ - "*s", - "*tah", - "*tahs", - "*ter", - "*ters", - "*y", - "s*", - "s*ed", - "s*er", - "s*eries", - "s*ers", - "s*ery", - "s*ing", - "s*s", - "s*y" - ] - }, - { - "id": "poon", - "match": "poon|poontang", - "tags": [ - "sexual" - ], - "severity": 3, - "exceptions": [ - "cram*", - "cram*s", - "desserts*", - "desserts*ful", - "desserts*s", - "har*", - "har*ed", - "har*er", - "har*ers", - "har*ing", - "har*s", - "lam*", - "lam*ed", - "lam*er", - "lam*eries", - "lam*ers", - "lam*ery", - "lam*ing", - "lam*s", - "s*", - "s*bill", - "s*bills", - "s*ed", - "s*erism", - "s*erisms", - "s*ey", - "s*eys", - "s*ful", - "s*fuls", - "s*ier", - "s*ies", - "s*iest", - "s*ily", - "s*ing", - "s*s", - "s*sful", - "s*y", - "soups*", - "soups*s", - "tables*", - "tables*ful", - "tables*fuls", - "tables*s", - "tables*sful", - "teas*", - "teas*ful", - "teas*fuls", - "teas*s", - "teas*sful" - ] - }, - { - "id": "poop-chute", - "match": "poop chute|poopchute", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "pornhub", - "match": "pornhub|porn hub", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "pornography", - "match": "pornography|pornographic|porno|pornos|porn", - "tags": [ - "sexual" - ], - "severity": 2 - }, - { - "id": "potato-queen", - "match": "potato queen", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "prince-albert-piercing", - "match": "prince albert piercing", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "proctophilia", - "match": "proctophilia|proctophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "pubes", - "match": "pubes", - "tags": [ - "sexual" - ], - "severity": 1 - }, - { - "id": "punani", - "match": "pu*na*ni|punany", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "pussy", - "match": "pu*ss*y", - "tags": [ - "general" - ], - "severity": 3 - }, - { - "id": "pussy-puncher", - "match": "pussy puncher|pussy-puncher|pussypuncher", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "queef", - "match": "queef|queaf", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "quim", - "match": "quim", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "raghead", - "match": "raghead|rag head|ragheads|rag heads", - "tags": [ - "religious" - ], - "severity": 3 - }, - { - "id": "ramen-yarmulke", - "match": "ramen yarmulke", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "rape", - "match": "rape", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "raping", - "match": "raping|rapist", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "rectum", - "match": "rectum", - "tags": [ - "sexual" - ], - "severity": 1 - }, - { - "id": "retard", - "match": "retard|retarded", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "reverse-cowgirl", - "match": "reverse cowgirl", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "rhabdophilia", - "match": "rhabdophilia|rhabdophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "rhypophilia", - "match": "rhypophilia|rhypophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "rice-queen", - "match": "rice queen", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "rimjob", - "match": "rimjob|rimming", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "ring-raider", - "match": "ring raider|ringraider", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "rusty-trombone", - "match": "rusty trombone", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "sand-nigger", - "match": "sand ni*gg*e*r|sand-ni*gg*e*r|sandni*gg*e*r", - "tags": [ - "racial" - ], - "severity": 4 - }, - { - "id": "santorum", - "match": "santorum", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "scatophilia", - "match": "scatophilia|scatophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "schlong", - "match": "schlong|shlong", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "scissoring", - "match": "scissoring", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "semen", - "match": "semen", - "tags": [ - "sexual" - ], - "severity": 1, - "exceptions": [ - "aba*t", - "aba*ts", - "adverti*t", - "adverti*ts", - "advi*t", - "advi*ts", - "amu*t", - "amu*ts", - "appea*t", - "appea*ts", - "apprai*t", - "apprai*ts", - "arrondis*t", - "arrondis*ts", - "ba*", - "ba*t", - "ba*tless", - "ba*ts", - "bemu*t", - "bemu*ts", - "boulever*t", - "boulever*ts", - "ca*t", - "ca*ts", - "chasti*t", - "chasti*ts", - "deba*t", - "deba*ts", - "defen*", - "despi*t", - "despi*ts", - "disbur*t", - "disbur*ts", - "disgui*t", - "disgui*ts", - "divertis*t", - "divertis*ts", - "ea*t", - "ea*ts", - "eclaircis*t", - "empres*t", - "empres*ts", - "enca*t", - "enca*ts", - "endor*t", - "endor*ts", - "enfranchi*t", - "exci*", - "hor*", - "hou*", - "indor*t", - "indor*ts", - "pas*terie", - "pas*teries", - "reimbur*t", - "reimbur*ts", - "rou*t", - "rou*ts", - "subba*t", - "subba*ts", - "ver*", - "warehou*" - ] - }, - { - "id": "seplophilia", - "match": "seplophilia|seplophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "sex", - "match": "sex", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "shaved pussy", - "match": "shaved pussy|shaved beaver", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "sheepshagger", - "match": "sheepshagger|sheep shagger", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "shemale", - "match": "shemale|she-male|she male", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "shibari", - "match": "shibari", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "shit", - "match": "sh*i*t", - "tags": [ - "general" - ], - "severity": 2, - "exceptions": [ - "*ake", - "mi*", - "*tah", - "*tim" - ] - }, - { - "id": "shithead", - "match": "shithead|shit head", - "tags": [ - "general" - ], - "severity": 3 - }, - { - "id": "shitty", - "match": "shi*tt*y", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "shota", - "match": "shota", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "shrimping", - "match": "shrimping", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "sissy", - "match": "sissy", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "skeet", - "match": "skeet", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "skittles-harvest", - "match": "skittles harvest|skittle harvest", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "slanteye", - "match": "slanteye|slant-eye|slant eye", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "snatch", - "match": "snatch", - "tags": [ - "sexual" - ], - "severity": 1 - }, - { - "id": "snowballing", - "match": "snowballing", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "sod-off", - "match": "sod off", - "tags": [ - "general" - ], - "severity": 1 - }, - { - "id": "sodding", - "match": "sodding", - "tags": [ - "general" - ], - "severity": 1 - }, - { - "id": "sodomize", - "match": "sodomize|sodomise|sodomist|sodomy", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "spastic", - "match": "spastic", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "spearchucker", - "match": "spearchucker", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "spic", - "match": "spic|spics|spick|spicks", - "tags": [ - "racial" - ], - "severity": 3, - "exceptions": [ - "*a", - "*ae", - "*as", - "*ate", - "*ated", - "*cato", - "*catos", - "*e", - "*ebush", - "*ebushes", - "*ed", - "*eless", - "*er", - "*eries", - "*ers", - "*ery", - "*es", - "*ey", - "*ier", - "*iest", - "*ily", - "*iness", - "*inesses", - "*ing", - "*ks", - "*ula", - "*ulae", - "*ular", - "*ulate", - "*ulation", - "*ulations", - "*ule", - "*ules", - "*ulum", - "*y", - "a*", - "a*s", - "all*e", - "all*es", - "aru*es", - "au*ate", - "au*ated", - "au*ates", - "au*ating", - "au*e", - "au*es", - "au*ious", - "au*iously", - "au*iousness", - "con*uities", - "con*uity", - "con*uous", - "con*uously", - "con*uousness", - "de*able", - "de*ableness", - "de*ably", - "haru*ation", - "haru*ations", - "haru*es", - "ho*e", - "ho*es", - "inau*ious", - "inau*iously", - "incon*uous", - "incon*uously", - "mi*kel", - "mi*kels", - "over*e", - "over*ed", - "over*es", - "over*ing", - "oversu*ious", - "per*acious", - "per*aciously", - "per*acities", - "per*acity", - "per*uities", - "per*uity", - "per*uous", - "per*uously", - "per*uousness", - "su*ion", - "su*ioned", - "su*ioning", - "su*ions", - "su*ious", - "su*iously", - "su*iousness", - "tran*uous", - "unsu*ious" - ] - }, - { - "id": "spicy-gringo", - "match": "spicy gringo", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "splooge", - "match": "splooge|splooge moose|spooge", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "spunk", - "match": "spunk", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "strap-on", - "match": "strap on|strap-on", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "strap-on", - "match": "strap-on|strapon", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "strappado", - "match": "strappado", - "tags": [ - "sexual" - ], - "severity": 4 - }, - { - "id": "swamp-guinea", - "match": "swamp guinea|swamp-guinea", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "swastika", - "match": "swastika|svastika|suastika", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "switch-hitter", - "match": "switch hitter", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "t-girl", - "match": "t-girl|tgirl", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "taphephilia", - "match": "taphephilia|taphephile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "tea-bagging", - "match": "tea bagging|tea-bagging|tea bagged|tea-bagged", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "thanatophilia", - "match": "thanatophilia|thanatophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "threesome", - "match": "threesome", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "throating", - "match": "throating", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "thumbzilla", - "match": "thumbzilla", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "timber-nigger", - "match": "timber ni*gg*e*r|timber-ni*gg*e*r|timberni*gg*e*r", - "tags": [ - "racial" - ], - "severity": 4 - }, - { - "id": "tits", - "match": "tits", - "tags": [ - "sexual" - ], - "severity": 2, - "exceptions": [ - "bush*", - "pas*", - "tom*" - ] - }, - { - "id": "titty", - "match": "titt*y|titt*ies", - "tags": [ - "sexual" - ], - "severity": 2 - }, - { - "id": "topless", - "match": "topless", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "tosser", - "match": "tosser", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "towelhead", - "match": "towelhead|towel-head|towel head", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "tranny", - "match": "tranny|trannie", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "transbian", - "match": "transbian", - "tags": [ - "lgbtq" - ], - "severity": 3 - }, - { - "id": "traumatophilia", - "match": "traumatophilia|traumatophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "tribbing", - "match": "tribbing|tribadism", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "tubgirl", - "match": "tubgirl|tub girl", - "tags": [ - "shock" - ], - "severity": 4 - }, - { - "id": "twat", - "match": "twa*t", - "tags": [ - "general" - ], - "severity": 3, - "exceptions": [ - "cu*er", - "mel*er", - "ou*ch", - "sal*er", - "wris*ch" - ] - }, - { - "id": "twink", - "match": "twink", - "tags": [ - "lgbtq" - ], - "severity": 3, - "exceptions": [ - "*ie", - "*ies", - "*le", - "*led", - "*ler", - "*les", - "*lers", - "*ling", - "*lings", - "*ly" - ] - }, - { - "id": "urethra-play", - "match": "urethra play", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "urophilia", - "match": "urophilia|urophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "vagina", - "match": "vagina", - "tags": [ - "sexual" - ], - "severity": 1 - }, - { - "id": "venus-mound", - "match": "venus mound|mound of venus", - "tags": [ - "sexual" - ], - "severity": 1 - }, - { - "id": "viagra", - "match": "viagra", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "vibrator", - "match": "vibrator", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "violet-wand", - "match": "violet wand", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "vorarephilia", - "match": "vorarephilia|vorarephile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "voyeurweb", - "match": "voyeurweb", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "wagon-burner", - "match": "wagon burner|wagon-burner", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "wank", - "match": "wa*nk", - "tags": [ - "sexual" - ], - "severity": 2, - "exceptions": [ - "s*", - "t*" - ] - }, - { - "id": "wanker", - "match": "wa*nker", - "tags": [ - "general" - ], - "severity": 2 - }, - { - "id": "wax-play", - "match": "wax play|wax-play", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "wet-dream", - "match": "wet dream", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "wetback", - "match": "wetback|wet-back|wet back", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "white power", - "match": "whitepower|white-power|white power", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "whore", - "match": "who*re", - "tags": [ - "general" - ], - "severity": 3 - }, - { - "id": "wigger", - "match": "wigger|whigger|wigga", - "tags": [ - "racial" - ], - "severity": 2 - }, - { - "id": "wiitwd", - "match": "wiitwd", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "wog", - "match": "wog|wogs", - "tags": [ - "racial" - ], - "severity": 1, - "exceptions": [ - "horns*gle", - "horns*gled", - "horns*gles", - "horns*gling", - "polli*", - "polli*s", - "polly*", - "polly*s" - ] - }, - { - "id": "wolfbagging", - "match": "wolfbagging", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "worldsex", - "match": "worldsex", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "wrapping-men", - "match": "wrapping men", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "wrinkled-starfish", - "match": "wrinkled starfish", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "xhamster", - "match": "xhamster", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "xnxx", - "match": "xnxx", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "xtube", - "match": "xtube", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "xvideos", - "match": "xvideos", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "xxx", - "match": "xxx", - "tags": [ - "sexual" - ], - "severity": 2 - }, - { - "id": "xyrophilia", - "match": "xyrophilia|xyrophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "zipperhead", - "match": "zipperhead|zipper-head|zipper head", - "tags": [ - "racial" - ], - "severity": 3 - }, - { - "id": "zippocat", - "match": "zippocat|zippo-cat|zippo cat", - "tags": [ - "shock" - ], - "severity": 4 - }, - { - "id": "zoophilia", - "match": "zoophilia|zoophile", - "tags": [ - "sexual" - ], - "severity": 3 - }, - { - "id": "censored-fucking", - "match": "f**ing|f***ing|f**k|f***", - "tags": [ - "general" - ], - "severity": 4 - }, - { - "id": "piece-of-sht", - "match": "piece of sht|sht ai|sht", - "tags": [ - "general" - ], - "severity": 3 - }, - { - "id": "kill-yourself", - "match": "kill yourself|go kill yourself", - "tags": [ - "general" - ], - "severity": 4 - } - ] \ No newline at end of file + { + "id": "1man1jar", + "match": "1m1j|1man1jar|1 man 1 jar|one man one jar|one jar one man", + "tags": [ + "shock" + ], + "severity": 4 + }, + { + "id": "2girls1cup", + "match": "2g1c|2girls1cup|2 girls 1 cup|two girls one cup|one cup two girls", + "tags": [ + "shock" + ], + "severity": 4 + }, + { + "id": "acrotomophilia", + "match": "acrotomophilia|acrotomophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "adjective-cock", + "match": "black cock|big cock|huge cock|giant cock|massive cock|throbbing cock", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "adult-content", + "match": "adult content|adult material", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "alabama-hot-pocket", + "match": "alabama hot pocket", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "alabama-tuna-melt", + "match": "alabama tuna melt", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "alaskan-pipeline", + "match": "alaskan pipeline", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "algophilia", + "match": "algophilia|algophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "anal", + "match": "anal", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "anal-assassin", + "match": "anal assassin", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "anal-astronaut", + "match": "anal astronaut", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "anilingus", + "match": "anilingus", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "anus", + "match": "anus", + "tags": [ + "sexual" + ], + "severity": 1, + "exceptions": [ + "m*", + "m*cript", + "m*cripts", + "pand*", + "pand*es", + "tet*", + "tet*es" + ] + }, + { + "id": "anus-nsfw", + "match": "anus", + "tags": [ + "anatomy", + "sexual" + ], + "severity": 2, + "exceptions": [ + "medical", + "health", + "anatomy", + "doctor", + "tetanus", + "uranus" + ] + }, + { + "id": "apeshit", + "match": "apeshit|ape-shit|ape shit", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "apotemnophilia", + "match": "apotemnophilia|apotemnophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "arousal", + "match": "arousal|aroused|arousing", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "arse", + "match": "arse", + "tags": [ + "sexual" + ], + "severity": 2, + "exceptions": [ + "*n", + "cath*", + "co*", + "he*", + "ho*", + "kath*", + "m*illes", + "p*", + "s*n" + ] + }, + { + "id": "arsehole", + "match": "arseho*le|ass*ho*le", + "tags": [ + "general" + ], + "severity": 3 + }, + { + "id": "ass", + "match": "ass", + "tags": [ + "sexual" + ], + "severity": 1 + }, + { + "id": "ass-bandit", + "match": "ass bandit|arse bandit", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "autoerotic|auto erotic", + "match": "autoerotic|auto erotic", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "babeland", + "match": "babeland", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "baby-batter", + "match": "baby batter|baby gravy|baby juice|ball batter|ball gravy", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "ball-gag", + "match": "ball gag|ball-gag|ballgag", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "ball-kicking", + "match": "ball kicking|ball-kicking", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "ball-licking", + "match": "ball licking|ball-licking", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "ball-sack", + "match": "ball sack", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "ball-sucking", + "match": "ball sucking|ball-sucking", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "ballcuzi", + "match": "ballcuzi", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "bangbros", + "match": "bangbros|bang bros", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "bangbus", + "match": "bangbus|bang bus", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "bareback", + "match": "bareback", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "barely-legal", + "match": "barely legal", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "bastard", + "match": "ba*sta*rd", + "tags": [ + "general" + ], + "severity": 3 + }, + { + "id": "bastinado", + "match": "bastinado", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "batty-boy", + "match": "batty boy|battyboy|batty boi|battyboi", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "bdsm", + "match": "bdsm", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "bean-flicker", + "match": "bean flicker|bean-flicker|beanflicker", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "bean-queen", + "match": "bean queen", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "beaner", + "match": "beaner|beaners", + "tags": [ + "racial" + ], + "severity": 3, + "exceptions": [ + "*ies", + "*y" + ] + }, + { + "id": "beastiality", + "match": "beastiality|beestiality|bestiality", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "beaver-cleaver", + "match": "beaver cleaver", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "beaver-lips", + "match": "beaver lips", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "bellend", + "match": "bell*end", + "tags": [ + "general" + ], + "severity": 3, + "exceptions": [ + "*en" + ] + }, + { + "id": "bellesa", + "match": "bellesa", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "bicon", + "match": "bicon", + "tags": [ + "lgbtq" + ], + "severity": 3, + "exceptions": [ + "*cave", + "*cavities", + "*cavity", + "*vex", + "*vexities", + "*vexity" + ] + }, + { + "id": "big-boobs", + "match": "big boobs|big breasts|big knockers|big tits", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "birdlock", + "match": "birdlock", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "bitch", + "match": "bi*tch|bi*tches", + "tags": [ + "general" + ], + "severity": 3 + }, + { + "id": "bloody", + "match": "bloody", + "tags": [ + "general" + ], + "severity": 1 + }, + { + "id": "blow-your-load", + "match": "blow your load", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "blowjob", + "match": "blowjob|blow-job|blow job", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "blue-waffle", + "match": "blue waffle|bluewaffle", + "tags": [ + "shock" + ], + "severity": 4 + }, + { + "id": "blumpkin", + "match": "blumpkin", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "bollocks", + "match": "bo*ll*o*cks", + "tags": [ + "sexual" + ], + "severity": 1 + }, + { + "id": "bondage", + "match": "bondage|bound|tied up|rope play", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "bone-smuggler", + "match": "bone smuggler|bone-smuggler|bonesmuggler", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "boner", + "match": "boner|raging boner|throbbing boner", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "boob", + "match": "boo*b", + "tags": [ + "sexual" + ], + "severity": 1, + "exceptions": [ + "*ird", + "*oo" + ] + }, + { + "id": "booty-buffer", + "match": "booty buffer|booty-buffer", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "booty-call", + "match": "booty call", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "boston-george", + "match": "boston george", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "breasts", + "match": "breasts", + "tags": [ + "sexual" + ], + "severity": 1, + "exceptions": [ + "*troke" + ] + }, + { + "id": "breasts-nsfw", + "match": "breasts", + "tags": [ + "anatomy", + "sexual" + ], + "severity": 2, + "exceptions": [ + "chicken", + "turkey", + "cancer", + "feeding", + "health", + "medical" + ] + }, + { + "id": "brown-piper", + "match": "brown piper|brown-piper|brownpiper", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "brown-shower", + "match": "brown shower|brown showers", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "brownie-royalty", + "match": "brownie king|brownie queen", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "buddhahead", + "match": "buddhahead|buddha head|buddha-head", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "bufter", + "match": "bufter|bufty", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "bugger", + "match": "bugg*er", + "tags": [ + "general" + ], + "severity": 1, + "exceptions": [ + "de*", + "hum*" + ] + }, + { + "id": "bukkake", + "match": "bukkake", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "bulldyke", + "match": "bulldyke", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "bullet-vibe", + "match": "bullet vibe|bullet vibrator", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "bullshit", + "match": "bullshit|bull-shit|bull shit", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "bum-chum", + "match": "bum chum|bum-chum|bumchum", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "bum-driller", + "match": "bum driller|bum-driller|bumdriller", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "butt-boy", + "match": "butt boy|butt-boy|buttboy|bum boy|bum-boy|bumboy", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "butt-pilot", + "match": "butt pilot|bum pilot", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "butt-pirate", + "match": "butt pirate|butt-pirate|bum pirate|bum-pirate", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "butt-rider", + "match": "butt rider|buttrider|bum rider|bumrider", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "butt-robber", + "match": "butt robber|butt-robber|buttrobber|bum robber|bum-robber|bumrobber", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "butt-rustler", + "match": "butt rustler|bum rustler", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "butthole-engineer", + "match": "butthole engineer|bumhole engineer", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "call-girl", + "match": "call girl|call girls|callgirl", + "tags": [ + "sexual", + "solicitation" + ], + "severity": 3 + }, + { + "id": "cam-girl", + "match": "cam girl|camgirl|cam boy|camboy", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "camel-jockey", + "match": "camel jockey|cameljockey|camel jockies|cameljockies", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "camel-toe", + "match": "camel toe", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "canadian-porch-swing", + "match": "canadian porch swing", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "carpet-muncher", + "match": "carpet muncher|carpetmuncher", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "casting-couch", + "match": "casting couch", + "tags": [ + "sexual", + "exploitation" + ], + "severity": 3 + }, + { + "id": "cheese-monkey", + "match": "cheese-eating surrender monkey|cheese eating surrender monkey", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "chi-chi-man", + "match": "chi chi man|chi-chi man", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "chicken-queen", + "match": "chicken queen", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "chinaman", + "match": "chinaman|china man|chinamen|china men", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "ching-chong", + "match": "ching-chong|ching chong", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "chink", + "match": "chink|chinks|chinky", + "tags": [ + "racial" + ], + "severity": 3, + "exceptions": [ + "*apin", + "*apins", + "*ed", + "*ier", + "*iest", + "*ing", + "pa*o", + "pa*os" + ] + }, + { + "id": "chocolate-rosebud", + "match": "chocolate rosebud|chocolate rosebuds", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "cholerophilia", + "match": "cholerophilia|cholerophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "christ", + "match": "chri*st", + "tags": [ + "religious" + ], + "severity": 1, + "exceptions": [ + "*en", + "*ian", + "*ie", + "*y" + ] + }, + { + "id": "cialis", + "match": "cialis", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "circlejerk", + "match": "circlejerk|circle-jerk", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "cishet", + "match": "cishet", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "cissy", + "match": "cissy|cissie", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "claustrophilia", + "match": "claustrophilia|claustrophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "cleveland-accordion", + "match": "cleveland accordion", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "cleveland-hot-waffle", + "match": "cleveland hot waffle", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "cleveland-steamer", + "match": "cleveland steamer", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "climax", + "match": "climax", + "tags": [ + "sexual" + ], + "severity": 3, + "exceptions": [ + "story", + "movie", + "film", + "book", + "plot" + ] + }, + { + "id": "clit", + "match": "clit", + "tags": [ + "sexual" + ], + "severity": 3, + "exceptions": [ + "*ella", + "*ellum", + "*ic", + "*icize", + "*icized", + "*icizes", + "*icizing", + "*ics", + "ana*ic", + "cy*ol", + "cy*ols", + "en*ic", + "en*ics", + "hetero*e", + "hetero*es", + "pa*axel", + "pa*axels", + "pro*ic", + "pro*ics" + ] + }, + { + "id": "clitoris", + "match": "cli*tori*s", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "clover-clamps", + "match": "clover clamps|clover clamp", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "clunge", + "match": "clu*nge", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "clusterfuck", + "match": "clusterfuck|cluster-fuck|cluster fuck", + "tags": [ + "general" + ], + "severity": 4 + }, + { + "id": "cock", + "match": "cock", + "tags": [ + "sexual" + ], + "severity": 2, + "exceptions": [ + "*ade", + "*aded", + "*ades", + "*alorum", + "*alorums", + "*amamie", + "*amamy", + "*apoo", + "*apoos", + "*ateel", + "*ateels", + "*atiel", + "*atiels", + "*atoo", + "*atoos", + "*atrice", + "*atrices", + "*bill", + "*billed", + "*billing", + "*bills", + "*boat", + "*boats", + "*chafer", + "*chafers", + "*crow", + "*crows", + "*ed", + "*er", + "*ered", + "*erel", + "*erels", + "*ering", + "*ers", + "*eye", + "*eyed", + "*eyedly", + "*eyedness", + "*eyednesses", + "*eyes", + "*horse", + "*horses", + "*ier", + "*iest", + "*ily", + "*iness", + "*inesses", + "*ing", + "*ish", + "*le", + "*lebur", + "*leburs", + "*led", + "*les", + "*leshell", + "*leshells", + "*like", + "*ling", + "*loft", + "*lofts", + "*ney", + "*neyfied", + "*neyfies", + "*neyfy", + "*neyfying", + "*neyish", + "*neyism", + "*neyisms", + "*neys", + "*pit", + "*pits", + "*roach", + "*roaches", + "*s", + "*scomb", + "*scombs", + "*sfoot", + "*sfoots", + "*shies", + "*shut", + "*shuts", + "*shy", + "*spur", + "*spurs", + "*sucker", + "*suckers", + "*sure", + "*surely", + "*sureness", + "*surenesses", + "*swain", + "*swains", + "*tail", + "*tailed", + "*tailing", + "*tails", + "*up", + "*ups", + "*y", + "a*", + "baw*", + "baw*s", + "bib*", + "bib*s", + "billy*", + "billy*s", + "black*", + "black*s", + "cold*", + "cold*ed", + "cold*ing", + "cold*s", + "game*", + "game*s", + "gor*", + "gor*s", + "hay*", + "hay*s", + "moor*", + "moor*s", + "pea*", + "pea*ed", + "pea*ier", + "pea*iest", + "pea*ing", + "pea*ish", + "pea*s", + "pea*y", + "pet*", + "pet*s", + "pinch*", + "pinch*s", + "poppy*", + "poppy*s", + "prin*", + "prin*s", + "re*", + "re*ed", + "re*ing", + "re*s", + "sea*", + "sea*s", + "shuttle*", + "shuttle*ed", + "shuttle*ing", + "shuttle*s", + "stop*", + "stop*s", + "un*", + "un*ed", + "un*ing", + "un*s", + "weather*", + "weather*s", + "wood*", + "wood*s" + ] + }, + { + "id": "cockpipe-cosmonaut", + "match": "cockpipe cosmonaut", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "cockstruction-worker", + "match": "cockstruction worker", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "coimetrophilia", + "match": "coimetrophilia|coimetrophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "collaring", + "match": "collaring|collared", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "coon", + "match": "coon|coons", + "tags": [ + "racial" + ], + "severity": 3, + "exceptions": [ + "barra*", + "coc*", + "coc*ed", + "puc*", + "rac*", + "ty*", + "*tie", + "* can", + "*can", + "* hound", + "*hound", + "* skin", + "*skin" + ] + }, + { + "id": "coprophilia", + "match": "coprophilia|coprophile|coprolagnia", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "cornhole", + "match": "cornhole", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "crafty-butcher", + "match": "crafty butcher", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "crap", + "match": "cra*p", + "tags": [ + "general" + ], + "severity": 1, + "exceptions": [ + "*e", + "*ing", + "*shoot", + "*ulent", + "*ulous", + "s*" + ] + }, + { + "id": "creampie", + "match": "creampie|cream-pie", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "cum", + "match": "cum", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "cumming", + "match": "cumming", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "cumshot", + "match": "cumshot|cumshots|cum shot|cum shots", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "cunnilingus", + "match": "cunnilingus", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "cunt", + "match": "cu*n*t|ku*nt|cunts|kunts", + "tags": [ + "general" + ], + "severity": 4, + "exceptions": [ + "s*horpe" + ] + }, + { + "id": "cuntboy", + "match": "cuntboy|cunt-boy|cunt boy", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "curry-muncher", + "match": "curry muncher|curry-muncher|currymuncher", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "damn", + "match": "da*mn", + "tags": [ + "religious" + ], + "severity": 1 + }, + { + "id": "darkie", + "match": "darkie|darkies|darky|darkey", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "date-rape", + "match": "date rape|daterape", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "ddlg", + "match": "ddlg", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "deep-throat", + "match": "deep throat|deep-throat|deepthroat", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dendrophilia", + "match": "dendrophilia|dendrophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dick", + "match": "di*ck", + "tags": [ + "sexual" + ], + "severity": 2, + "exceptions": [ + "*cissel", + "*en", + "*er", + "bene*", + "me*", + "zad*" + ] + }, + { + "id": "dickgirl", + "match": "dickgirl|dick-girl|dick girl", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "dildo", + "match": "dildo|dildos", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dingleberry", + "match": "dingleberry|dingleberries", + "tags": [ + "general" + ], + "severity": 1 + }, + { + "id": "dipsea", + "match": "dipsea", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dirty-pillows", + "match": "dirty pillows", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dirty-sanchez", + "match": "dirty sanchez", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dishabiliophilia", + "match": "dishabiliophilia|dishabiliophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "doggie-style", + "match": "doggie style|doggie-style|doggiestyle|doggy style|doggy-style|doggystyle|dog style", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dogshit", + "match": "dogshit|dog-shit|dog shit", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "dolcett", + "match": "dolcett", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dominant", + "match": "dominant|dominate", + "tags": [ + "sexual" + ], + "severity": 3, + "exceptions": [ + "market", + "species", + "hand", + "gene", + "trait" + ] + }, + { + "id": "domination", + "match": "domination", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dominatrix", + "match": "dominatrix|domme|dommes", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "donkey-punch", + "match": "donkey punch", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "donut-muncher", + "match": "donut muncher", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "donut-puncher", + "match": "donut puncher", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "double-penetration", + "match": "double penetration|dp action", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dry-hump", + "match": "dry hump", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dune-coon", + "match": "dune coon|dune-coon|doon coon|dooncoon", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "dutch-rudder", + "match": "dutch rudder", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "dyke", + "match": "dyke", + "tags": [ + "lgbtq" + ], + "severity": 3, + "exceptions": [ + "van*", + "van*d", + "van*s" + ] + }, + { + "id": "dystychiphilia", + "match": "dystychiphilia|dystychiphile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "edgeplay", + "match": "edgeplay|edge play", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "ejaculate", + "match": "ejaculate|ejaculation|ejaculating|ejaculated", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "electro-play", + "match": "electro-play|electroplay", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "emetophilia", + "match": "emetophilia|emetophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "enby", + "match": "enby", + "tags": [ + "lgbtq" + ], + "severity": 3, + "exceptions": [ + "all*", + "as*", + "brook*", + "ca*", + "d*", + "froz*te", + "gat*", + "hold*", + "lack*", + "laz*", + "nav*", + "ott*", + "r*gda", + "t*", + "warr*", + "wh*" + ] + }, + { + "id": "erotic", + "match": "erotic", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "escort", + "match": "escort|escorts|escorting", + "tags": [ + "sexual", + "solicitation" + ], + "severity": 3, + "exceptions": [ + "police", + "security", + "military", + "ford", + "armed", + "guard" + ] + }, + { + "id": "eskimo-trebuchet", + "match": "eskimo trebuchet", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "explicit", + "match": "explicit", + "tags": [ + "sexual" + ], + "severity": 2, + "exceptions": [ + "warning", + "content", + "language", + "lyrics" + ] + }, + { + "id": "eyetie", + "match": "eyetie|eye-tie", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "fag", + "match": "fa*g", + "tags": [ + "lgbtq" + ], + "severity": 3, + "exceptions": [ + "lea*e", + "lea*es", + "ser*e", + "ser*es", + "whar*e", + "whar*es" + ] + }, + { + "id": "fag-bomb", + "match": "fag bomb|fag-bomb|fagbomb", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "faggot", + "match": "fa*gg*o*t|fagot", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "fantasize", + "match": "fantasize|fantasizing|fantasy|fantasies", + "tags": [ + "sexual" + ], + "severity": 2, + "exceptions": [ + "football", + "final", + "sports", + "book", + "movie", + "game", + "sci-fi", + "fiction", + "novel" + ] + }, + { + "id": "felch", + "match": "felch|felching", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "fellatio", + "match": "fellatio|fellating", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "female-squirting", + "match": "female squirting", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "figging", + "match": "figging", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "fingerbang", + "match": "fingerbang|finger bang|fingerbanging", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "fingering", + "match": "fingering|fingered", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "finocchio", + "match": "finocchio|finochio|finoccio", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "fisting", + "match": "fisting|fisted", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "flirt", + "match": "flirt|flirting|flirtatious", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "footjob", + "match": "footjob|foot-job|foot job", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "french-rudder", + "match": "french rudder", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "frogeater", + "match": "frogeater|frog-eater|frog eater", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "frolicme", + "match": "frolicme|frolic me", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "frotting", + "match": "frotting|frottage", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "fuck", + "match": "fu*c*k|fucks|fu*c*ken|fu*c*ker|fu*ckers|fu*c*kin|fu*c*king", + "tags": [ + "general" + ], + "severity": 4 + }, + { + "id": "fuckhead", + "match": "fuckhead|fuckheads", + "tags": [ + "general" + ], + "severity": 4 + }, + { + "id": "fucktard", + "match": "fucktard|fucktards", + "tags": [ + "general" + ], + "severity": 4 + }, + { + "id": "fuckwad", + "match": "fuckwad|fuckwads", + "tags": [ + "general" + ], + "severity": 4 + }, + { + "id": "fuckwit", + "match": "fuckwit|fuckwits|fuckwhit|fuck-wit", + "tags": [ + "general" + ], + "severity": 4 + }, + { + "id": "fudge-packer", + "match": "fudge packer|fudge-packer|fudgepacker", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "futanari", + "match": "futanari", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "g-spot", + "match": "g-spot", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "gangbang", + "match": "gangbang|gang bang", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "gay-sex", + "match": "gay sex", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "gaysian", + "match": "gaysian", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "genitals", + "match": "genitals", + "tags": [ + "sexual" + ], + "severity": 1 + }, + { + "id": "genitorture", + "match": "genitorture", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "gerontophilia", + "match": "gerontophilia|gerontophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "gin-jockey", + "match": "gin jockey|gin jocky", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "girl-on-top", + "match": "girl on top", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "goatse", + "match": "goatse|goatcx", + "tags": [ + "shock" + ], + "severity": 4 + }, + { + "id": "god-damn", + "match": "god damn|god-damn|goddamn|god damned|god-damned|goddamned", + "tags": [ + "religious" + ], + "severity": 2 + }, + { + "id": "gokkun", + "match": "gokkun|go-kun", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "golden-shower", + "match": "golden shower|golden showers|yellow shower|yellow showers", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "golliwog", + "match": "golliwog|gollywog", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "gook", + "match": "gook|gooks|gook-eye|gooky|gookie", + "tags": [ + "racial" + ], + "severity": 3, + "exceptions": [ + "gobblede*", + "gobblede*s", + "gobbledy*", + "gobbledy*s" + ] + }, + { + "id": "goregasm", + "match": "goregasm", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "greaseball", + "match": "greaseball", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "grey-queen", + "match": "grey queen|gray queen", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "grope", + "match": "grope", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "group-sex", + "match": "group sex", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "gym-bunny", + "match": "gym bunny|gymbunny", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "hajji", + "match": "haji|hajj*i|hadji", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "hand-job", + "match": "hand job|hand-job|handjob", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "happy-ending", + "match": "happy ending|happy endings", + "tags": [ + "sexual", + "solicitation" + ], + "severity": 3, + "exceptions": [ + "movie", + "film", + "story", + "book", + "fairy tale", + "fairytale" + ] + }, + { + "id": "hell", + "match": "hell", + "tags": [ + "religious" + ], + "severity": 1, + "exceptions": [ + "*cat", + "*er", + "*fire", + "*kite", + "*ed", + "*en", + "*ion", + "*ish", + "*o", + "ec*e", + "p*", + "s*" + ] + }, + { + "id": "hermie", + "match": "hermie", + "tags": [ + "lgbtq" + ], + "severity": 3, + "exceptions": [ + "diat*s", + "endot*s", + "homeot*s" + ] + }, + { + "id": "hickory-switch", + "match": "hickory switch", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "hippophilia", + "match": "hippophilia|hippophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "hire", + "match": "hire an escort|hire a hooker|hire a prostitute|soliciting", + "tags": [ + "sexual", + "solicitation" + ], + "severity": 3 + }, + { + "id": "homoerotic", + "match": "homoerotic", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "honkey", + "match": "honkey|honky|honkeys|honkies", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "hooker", + "match": "hooker|hookers", + "tags": [ + "sexual", + "solicitation" + ], + "severity": 3 + }, + { + "id": "hookup", + "match": "hookup|hook up|hooking up", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "horny", + "match": "horny", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "horseshit", + "match": "horseshit|horse-shit|horse shit", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "hot-carl", + "match": "hot carl", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "hot-richard", + "match": "hot richard", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "how-to-kill", + "match": "how to kill|how to murder|how do i kill|how do i murder", + "tags": [ + "violence", + "harm" + ], + "severity": 4 + }, + { + "id": "humping", + "match": "humping", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "hymie", + "match": "hymie|heimie", + "tags": [ + "racial" + ], + "severity": 2, + "exceptions": [ + "alc*s", + "prings*ella", + "t*r", + "t*st" + ] + }, + { + "id": "impact-play", + "match": "impact play|impact-play", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "incest", + "match": "incest", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "intercourse", + "match": "intercourse", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "jack-off", + "match": "jack off|jack-off", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "jail-bait", + "match": "jail bait|jailbait", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "jap", + "match": "jap", + "tags": [ + "racial" + ], + "severity": 1, + "exceptions": [ + "*an", + "*anize", + "*anized", + "*anizes", + "*anizing", + "*anned", + "*anners", + "*anner", + "*anning", + "*ans", + "*e", + "*ed", + "*er", + "*eries", + "*ers", + "*ery", + "*es", + "*ing", + "*ingly", + "*onica", + "*onicas", + "*onaiserie", + "*onaiseries", + "ca*ut", + "ca*uts", + "jipi*a", + "jipi*as" + ] + }, + { + "id": "jelly-donut", + "match": "jelly donut", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "jerk-off", + "match": "jerk off|jerk-off", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "jerkmate", + "match": "jerkmate|jerk mate", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "jesus", + "match": "je*su*s", + "tags": [ + "religious" + ], + "severity": 1, + "exceptions": [ + "be*" + ] + }, + { + "id": "jesus-christ", + "match": "je*su*s chri*st", + "tags": [ + "religious" + ], + "severity": 2 + }, + { + "id": "jigaboo", + "match": "jig*aboo*|jig*gerboo*", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "jizz", + "match": "jizz", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "juggs", + "match": "juggs", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "jungle-bunny", + "match": "jungle bunny|junglebunny", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "kennebunkport-surprise", + "match": "kennebunkport surprise", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "kentucky-klondike", + "match": "kentucky klondike", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "kentucky-tractor-puller", + "match": "kentucky tractor puller", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "kike", + "match": "ki*ke", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "kill", + "match": "kill yourself|kill myself|murder someone", + "tags": [ + "violence", + "harm" + ], + "severity": 4, + "exceptions": [ + "time", + "vibe", + "mood", + "skill", + "thrill" + ] + }, + { + "id": "kill-yourself", + "match": "kill yourself|go kill yourself", + "tags": [ + "general" + ], + "severity": 4 + }, + { + "id": "kinbaku", + "match": "kinbaku", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "kinky", + "match": "kinky|kink", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "kitty-puncher", + "match": "kitty puncher|kitty-puncher|kittypuncher", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "knobbing", + "match": "knobbing", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "kraut", + "match": "kraut|krauts", + "tags": [ + "racial" + ], + "severity": 1, + "exceptions": [ + "sauer*s", + "sauer*" + ] + }, + { + "id": "kynophilia", + "match": "kynophilia|kynophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "lady-boy", + "match": "lady boy|lady-boy|ladyboy", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "leather-restraint", + "match": "leather restraint", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "leather-straight-jacket", + "match": "leather straight jacket", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "lemon-party", + "match": "lemon party|lemonparty", + "tags": [ + "shock" + ], + "severity": 4 + }, + { + "id": "leningrad-steamer", + "match": "leningrad steamer", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "lesbo", + "match": "lesbo", + "tags": [ + "lgbtq" + ], + "severity": 3, + "exceptions": [ + "*s", + "b*k", + "b*ks" + ] + }, + { + "id": "leso", + "match": "leso", + "tags": [ + "lgbtq" + ], + "severity": 3, + "exceptions": [ + "bung*me", + "chuck*me", + "crad*ng", + "crad*ngs", + "cudd*me", + "do*me", + "medd*me", + "medd*meness", + "mett*me", + "nett*me", + "troub*me", + "troub*mely", + "troub*meness", + "unwho*me", + "unwho*mely", + "who*me", + "who*mer", + "who*mest", + "who*mely", + "who*meness", + "who*menesses" + ] + }, + { + "id": "lezzie", + "match": "lezzie|lezzies", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "light-fedora", + "match": "light in the fedora", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "light-loafers", + "match": "light in the loafers", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "light-pants", + "match": "light in the pants", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "limp-wristed", + "match": "limp wristed|limp-wristed", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "literotica", + "match": "literotica", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "lovemaking", + "match": "lovemaking", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "lust", + "match": "lust|lusting|lustful|lusty", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "male-squirting", + "match": "male squirting|male-squirting", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "masturbate", + "match": "ma*stu*rbate|ma*stu*rb8|masturbation|masturbating|masterbate|masterb8", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "mayonnaise-monkey", + "match": "mayonnaise monkey|mayonnaise monkies", + "tags": [ + "racial" + ], + "severity": 1 + }, + { + "id": "mdlb", + "match": "mdlb", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "meat-masseuse", + "match": "meat masseuse", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "meatspin", + "match": "meatspin|meat spin", + "tags": [ + "shock" + ], + "severity": 4 + }, + { + "id": "menage-a-trois", + "match": "menage a trois|menage-a-trois|menages a trois|menages-a-trois", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "menophilia", + "match": "menophilia|menophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "mexican-pancake", + "match": "mexican pancake", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "milwaukee-blizzard", + "match": "milwaukee blizzard", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "missionary-position", + "match": "missionary position", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "mississippi-birdbath", + "match": "mississippi birdbath", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "molest", + "match": "molest|molested|molesting|molestation", + "tags": [ + "sexual", + "abuse" + ], + "severity": 4 + }, + { + "id": "mr-hands", + "match": "mr. hands|mr hands|mrhands", + "tags": [ + "shock" + ], + "severity": 4 + }, + { + "id": "muff-diver", + "match": "muff diver|muff-diver|muffdiver", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "muffdiving", + "match": "muffdiving|muff diving|muffdiver|muff diver", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "murder", + "match": "murder|murdering|murderer", + "tags": [ + "violence", + "harm" + ], + "severity": 3, + "exceptions": [ + "mystery", + "podcast", + "documentary", + "news", + "she wrote" + ] + }, + { + "id": "muscle-mary", + "match": "muscle mary", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "mvtube", + "match": "mvtube", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "naked", + "match": "naked", + "tags": [ + "sexual" + ], + "severity": 2, + "exceptions": [ + "eye", + "truth", + "facts", + "mole rat" + ] + }, + { + "id": "nambla", + "match": "nambla", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "necrophilia", + "match": "necrophilia|necrophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "negro", + "match": "negro", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "neonazi", + "match": "neonazi|neo-nazi|neo nazi", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "nigerian-hurricane", + "match": "nigerian hurricane", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "nigga", + "match": "ni*gg*a|ni*gg*s|nignog|nig nog", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "nigger", + "match": "ni*gg*e*r", + "tags": [ + "racial" + ], + "severity": 4 + }, + { + "id": "nipple-clamps", + "match": "nipple clamps|nipple clamp", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "nipples", + "match": "nipples|nipple", + "tags": [ + "sexual" + ], + "severity": 1 + }, + { + "id": "nsfw", + "match": "nsfw", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "nude", + "match": "nude|nudity", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "nudes", + "match": "nudes|nude pic|nude pics|nude photo|nude photos", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "nutten", + "match": "nutten", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "nymphomania", + "match": "nymphomania|nymphomaniac|nympho|nimphomania|nimphomaniac|nimpho", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "octopussy", + "match": "octopussy", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "oklahomo", + "match": "oklahomo", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "omorashi", + "match": "omorashi", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "onlyfans", + "match": "onlyfans|only fans", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "orgasm", + "match": "orgasm|orgasms|orgasmic", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "paedophilia|pedophilia", + "match": "paedophilia|pedophilia|paedophile|pedophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "painslut", + "match": "painslut|pain slut", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "paki", + "match": "paki", + "tags": [ + "racial" + ], + "severity": 3, + "exceptions": [ + "*hi" + ] + }, + { + "id": "panamanian-petting-zoo", + "match": "panamanian petting zoo", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "pansy", + "match": "pansy", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "panties", + "match": "panties", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "parthenophilia", + "match": "parthenophilia|parthenophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "pedobear", + "match": "pedobear|paedobear|pedo bear|paedo bear", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "pegging", + "match": "pegging", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "penetration", + "match": "penetration|penetrate|penetrating", + "tags": [ + "sexual" + ], + "severity": 3, + "exceptions": [ + "market", + "testing", + "security", + "depth" + ] + }, + { + "id": "penis", + "match": "pe*ni*s", + "tags": [ + "sexual" + ], + "severity": 1, + "exceptions": [ + "top*h" + ] + }, + { + "id": "peterpuffer", + "match": "peterpuffer|peter-puffer|peter puffer", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "petrol-sniffer", + "match": "petrol sniffer|petrol-sniffer|petrolsniffer", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "phagophilia", + "match": "phagophilia|phagophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "piece-of-shit", + "match": "piece of shit|pieces of shit", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "piece-of-sht", + "match": "piece of sht|sht ai", + "tags": [ + "general" + ], + "severity": 3 + }, + { + "id": "pikey", + "match": "pikey|pikeys", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "piss-off", + "match": "pi*ss* off", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "piss-pig", + "match": "piss pig|pisspig", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "piss-pig", + "match": "piss pig|pisspig", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "pissed-off", + "match": "pi*ss*ed off", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "pissing", + "match": "pissing", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "playboy", + "match": "playboy", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "pleasure-chest", + "match": "pleasure chest", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "pnigerophilia|pnigophilia", + "match": "pnigerophilia|pnigophilia|pnigerophile|pnigophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "poinephilia", + "match": "poinephilia|poinephile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "ponyboy", + "match": "ponyboy|pony-boy|pony boy", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "ponygirl", + "match": "ponygirl|pony-girl|pony girl", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "ponyplay", + "match": "ponyplay|pony-play", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "poof", + "match": "poof", + "tags": [ + "lgbtq" + ], + "severity": 3, + "exceptions": [ + "*s", + "*tah", + "*tahs", + "*ter", + "*ters", + "*y", + "s*", + "s*ed", + "s*er", + "s*eries", + "s*ers", + "s*ery", + "s*ing", + "s*s", + "s*y" + ] + }, + { + "id": "poon", + "match": "poon|poontang", + "tags": [ + "sexual" + ], + "severity": 3, + "exceptions": [ + "cram*", + "cram*s", + "desserts*", + "desserts*ful", + "desserts*s", + "har*", + "har*ed", + "har*er", + "har*ers", + "har*ing", + "har*s", + "lam*", + "lam*ed", + "lam*er", + "lam*eries", + "lam*ers", + "lam*ery", + "lam*ing", + "lam*s", + "s*", + "s*bill", + "s*bills", + "s*ed", + "s*erism", + "s*erisms", + "s*ey", + "s*eys", + "s*ful", + "s*fuls", + "s*ier", + "s*ies", + "s*iest", + "s*ily", + "s*ing", + "s*s", + "s*sful", + "s*y", + "soups*", + "soups*s", + "tables*", + "tables*ful", + "tables*fuls", + "tables*s", + "tables*sful", + "teas*", + "teas*ful", + "teas*fuls", + "teas*s", + "teas*sful" + ] + }, + { + "id": "poop-chute", + "match": "poop chute|poopchute", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "pornhub", + "match": "pornhub|porn hub", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "pornography", + "match": "pornography|pornographic|porno|pornos|porn", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "potato-queen", + "match": "potato queen", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "prince-albert-piercing", + "match": "prince albert piercing", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "proctophilia", + "match": "proctophilia|proctophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "prostitute", + "match": "prostitute|prostitutes|prostitution", + "tags": [ + "sexual", + "solicitation" + ], + "severity": 3 + }, + { + "id": "pubes", + "match": "pubes", + "tags": [ + "sexual" + ], + "severity": 1 + }, + { + "id": "punani", + "match": "pu*na*ni|punany", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "pussy", + "match": "pu*ss*y", + "tags": [ + "general" + ], + "severity": 3 + }, + { + "id": "pussy-puncher", + "match": "pussy puncher|pussy-puncher|pussypuncher", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "queef", + "match": "queef|queaf", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "quim", + "match": "quim", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "raghead", + "match": "raghead|rag head|ragheads|rag heads", + "tags": [ + "religious" + ], + "severity": 3 + }, + { + "id": "ramen-yarmulke", + "match": "ramen yarmulke", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "rape", + "match": "rape", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "raping", + "match": "raping|rapist", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "rectum", + "match": "rectum", + "tags": [ + "sexual" + ], + "severity": 1 + }, + { + "id": "retard", + "match": "retard|retarded", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "reverse-cowgirl", + "match": "reverse cowgirl", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "rhabdophilia", + "match": "rhabdophilia|rhabdophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "rhypophilia", + "match": "rhypophilia|rhypophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "rice-queen", + "match": "rice queen", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "rimjob", + "match": "rimjob|rimming", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "ring-raider", + "match": "ring raider|ringraider", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "roleplay", + "match": "roleplay|role play|roleplaying", + "tags": [ + "sexual" + ], + "severity": 2, + "exceptions": [ + "game", + "gaming", + "dnd", + "tabletop", + "character" + ] + }, + { + "id": "rusty-trombone", + "match": "rusty trombone", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "sand-nigger", + "match": "sand ni*gg*e*r|sand-ni*gg*e*r|sandni*gg*e*r", + "tags": [ + "racial" + ], + "severity": 4 + }, + { + "id": "santorum", + "match": "santorum", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "scatophilia", + "match": "scatophilia|scatophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "schlong", + "match": "schlong|shlong", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "scissoring", + "match": "scissoring", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "seduce", + "match": "seduce", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "seductive", + "match": "seductive|seduction|seduce|seducing", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "semen", + "match": "semen", + "tags": [ + "sexual" + ], + "severity": 1, + "exceptions": [ + "aba*t", + "aba*ts", + "adverti*t", + "adverti*ts", + "advi*t", + "advi*ts", + "amu*t", + "amu*ts", + "appea*t", + "appea*ts", + "apprai*t", + "apprai*ts", + "arrondis*t", + "arrondis*ts", + "ba*", + "ba*t", + "ba*tless", + "ba*ts", + "bemu*t", + "bemu*ts", + "boulever*t", + "boulever*ts", + "ca*t", + "ca*ts", + "chasti*t", + "chasti*ts", + "deba*t", + "deba*ts", + "defen*", + "despi*t", + "despi*ts", + "disbur*t", + "disbur*ts", + "disgui*t", + "disgui*ts", + "divertis*t", + "divertis*ts", + "ea*t", + "ea*ts", + "eclaircis*t", + "empres*t", + "empres*ts", + "enca*t", + "enca*ts", + "endor*t", + "endor*ts", + "enfranchi*t", + "exci*", + "hor*", + "hou*", + "indor*t", + "indor*ts", + "pas*terie", + "pas*teries", + "reimbur*t", + "reimbur*ts", + "rou*t", + "rou*ts", + "subba*t", + "subba*ts", + "ver*", + "warehou*" + ] + }, + { + "id": "sensual", + "match": "sensual|sensuality", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "seplophilia", + "match": "seplophilia|seplophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "sex", + "match": "sex", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "sex-tape", + "match": "sex tape|sextape", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "sex-worker", + "match": "sex worker|sex workers|sexworker", + "tags": [ + "sexual", + "solicitation" + ], + "severity": 2 + }, + { + "id": "sexual", + "match": "sexual|sexually", + "tags": [ + "sexual" + ], + "severity": 2, + "exceptions": [ + "orientation", + "identity", + "harassment", + "assault", + "abuse", + "education", + "health", + "reproduction", + "biology", + "asexual", + "bisexual", + "homosexual", + "heterosexual", + "pansexual" + ] + }, + { + "id": "sexual-favors", + "match": "sexual favors|sexual favour|sexual favours", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "sexual-positions", + "match": "sexual positions|sexual position|sex positions|sex position", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "sexy", + "match": "sexy", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "shaved pussy", + "match": "shaved pussy|shaved beaver", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "sheepshagger", + "match": "sheepshagger|sheep shagger", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "shemale", + "match": "shemale|she-male|she male", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "shibari", + "match": "shibari", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "shit", + "match": "sh*i*t", + "tags": [ + "general" + ], + "severity": 2, + "exceptions": [ + "*ake", + "mi*", + "*tah", + "*tim" + ] + }, + { + "id": "shithead", + "match": "shithead|shit head", + "tags": [ + "general" + ], + "severity": 3 + }, + { + "id": "shitty", + "match": "shi*tt*y", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "shota", + "match": "shota", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "shrimping", + "match": "shrimping", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "sissy", + "match": "sissy", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "skeet", + "match": "skeet", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "skittles-harvest", + "match": "skittles harvest|skittle harvest", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "slanteye", + "match": "slanteye|slant-eye|slant eye", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "slave", + "match": "slave|slavery|enslaved", + "tags": [ + "exploitation" + ], + "severity": 2, + "exceptions": [ + "historical", + "history", + "civil war", + "ancient" + ] + }, + { + "id": "snatch", + "match": "snatch", + "tags": [ + "sexual" + ], + "severity": 1 + }, + { + "id": "snowballing", + "match": "snowballing", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "snuff", + "match": "snuff|snuff film|snuff video", + "tags": [ + "violence", + "extreme" + ], + "severity": 4 + }, + { + "id": "sod-off", + "match": "sod off", + "tags": [ + "general" + ], + "severity": 1 + }, + { + "id": "sodding", + "match": "sodding", + "tags": [ + "general" + ], + "severity": 1 + }, + { + "id": "sodomize", + "match": "sodomize|sodomise|sodomist|sodomy", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "spastic", + "match": "spastic", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "spearchucker", + "match": "spearchucker", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "sperm", + "match": "sperm|semen", + "tags": [ + "sexual" + ], + "severity": 3, + "exceptions": [ + "medical", + "biology", + "reproduction", + "fertility" + ] + }, + { + "id": "spic", + "match": "spic|spics|spick|spicks", + "tags": [ + "racial" + ], + "severity": 3, + "exceptions": [ + "*a", + "*ae", + "*as", + "*ate", + "*ated", + "*cato", + "*catos", + "*e", + "*ebush", + "*ebushes", + "*ed", + "*eless", + "*er", + "*eries", + "*ers", + "*ery", + "*es", + "*ey", + "*ier", + "*iest", + "*ily", + "*iness", + "*inesses", + "*ing", + "*ks", + "*ula", + "*ulae", + "*ular", + "*ulate", + "*ulation", + "*ulations", + "*ule", + "*ules", + "*ulum", + "*y", + "a*", + "a*s", + "all*e", + "all*es", + "aru*es", + "au*ate", + "au*ated", + "au*ates", + "au*ating", + "au*e", + "au*es", + "au*ious", + "au*iously", + "au*iousness", + "con*uities", + "con*uity", + "con*uous", + "con*uously", + "con*uousness", + "de*able", + "de*ableness", + "de*ably", + "haru*ation", + "haru*ations", + "haru*es", + "ho*e", + "ho*es", + "inau*ious", + "inau*iously", + "incon*uous", + "incon*uously", + "mi*kel", + "mi*kels", + "over*e", + "over*ed", + "over*es", + "over*ing", + "oversu*ious", + "per*acious", + "per*aciously", + "per*acities", + "per*acity", + "per*uities", + "per*uity", + "per*uous", + "per*uously", + "per*uousness", + "su*ion", + "su*ioned", + "su*ioning", + "su*ions", + "su*ious", + "su*iously", + "su*iousness", + "tran*uous", + "unsu*ious" + ] + }, + { + "id": "spicy-gringo", + "match": "spicy gringo", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "splooge", + "match": "splooge|splooge moose|spooge", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "spunk", + "match": "spunk", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "strap-on", + "match": "strap on|strap-on", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "strap-on", + "match": "strap-on|strapon", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "strappado", + "match": "strappado", + "tags": [ + "sexual" + ], + "severity": 4 + }, + { + "id": "strip", + "match": "strip|stripping|stripper|strippers", + "tags": [ + "sexual" + ], + "severity": 3, + "exceptions": [ + "comic", + "comics", + "mining", + "led", + "tape", + "wallpaper", + "bacon", + "chicken", + "steak", + "paint" + ] + }, + { + "id": "submissive", + "match": "submissive|submission", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "suck", + "match": "suck my|suck your|suck his|suck her", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "swamp-guinea", + "match": "swamp guinea|swamp-guinea", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "swastika", + "match": "swastika|svastika|suastika", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "switch-hitter", + "match": "switch hitter", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "t-girl", + "match": "t-girl|tgirl", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "talk-dirty", + "match": "talk dirty|dirty talk|dirty talking", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "taphephilia", + "match": "taphephilia|taphephile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "tea-bagging", + "match": "tea bagging|tea-bagging|tea bagged|tea-bagged", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "tease", + "match": "tease|teasing", + "tags": [ + "sexual" + ], + "severity": 2, + "exceptions": [ + "hair", + "comb", + "joke", + "bully", + "playful" + ] + }, + { + "id": "thanatophilia", + "match": "thanatophilia|thanatophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "threesome", + "match": "threesome", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "throating", + "match": "throating", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "thumbzilla", + "match": "thumbzilla", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "timber-nigger", + "match": "timber ni*gg*e*r|timber-ni*gg*e*r|timberni*gg*e*r", + "tags": [ + "racial" + ], + "severity": 4 + }, + { + "id": "tits", + "match": "tits", + "tags": [ + "sexual" + ], + "severity": 2, + "exceptions": [ + "bush*", + "pas*", + "tom*" + ] + }, + { + "id": "titty", + "match": "titt*y|titt*ies", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "topless", + "match": "topless", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "tosser", + "match": "tosser", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "towelhead", + "match": "towelhead|towel-head|towel head", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "tranny", + "match": "tranny|trannie", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "transbian", + "match": "transbian", + "tags": [ + "lgbtq" + ], + "severity": 3 + }, + { + "id": "traumatophilia", + "match": "traumatophilia|traumatophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "tribbing", + "match": "tribbing|tribadism", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "tubgirl", + "match": "tubgirl|tub girl", + "tags": [ + "shock" + ], + "severity": 4 + }, + { + "id": "twat", + "match": "twa*t", + "tags": [ + "general" + ], + "severity": 3, + "exceptions": [ + "cu*er", + "mel*er", + "ou*ch", + "sal*er", + "wris*ch" + ] + }, + { + "id": "twink", + "match": "twink", + "tags": [ + "lgbtq" + ], + "severity": 3, + "exceptions": [ + "*ie", + "*ies", + "*le", + "*led", + "*ler", + "*les", + "*lers", + "*ling", + "*lings", + "*ly" + ] + }, + { + "id": "urethra-play", + "match": "urethra play", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "urophilia", + "match": "urophilia|urophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "vagina", + "match": "vagina", + "tags": [ + "sexual" + ], + "severity": 1 + }, + { + "id": "venus-mound", + "match": "venus mound|mound of venus", + "tags": [ + "sexual" + ], + "severity": 1 + }, + { + "id": "viagra", + "match": "viagra", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "vibrator", + "match": "vibrator", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "violet-wand", + "match": "violet wand", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "vorarephilia", + "match": "vorarephilia|vorarephile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "voyeurweb", + "match": "voyeurweb", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "vulva", + "match": "vulva|vulvas", + "tags": [ + "anatomy", + "sexual" + ], + "severity": 2, + "exceptions": [ + "medical", + "health", + "anatomy", + "doctor", + "clinical" + ] + }, + { + "id": "wagon-burner", + "match": "wagon burner|wagon-burner", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "wank", + "match": "wa*nk", + "tags": [ + "sexual" + ], + "severity": 2, + "exceptions": [ + "s*", + "t*" + ] + }, + { + "id": "wanker", + "match": "wa*nker", + "tags": [ + "general" + ], + "severity": 2 + }, + { + "id": "wax-play", + "match": "wax play|wax-play", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "wet-dream", + "match": "wet dream", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "wetback", + "match": "wetback|wet-back|wet back", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "white power", + "match": "whitepower|white-power|white power", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "whore", + "match": "who*re", + "tags": [ + "general" + ], + "severity": 3 + }, + { + "id": "wigger", + "match": "wigger|whigger|wigga", + "tags": [ + "racial" + ], + "severity": 2 + }, + { + "id": "wiitwd", + "match": "wiitwd", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "wog", + "match": "wog|wogs", + "tags": [ + "racial" + ], + "severity": 1, + "exceptions": [ + "horns*gle", + "horns*gled", + "horns*gles", + "horns*gling", + "polli*", + "polli*s", + "polly*", + "polly*s" + ] + }, + { + "id": "wolfbagging", + "match": "wolfbagging", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "worldsex", + "match": "worldsex", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "wrapping-men", + "match": "wrapping men", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "wrinkled-starfish", + "match": "wrinkled starfish", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "xhamster", + "match": "xhamster", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "xnxx", + "match": "xnxx", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "xtube", + "match": "xtube", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "xvideos", + "match": "xvideos", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "xxx", + "match": "xxx", + "tags": [ + "sexual" + ], + "severity": 2 + }, + { + "id": "xyrophilia", + "match": "xyrophilia|xyrophile", + "tags": [ + "sexual" + ], + "severity": 3 + }, + { + "id": "zipperhead", + "match": "zipperhead|zipper-head|zipper head", + "tags": [ + "racial" + ], + "severity": 3 + }, + { + "id": "zippocat", + "match": "zippocat|zippo-cat|zippo cat", + "tags": [ + "shock" + ], + "severity": 4 + }, + { + "id": "zoophilia", + "match": "zoophilia|zoophile", + "tags": [ + "sexual" + ], + "severity": 3 + } +] \ No newline at end of file diff --git a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_au.json b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_au.json new file mode 100644 index 0000000000..28d048876b --- /dev/null +++ b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_au.json @@ -0,0 +1,345 @@ +[ + { + "id": "root", + "match": "root|rooting|rooted|rooter", + "tags": [ + "sexual", + "australian" + ], + "severity": 3, + "exceptions": [ + "tree", + "plant", + "square", + "cube", + "directory", + "access", + "cause", + "beer" + ] + }, + { + "id": "ranga", + "match": "ranga|rangas", + "tags": [ + "offensive", + "australian" + ], + "severity": 2, + "exceptions": [ + "whangarei" + ] + }, + { + "id": "minge", + "match": "minge|minges", + "tags": [ + "sexual", + "australian" + ], + "severity": 3 + }, + { + "id": "perv", + "match": "perv|perve|perving|perved|have a perv|perve on", + "tags": [ + "sexual", + "australian" + ], + "severity": 3, + "exceptions": [ + "pervade", + "perverse" + ] + }, + { + "id": "slapper", + "match": "slapper|slappers", + "tags": [ + "offensive", + "australian" + ], + "severity": 3 + }, + { + "id": "moll", + "match": "moll|molls", + "tags": [ + "offensive", + "australian" + ], + "severity": 2, + "exceptions": [ + "flanders" + ] + }, + { + "id": "sheila", + "match": "sheila|sheilas", + "tags": [ + "offensive", + "australian" + ], + "severity": 1, + "exceptions": [ + "name", + "saint" + ] + }, + { + "id": "arsehole-au", + "match": "arsehole|arseholes", + "tags": [ + "profanity", + "australian" + ], + "severity": 3 + }, + { + "id": "bloody-au", + "match": "bloody hell|bloody oath|bloody bastard|bloody idiot", + "tags": [ + "profanity", + "australian" + ], + "severity": 2 + }, + { + "id": "bugger-au", + "match": "bugger off|bugger all|bugger me|buggered", + "tags": [ + "profanity", + "australian" + ], + "severity": 2 + }, + { + "id": "bollocks-au", + "match": "bollocks|bollock", + "tags": [ + "profanity", + "australian" + ], + "severity": 2 + }, + { + "id": "wanker-au", + "match": "wanker|wankers|wank", + "tags": [ + "profanity", + "australian" + ], + "severity": 3 + }, + { + "id": "tosser-au", + "match": "tosser|tossers", + "tags": [ + "profanity", + "australian" + ], + "severity": 2 + }, + { + "id": "bogan", + "match": "bogan|bogans|filthy bogan", + "tags": [ + "offensive", + "australian" + ], + "severity": 2 + }, + { + "id": "drongo", + "match": "drongo|drongos", + "tags": [ + "insult", + "australian" + ], + "severity": 1 + }, + { + "id": "yobbo", + "match": "yobbo|yobbos|yob", + "tags": [ + "insult", + "australian" + ], + "severity": 2 + }, + { + "id": "ratbag", + "match": "ratbag|ratbags", + "tags": [ + "insult", + "australian" + ], + "severity": 1 + }, + { + "id": "dole-bludger", + "match": "dole bludger|dole-bludger|bludger", + "tags": [ + "offensive", + "australian" + ], + "severity": 2, + "exceptions": [ + "harry potter", + "quidditch" + ] + }, + { + "id": "fuck-spiders", + "match": "fuck spiders|fucking spiders", + "tags": [ + "profanity", + "australian" + ], + "severity": 3 + }, + { + "id": "root-rat", + "match": "root rat|rootrat", + "tags": [ + "sexual", + "australian" + ], + "severity": 3 + }, + { + "id": "bush-pig", + "match": "bush pig|bushpig", + "tags": [ + "offensive", + "australian" + ], + "severity": 3 + }, + { + "id": "seppo", + "match": "seppo|seppos", + "tags": [ + "offensive", + "australian" + ], + "severity": 2, + "exceptions": [ + "seppo" + ] + }, + { + "id": "pom", + "match": "pom|pommie|pommy bastard", + "tags": [ + "offensive", + "australian" + ], + "severity": 2, + "exceptions": [ + "pomegranate", + "pomeranian" + ] + }, + { + "id": "spunk-rat", + "match": "spunk rat|spunkrat", + "tags": [ + "sexual", + "australian" + ], + "severity": 3 + }, + { + "id": "fanny-au", + "match": "fanny", + "tags": [ + "sexual", + "australian" + ], + "severity": 2, + "exceptions": [ + "pack", + "bag", + "adams" + ] + }, + { + "id": "knob", + "match": "knob|knobhead|knob-head", + "tags": [ + "profanity", + "australian" + ], + "severity": 2, + "exceptions": [ + "door", + "control", + "volume" + ] + }, + { + "id": "gash", + "match": "gash", + "tags": [ + "sexual", + "australian" + ], + "severity": 3, + "exceptions": [ + "cut", + "wound", + "injury" + ] + }, + { + "id": "norks", + "match": "norks", + "tags": [ + "sexual", + "australian" + ], + "severity": 2 + }, + { + "id": "dag", + "match": "dag|dags", + "tags": [ + "insult", + "australian" + ], + "severity": 1, + "exceptions": [ + "acyclic", + "graph", + "directed" + ] + }, + { + "id": "sook", + "match": "sook|sooky|sooky la la", + "tags": [ + "insult", + "australian" + ], + "severity": 1 + }, + { + "id": "up-the-duff", + "match": "up the duff|upduff", + "tags": [ + "sexual", + "australian" + ], + "severity": 2 + }, + { + "id": "get-stuffed", + "match": "get stuffed", + "tags": [ + "profanity", + "australian" + ], + "severity": 2 + } +] \ No newline at end of file diff --git a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_de.json b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_de.json new file mode 100644 index 0000000000..31b7233d89 --- /dev/null +++ b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_de.json @@ -0,0 +1,587 @@ +[ + { + "id": "analritter", + "match": "analritter", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "arsch", + "match": "arsch", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "arschficker", + "match": "arschficker", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "arschlecker", + "match": "arschlecker", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "arschloch", + "match": "arschloch", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "bimbo", + "match": "bimbo", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "bratze", + "match": "bratze", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "bumsen", + "match": "bumsen", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "bonze", + "match": "bonze", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "dodel", + "match": "dödel", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "fick", + "match": "fick", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "ficken", + "match": "ficken", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "flittchen", + "match": "flittchen", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "fotze", + "match": "fotze", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "fratze", + "match": "fratze", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "hackfresse", + "match": "hackfresse", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "hure", + "match": "hure", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "hurensohn", + "match": "hurensohn", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "ische", + "match": "ische", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "kackbratze", + "match": "kackbratze", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "kacke", + "match": "kacke", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "kacken", + "match": "kacken", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "kackwurst", + "match": "kackwurst", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "kampflesbe", + "match": "kampflesbe", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "kanake", + "match": "kanake", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "kimme", + "match": "kimme", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "lummel", + "match": "lümmel", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "milf", + "match": "milf", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "mopse", + "match": "möpse", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "morgenlatte", + "match": "morgenlatte", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "mose", + "match": "möse", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "mufti", + "match": "mufti", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "muschi", + "match": "muschi", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "nackt", + "match": "nackt", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "neger", + "match": "neger", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "nigger", + "match": "nigger", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "nippel", + "match": "nippel", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "nutte", + "match": "nutte", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "onanieren", + "match": "onanieren", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "orgasmus", + "match": "orgasmus", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "pimmel", + "match": "pimmel", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "pimpern", + "match": "pimpern", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "pinkeln", + "match": "pinkeln", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "pissen", + "match": "pissen", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "pisser", + "match": "pisser", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "popel", + "match": "popel", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "poppen", + "match": "poppen", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "porno", + "match": "porno", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "reudig", + "match": "reudig", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "rosette", + "match": "rosette", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "schabracke", + "match": "schabracke", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "schlampe", + "match": "schlampe", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "scheisse", + "match": "scheiße", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "scheisser", + "match": "scheisser", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "schiesser", + "match": "schiesser", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "schnackeln", + "match": "schnackeln", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "schwanzlutscher", + "match": "schwanzlutscher", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "schwuchtel", + "match": "schwuchtel", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "tittchen", + "match": "tittchen", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "titten", + "match": "titten", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "vogeln", + "match": "vögeln", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "vollpfosten", + "match": "vollpfosten", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "wichse", + "match": "wichse", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "wichsen", + "match": "wichsen", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + }, + { + "id": "wichser", + "match": "wichser", + "tags": [ + "profanity", + "german" + ], + "severity": 3 + } +] \ No newline at end of file diff --git a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_es.json b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_es.json new file mode 100644 index 0000000000..9ad812f93c --- /dev/null +++ b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_es.json @@ -0,0 +1,614 @@ +[ + { + "id": "asesinato", + "match": "asesinato", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "asno", + "match": "asno", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "bastardo", + "match": "bastardo", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "bollera", + "match": "bollera", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "cabron", + "match": "cabron", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "cabron", + "match": "cabrón", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "caca", + "match": "caca", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "chupada", + "match": "chupada", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "chupapollas", + "match": "chupapollas", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "chupeton", + "match": "chupetón", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "concha", + "match": "concha", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "concha-de-tu-madre", + "match": "concha de tu madre", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "coño", + "match": "coño", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "coprofagia", + "match": "coprofagía", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "culo", + "match": "culo", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "drogas", + "match": "drogas", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "esperma", + "match": "esperma", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "fiesta-de-salchichas", + "match": "fiesta de salchichas", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "follador", + "match": "follador", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "follar", + "match": "follar", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "gilipichis", + "match": "gilipichis", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "gilipollas", + "match": "gilipollas", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "hacer-una-paja", + "match": "hacer una paja", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "haciendo-el-amor", + "match": "haciendo el amor", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "heroina", + "match": "heroína", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "hija-de-puta", + "match": "hija de puta", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "hijaputa", + "match": "hijaputa", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "hijo-de-puta", + "match": "hijo de puta", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "hijoputa", + "match": "hijoputa", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "idiota", + "match": "idiota", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "imbecil", + "match": "imbécil", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "infierno", + "match": "infierno", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "jilipollas", + "match": "jilipollas", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "kapullo", + "match": "kapullo", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "lameculos", + "match": "lameculos", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "maciza", + "match": "maciza", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "macizorra", + "match": "macizorra", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "maldito", + "match": "maldito", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "mamada", + "match": "mamada", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "marica", + "match": "marica", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "maricon", + "match": "maricón", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "mariconazo", + "match": "mariconazo", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "martillo", + "match": "martillo", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "mierda", + "match": "mierda", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "nazi", + "match": "nazi", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "orina", + "match": "orina", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "pedo", + "match": "pedo", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "pervertido", + "match": "pervertido", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "pezon", + "match": "pezón", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "pinche", + "match": "pinche", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "pis", + "match": "pis", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "prostituta", + "match": "prostituta", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "puta", + "match": "puta", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "racista", + "match": "racista", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "ramera", + "match": "ramera", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "sadico", + "match": "sádico", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "semen", + "match": "semen", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "sexo", + "match": "sexo", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "sexo-oral", + "match": "sexo oral", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "soplagaitas", + "match": "soplagaitas", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "soplapollas", + "match": "soplapollas", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "tetas-grandes", + "match": "tetas grandes", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "tia-buena", + "match": "tía buena", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "travesti", + "match": "travesti", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "trio", + "match": "trio", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "verga", + "match": "verga", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "vete-a-la-mierda", + "match": "vete a la mierda", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + }, + { + "id": "vulva", + "match": "vulva", + "tags": [ + "profanity", + "spanish" + ], + "severity": 3 + } +] \ No newline at end of file diff --git a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_fr.json b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_fr.json new file mode 100644 index 0000000000..2cf4d3061f --- /dev/null +++ b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harm_toxic_abuse_fr.json @@ -0,0 +1,821 @@ +[ + { + "id": "baiser", + "match": "baiser", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "bander", + "match": "bander", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "bigornette", + "match": "bigornette", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "bite", + "match": "bite", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "bitte", + "match": "bitte", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "bloblos", + "match": "bloblos", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "bordel", + "match": "bordel", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "bosser", + "match": "bosser", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "bourre", + "match": "bourré", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "bourree", + "match": "bourrée", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "brackmard", + "match": "brackmard", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "branlage", + "match": "branlage", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "branler", + "match": "branler", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "branlette", + "match": "branlette", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "branleur", + "match": "branleur", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "branleuse", + "match": "branleuse", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "brouter-le-cresson", + "match": "brouter le cresson", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "caca", + "match": "caca", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "cailler", + "match": "cailler", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "chatte", + "match": "chatte", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "chiasse", + "match": "chiasse", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "chier", + "match": "chier", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "chiottes", + "match": "chiottes", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "clito", + "match": "clito", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "clitoris", + "match": "clitoris", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "con", + "match": "con", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "connard", + "match": "connard", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "connasse", + "match": "connasse", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "conne", + "match": "conne", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "couilles", + "match": "couilles", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "cramouille", + "match": "cramouille", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "cul", + "match": "cul", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "deconne", + "match": "déconne", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "deconner", + "match": "déconner", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "drague", + "match": "drague", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "emmerdant", + "match": "emmerdant", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "emmerder", + "match": "emmerder", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "emmerdeur", + "match": "emmerdeur", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "emmerdeuse", + "match": "emmerdeuse", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "encule", + "match": "enculé", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "enculee", + "match": "enculée", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "enculeur", + "match": "enculeur", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "enculeurs", + "match": "enculeurs", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "enfoire", + "match": "enfoiré", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "enfoiree", + "match": "enfoirée", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "etron", + "match": "étron", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "fille-de-pute", + "match": "fille de pute", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "fils-de-pute", + "match": "fils de pute", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "folle", + "match": "folle", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "foutre", + "match": "foutre", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "gerbe", + "match": "gerbe", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "gerber", + "match": "gerber", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "gouine", + "match": "gouine", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "grande-folle", + "match": "grande folle", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "grogniasse", + "match": "grogniasse", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "gueule", + "match": "gueule", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "jouir", + "match": "jouir", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "la-putain-de-ta-mere", + "match": "la putain de ta mère", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "malpt", + "match": "malpt", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "menage-a-trois", + "match": "ménage à trois", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "merde", + "match": "merde", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "merdeuse", + "match": "merdeuse", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "merdeux", + "match": "merdeux", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "meuf", + "match": "meuf", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "negre", + "match": "nègre", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "nique-ta-mere", + "match": "nique ta mère", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "nique-ta-race", + "match": "nique ta race", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "palucher", + "match": "palucher", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "pedale", + "match": "pédale", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "pede", + "match": "pédé", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "peter", + "match": "péter", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "pipi", + "match": "pipi", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "pisser", + "match": "pisser", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "pouffiasse", + "match": "pouffiasse", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "pousse-crotte", + "match": "pousse-crotte", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "putain", + "match": "putain", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "pute", + "match": "pute", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "ramoner", + "match": "ramoner", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "sac-a-merde", + "match": "sac à merde", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "salaud", + "match": "salaud", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "salope", + "match": "salope", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "suce", + "match": "suce", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "tapette", + "match": "tapette", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "teuf", + "match": "teuf", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "tringler", + "match": "tringler", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "trique", + "match": "trique", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "trou-du-cul", + "match": "trou du cul", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "turlute", + "match": "turlute", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "veuve", + "match": "veuve", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "zigounette", + "match": "zigounette", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + }, + { + "id": "zizi", + "match": "zizi", + "tags": [ + "profanity", + "french" + ], + "severity": 3 + } +] \ No newline at end of file diff --git a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harmful_child_safety.yaml b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harmful_child_safety.yaml new file mode 100644 index 0000000000..d7238980f0 --- /dev/null +++ b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/categories/harmful_child_safety.yaml @@ -0,0 +1,156 @@ +# Child Safety - Detects inappropriate content involving minors +# Uses conditional logic: BLOCK if an identifier word + block word appear in same sentence +category_name: "harmful_child_safety" +description: "Detects inappropriate content involving minors using identifier + block word combinations" +default_action: "BLOCK" + +# Inherit block words from harm_toxic_abuse.json + additional context-specific terms +inherit_from: "harm_toxic_abuse.json" + +# ADDITIONAL BLOCK WORDS - Child-specific context words to block when combined with identifiers +# These supplement the inherited words from harm_toxic_abuse.json +additional_block_words: + - "inappropriate" + - "intimate" + - "intimacy" + - "kissing" + - "flirting" + - "seductive" + - "alluring" + - "desirable" + - "hot" + - "sexy" + - "arousing" + - "provocative" + - "suggestive" + - "physical" + - "body" + +# IDENTIFIER WORDS - Words that indicate minors/children +# When combined with block words (from harm_toxic_abuse.json + additional_block_words), triggers blocking +identifier_words: + - "minor" + - "minors" + - "child" + - "children" + - "kid" + - "kids" + - "teenager" + - "teenagers" + - "teen" + - "teens" + - "youth" + - "underage" + - "juvenile" + - "juveniles" + - "adolescent" + - "adolescents" + - "young girl" + - "young boy" + - "young girls" + - "young boys" + - "schoolgirl" + - "schoolboy" + - "pre-teen" + - "preteen" + +# ALWAYS BLOCK - Explicit CSAM and exploitation terms (blocked regardless of context) +always_block_keywords: + # Explicit CSAM terms + - keyword: "child sexual abuse" + severity: "high" + - keyword: "child abuse material" + severity: "high" + - keyword: "csam" + severity: "high" + - keyword: "child pornography" + severity: "high" + - keyword: "child porn" + severity: "high" + - keyword: "minor pornography" + severity: "high" + - keyword: "cp" + severity: "high" + - keyword: "loli" + severity: "high" + - keyword: "lolicon" + severity: "high" + - keyword: "shota" + severity: "high" + - keyword: "shotacon" + severity: "high" + - keyword: "pedo" + severity: "high" + - keyword: "pedophile" + severity: "high" + - keyword: "pedophilia" + severity: "high" + - keyword: "paedophile" + severity: "high" + - keyword: "paedophilia" + severity: "high" + - keyword: "child molester" + severity: "high" + - keyword: "child predator" + severity: "high" + - keyword: "jailbait" + severity: "high" + - keyword: "barely legal" + severity: "high" + - keyword: "age of consent" + severity: "high" + - keyword: "child erotica" + severity: "high" + - keyword: "minor erotica" + severity: "high" + - keyword: "preteen sex" + severity: "high" + - keyword: "underage sex" + severity: "high" + - keyword: "child sex" + severity: "high" + - keyword: "minor sex" + severity: "high" + + # Pre-combined high-risk phrases + - keyword: "romantic scenarios involving minors" + severity: "high" + - keyword: "romantic scenarios involving children" + severity: "high" + - keyword: "sexual scenarios involving minors" + severity: "high" + - keyword: "sexual scenarios involving children" + severity: "high" + - keyword: "intimate scenarios involving minors" + severity: "high" + - keyword: "intimate scenarios involving children" + severity: "high" + - keyword: "explicit content involving minors" + severity: "high" + - keyword: "explicit content involving children" + severity: "high" + +# Exception patterns (legitimate uses) +exceptions: + - "child safety" + - "child protection" + - "protect children" + - "protect minors" + - "child abuse prevention" + - "child welfare" + - "safeguarding children" + - "child development" + - "child psychology" + - "adolescent psychology" + - "child health" + - "minor health" + - "pediatric" + - "child education" + - "age appropriate" + - "parental controls" + - "reporting child abuse" + - "child abuse survivor" + - "victims of child abuse" + - "legal minor" + - "medical minor" + - "emancipated minor" diff --git a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/content_filter.py b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/content_filter.py index 9b2b43c6fc..8b18de6dd8 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/content_filter.py +++ b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/content_filter.py @@ -10,19 +10,8 @@ import json import os import re from datetime import datetime -from typing import ( - TYPE_CHECKING, - Any, - AsyncGenerator, - Dict, - List, - Literal, - Optional, - Pattern, - Tuple, - Union, - cast, -) +from typing import (TYPE_CHECKING, Any, AsyncGenerator, Dict, List, Literal, + Optional, Pattern, Tuple, Union, cast) import yaml from fastapi import HTTPException @@ -37,20 +26,12 @@ if TYPE_CHECKING: from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj from litellm.types.utils import GenericGuardrailAPIInputs, GuardrailStatus -from litellm.types.guardrails import ( - BlockedWord, - ContentFilterAction, - ContentFilterPattern, - GuardrailEventHooks, - Mode, -) +from litellm.types.guardrails import (BlockedWord, ContentFilterAction, + ContentFilterPattern, + GuardrailEventHooks, Mode) from litellm.types.proxy.guardrails.guardrail_hooks.litellm_content_filter import ( - BlockedWordDetection, - CategoryKeywordDetection, - ContentFilterCategoryConfig, - ContentFilterDetection, - PatternDetection, -) + BlockedWordDetection, CategoryKeywordDetection, + ContentFilterCategoryConfig, ContentFilterDetection, PatternDetection) from .patterns import PATTERN_EXTRA_CONFIG, get_compiled_pattern @@ -91,12 +72,27 @@ class CategoryConfig: default_action: ContentFilterAction, keywords: List[Dict[str, str]], exceptions: List[str], + identifier_words: Optional[List[str]] = None, + always_block_keywords: Optional[List[Dict[str, str]]] = None, + inherit_from: Optional[str] = None, + additional_block_words: Optional[List[str]] = None, ): self.category_name = category_name self.description = description self.default_action = default_action self.keywords = keywords self.exceptions = [e.lower() for e in exceptions] + # New fields for conditional child safety logic + self.identifier_words = ( + [w.lower() for w in identifier_words] if identifier_words else [] + ) + self.always_block_keywords = always_block_keywords or [] + self.inherit_from = inherit_from + self.additional_block_words = ( + [w.lower() for w in additional_block_words] + if additional_block_words + else [] + ) class ContentFilterGuardrail(CustomGuardrail): @@ -174,6 +170,10 @@ class ContentFilterGuardrail(CustomGuardrail): self.category_keywords: Dict[str, Tuple[str, str, ContentFilterAction]] = ( {} ) # keyword -> (category, severity, action) + # Store conditional categories (identifier_words + block_words) + self.conditional_categories: Dict[str, Dict[str, Any]] = ( + {} + ) # category_name -> {identifier_words, block_words, action, severity} # Load categories if provided if categories: @@ -306,7 +306,32 @@ class ContentFilterGuardrail(CustomGuardrail): action if action else category_config_obj.default_action ) - # Add keywords from this category + # Handle conditional categories (with identifier_words + inherit_from) + if ( + category_config_obj.identifier_words + and category_config_obj.inherit_from + ): + self._load_conditional_category( + category_name, + category_config_obj, + category_action, + severity_threshold, + categories_dir, + ) + + # Add always_block_keywords if present + if category_config_obj.always_block_keywords: + for keyword_data in category_config_obj.always_block_keywords: + keyword = keyword_data["keyword"].lower() + severity = keyword_data.get("severity", "high") + if self._should_apply_severity(severity, severity_threshold): + self.category_keywords[keyword] = ( + category_name, + severity, + category_action, + ) + + # Add regular keywords from this category for keyword_data in category_config_obj.keywords: keyword = keyword_data["keyword"].lower() severity = keyword_data["severity"] @@ -321,19 +346,101 @@ class ContentFilterGuardrail(CustomGuardrail): verbose_proxy_logger.info( f"Loaded category {category_name}: " - f"{len(category_config_obj.keywords)} keywords" + f"{len(category_config_obj.keywords)} keywords, " + f"{len(category_config_obj.always_block_keywords)} always-block keywords, " + f"conditional: {bool(category_config_obj.identifier_words)}" ) except Exception as e: verbose_proxy_logger.error( f"Error loading category {category_name}: {e}" ) + def _load_conditional_category( + self, + category_name: str, + category_config_obj: CategoryConfig, + category_action: ContentFilterAction, + severity_threshold: str, + categories_dir: str, + ) -> None: + """ + Load a conditional category that uses identifier_words + inherited block_words. + + Args: + category_name: Name of the category + category_config_obj: CategoryConfig object with identifier_words and inherit_from + category_action: Action to take when match is found + severity_threshold: Minimum severity threshold + categories_dir: Directory containing category files + """ + # Load the inherited category to get block words + inherit_from = category_config_obj.inherit_from + if not inherit_from: + return + + # Remove .json or .yaml extension if included + inherit_base = inherit_from.replace(".json", "").replace(".yaml", "") + + # Find the inherited category file + inherit_yaml_path = os.path.join(categories_dir, f"{inherit_base}.yaml") + inherit_json_path = os.path.join(categories_dir, f"{inherit_base}.json") + + if os.path.exists(inherit_yaml_path): + inherit_file_path = inherit_yaml_path + elif os.path.exists(inherit_json_path): + inherit_file_path = inherit_json_path + else: + verbose_proxy_logger.warning( + f"Category {category_name}: inherit_from '{inherit_from}' file not found at {categories_dir}" + ) + verbose_proxy_logger.debug( + f"Tried paths: {inherit_yaml_path}, {inherit_json_path}" + ) + return + + try: + # Load the inherited category + inherited_category = self._load_category_file(inherit_file_path) + + # Extract block words from inherited category that meet severity threshold + block_words = [] + for keyword_data in inherited_category.keywords: + keyword = keyword_data["keyword"].lower() + severity = keyword_data["severity"] + if self._should_apply_severity(severity, severity_threshold): + block_words.append(keyword) + + # Add additional block words specific to this category + if category_config_obj.additional_block_words: + block_words.extend(category_config_obj.additional_block_words) + + # Store the conditional category configuration + self.conditional_categories[category_name] = { + "identifier_words": category_config_obj.identifier_words, + "block_words": block_words, + "action": category_action, + "severity": "high", # Combinations are always high severity + } + + verbose_proxy_logger.info( + f"Loaded conditional category {category_name}: " + f"{len(category_config_obj.identifier_words)} identifiers + " + f"{len(block_words)} block words " + f"({len(category_config_obj.additional_block_words)} additional + " + f"{len(block_words) - len(category_config_obj.additional_block_words)} from {inherit_from})" + ) + except Exception as e: + verbose_proxy_logger.error( + f"Error loading inherited category for {category_name}: {e}" + ) + def _load_category_file(self, file_path: str) -> CategoryConfig: """ Load a category definition from a YAML or JSON file. YAML format: category_name, description, default_action, keywords (list of {keyword, severity}), exceptions. + Optional: identifier_words, always_block_keywords, inherit_from. JSON format: list of {id, match, tags, severity}; match is pipe-separated phrases; severity 1-4 mapped to low/medium/high. Used for harm_toxic_abuse. @@ -347,12 +454,20 @@ class ContentFilterGuardrail(CustomGuardrail): return self._load_category_file_json(file_path) with open(file_path, "r") as f: data = yaml.safe_load(f) + + # Handle always_block_keywords if present + always_block = data.get("always_block_keywords", []) + return CategoryConfig( category_name=data.get("category_name", "unknown"), description=data.get("description", ""), default_action=ContentFilterAction(data.get("default_action", "BLOCK")), keywords=data.get("keywords", []), exceptions=data.get("exceptions", []), + identifier_words=data.get("identifier_words"), + always_block_keywords=always_block, + inherit_from=data.get("inherit_from"), + additional_block_words=data.get("additional_block_words"), ) def _load_category_file_json(self, file_path: str) -> CategoryConfig: @@ -650,6 +765,94 @@ class ContentFilterGuardrail(CustomGuardrail): return (matched_text, pattern_name, action) return None + def _check_conditional_categories( + self, text: str, exceptions: List[str] + ) -> Optional[Tuple[str, str, str, ContentFilterAction]]: + """ + Check text for conditional category matches (identifier + block word in same sentence). + + This implements logic like: if text contains both an identifier word (e.g., "minor") + AND a block word (e.g., "romantic"), then block it. + + Args: + text: Text to check + exceptions: List of exception phrases to ignore + + Returns: + Tuple of (matched_phrase, category, severity, action) if match found, None otherwise + """ + text_lower = text.lower() + + # First check if any exception applies + for exception in exceptions: + if exception in text_lower: + return None + + # Split text into sentences for more precise matching + # Simple sentence splitting on common terminators + sentences = re.split(r"[.!?]+", text) + + for category_name, config in self.conditional_categories.items(): + identifier_words = config["identifier_words"] + block_words = config["block_words"] + action = config["action"] + severity = config["severity"] + + # Check category-specific exceptions + category_obj = self.loaded_categories.get(category_name) + if category_obj: + exception_found = False + for exception in category_obj.exceptions: + if exception in text_lower: + verbose_proxy_logger.debug( + f"Category exception '{exception}' found for {category_name}, skipping" + ) + exception_found = True + break + if exception_found: + continue + + # Check each sentence for identifier + block word combination + for sentence in sentences: + sentence_lower = sentence.lower().strip() + if not sentence_lower: + continue + + # Check if sentence contains ANY identifier word + identifier_found = None + for identifier in identifier_words: + if identifier in sentence_lower: + identifier_found = identifier + break + + if not identifier_found: + continue + + # Check if sentence also contains ANY block word + block_word_found = None + for block_word in block_words: + # Use word boundary for single words to avoid false positives + if " " in block_word: + # Multi-word phrase + if block_word in sentence_lower: + block_word_found = block_word + break + else: + # Single word - use word boundary + pattern = r"\b" + re.escape(block_word) + r"\b" + if re.search(pattern, sentence_lower): + block_word_found = block_word + break + + if block_word_found: + matched_phrase = f"{identifier_found} + {block_word_found}" + verbose_proxy_logger.warning( + f"Conditional match in {category_name}: '{matched_phrase}' in sentence" + ) + return (matched_phrase, category_name, severity, action) + + return None + def _check_category_keywords( self, text: str, exceptions: List[str] ) -> Optional[Tuple[str, str, str, ContentFilterAction]]: @@ -675,15 +878,21 @@ class ContentFilterGuardrail(CustomGuardrail): # Check category keywords for keyword, (category, severity, action) in self.category_keywords.items(): + # Convert asterisks (*) in keywords to regex wildcards + # Asterisks are used in the source data to obfuscate profanity (e.g., "fu*c*k" -> "fuck") + # We treat * as a wildcard matching zero or one character + keyword_pattern_str = keyword.replace("*", ".?") + # Use word boundary matching for single words to avoid false positives # (e.g., "men" should not match "recommend") # For multi-word phrases, use substring matching if " " in keyword: - # Multi-word phrase - use substring matching - keyword_found = keyword in text_lower + # Multi-word phrase - use substring matching with wildcards + keyword_pattern = keyword_pattern_str + keyword_found = bool(re.search(keyword_pattern, text_lower)) else: # Single word - use word boundary matching to match whole words only - keyword_pattern = r"\b" + re.escape(keyword) + r"\b" + keyword_pattern = r"\b" + keyword_pattern_str + r"\b" keyword_found = bool(re.search(keyword_pattern, text_lower)) if keyword_found: @@ -774,6 +983,41 @@ class ContentFilterGuardrail(CustomGuardrail): for category in self.loaded_categories.values(): all_exceptions.extend(category.exceptions) + # Check conditional categories first (identifier + block word combinations) + conditional_match = self._check_conditional_categories(text, all_exceptions) + if conditional_match: + matched_phrase, category_name, severity, action = conditional_match + if detections is not None: + category_detection: CategoryKeywordDetection = { + "type": "category_keyword", + "category": category_name, + "keyword": matched_phrase, + "severity": severity, + "action": action.value, + } + detections.append(category_detection) + if action == ContentFilterAction.BLOCK: + error_msg = ( + f"Content blocked: {category_name} conditional match '{matched_phrase}' detected " + f"(severity: {severity})" + ) + verbose_proxy_logger.warning(error_msg) + raise HTTPException( + status_code=403, + detail={ + "error": error_msg, + "category": category_name, + "matched_phrase": matched_phrase, + "severity": severity, + }, + ) + elif action == ContentFilterAction.MASK: + # For conditional matches, we don't mask - too complex to determine what to mask + # Just log a warning + verbose_proxy_logger.warning( + f"Conditional match '{matched_phrase}' from {category_name} detected but MASK action not supported for conditional categories" + ) + # Check category keywords category_keyword_match = self._check_category_keywords(text, all_exceptions) if category_keyword_match: @@ -804,8 +1048,10 @@ class ContentFilterGuardrail(CustomGuardrail): ) elif action == ContentFilterAction.MASK: # Replace keyword with redaction tag + # Convert asterisks to regex wildcards for matching + keyword_pattern_for_masking = keyword.replace("*", ".?") text = re.sub( - re.escape(keyword), + keyword_pattern_for_masking, self.keyword_redaction_tag, text, flags=re.IGNORECASE, @@ -851,7 +1097,9 @@ class ContentFilterGuardrail(CustomGuardrail): # to ensure all matching keywords are processed, not just the first one text_lower = text.lower() for keyword, (action, description) in self.blocked_words.items(): - if keyword not in text_lower: + # Convert asterisks to regex wildcards for matching + keyword_pattern_str = keyword.replace("*", ".?") + if not re.search(keyword_pattern_str, text_lower): continue verbose_proxy_logger.debug( @@ -882,8 +1130,10 @@ class ContentFilterGuardrail(CustomGuardrail): ) elif action == ContentFilterAction.MASK: # Replace keyword with redaction tag (case-insensitive) + # Convert asterisks to regex wildcards for matching + keyword_pattern_for_masking = keyword.replace("*", ".?") text = re.sub( - re.escape(keyword), + keyword_pattern_for_masking, self.keyword_redaction_tag, text, flags=re.IGNORECASE, @@ -1221,8 +1471,7 @@ class ContentFilterGuardrail(CustomGuardrail): @staticmethod def get_config_model(): - from litellm.types.proxy.guardrails.guardrail_hooks.litellm_content_filter import ( - LitellmContentFilterGuardrailConfigModel, - ) + from litellm.types.proxy.guardrails.guardrail_hooks.litellm_content_filter import \ + LitellmContentFilterGuardrailConfigModel return LitellmContentFilterGuardrailConfigModel diff --git a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/patterns.py b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/patterns.py index aa4b8b1b37..cf5df3b3bf 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/patterns.py +++ b/litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/patterns.py @@ -177,8 +177,13 @@ def get_available_content_categories() -> List[Dict[str, str]]: ), } ) - except Exception: - # Skip files that can't be loaded + except Exception as e: + # Skip files that can't be loaded but log the error for debugging + from litellm._logging import verbose_proxy_logger + + verbose_proxy_logger.warning( + f"Failed to load category file {filename}: {str(e)}" + ) continue elif filename.endswith(".json"): # JSON category files (e.g. harm_toxic_abuse.json) - no YAML header, use filename diff --git a/policy_templates.json b/policy_templates.json index 6541839611..a0ffd6acd3 100644 --- a/policy_templates.json +++ b/policy_templates.json @@ -2,7 +2,7 @@ { "id": "advanced-au-pii-protection", "title": "Advanced PII Protection (Australia)", - "description": "Comprehensive PII detection and masking for Australia. Protects Australian-specific identifiers, international employee data, financial information, credentials, protected class information, and industry-specific sensitive data.", + "description": "Protects Australian-specific identifiers, international employee data, financial information, credentials, protected class information, and industry-specific sensitive data.", "icon": "ShieldCheckIcon", "iconColor": "text-purple-500", "iconBg": "bg-purple-50", @@ -274,5 +274,405 @@ ], "guardrails_remove": [] } + }, + { + "id": "nsfw-content-filter-australia", + "title": "NSFW Content Filter (Australia)", + "description": "Blocks profanity, sexual content, NSFW requests, self-harm content, and child safety violations using English and Australian-specific slang. Protects against inappropriate content including sexual solicitation, explicit content, Australian profanity, self-harm, and content involving minors.", + "icon": "ShieldExclamationIcon", + "iconColor": "text-red-500", + "iconBg": "bg-red-50", + "guardrails": [ + "nsfw-content-filter-english", + "nsfw-content-filter-australian", + "nsfw-self-harm-filter", + "nsfw-child-safety-filter", + "nsfw-racial-bias-filter" + ], + "complexity": "Medium", + "guardrailDefinitions": [ + { + "guardrail_name": "nsfw-content-filter-english", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks profanity, sexual content, slurs, and NSFW terms in English" + } + }, + { + "guardrail_name": "nsfw-content-filter-australian", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse_au", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks Australian-specific slang and profanity (root, perv, bogan, wanker, etc.)" + } + }, + { + "guardrail_name": "nsfw-self-harm-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_self_harm", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks content related to self-harm, suicide, and eating disorders" + } + }, + { + "guardrail_name": "nsfw-child-safety-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_child_safety", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks inappropriate content involving minors using identifier + block word combinations" + } + }, + { + "guardrail_name": "nsfw-racial-bias-filter", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "bias_racial", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks racial and ethnic discrimination, hate speech, and supremacist content" + } + } + ], + "templateData": { + "policy_name": "nsfw-content-filter-australia", + "description": "NSFW content filter for Australia. Blocks profanity, sexual content, inappropriate requests, self-harm content, child safety violations, and racial bias in English and Australian slang.", + "guardrails_add": [ + "nsfw-content-filter-english", + "nsfw-content-filter-australian", + "nsfw-self-harm-filter", + "nsfw-child-safety-filter", + "nsfw-racial-bias-filter" + ], + "guardrails_remove": [] + } + }, + { + "id": "nsfw-content-filter-basic", + "title": "NSFW Content Filter (Basic)", + "description": "Basic NSFW content filtering for English only. Blocks profanity, sexual content, slurs, solicitation, explicit requests, self-harm content, and child safety violations. Suitable for most applications requiring content moderation.", + "icon": "ShieldExclamationIcon", + "iconColor": "text-orange-500", + "iconBg": "bg-orange-50", + "guardrails": [ + "nsfw-content-filter-english-only", + "nsfw-self-harm-filter-basic", + "nsfw-child-safety-filter-basic", + "nsfw-racial-bias-filter-basic" + ], + "complexity": "Low", + "guardrailDefinitions": [ + { + "guardrail_name": "nsfw-content-filter-english-only", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks profanity, sexual content, slurs, and NSFW terms. Includes 485+ keywords covering explicit content, solicitation, sexual behavior, and exploitation." + } + }, + { + "guardrail_name": "nsfw-self-harm-filter-basic", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_self_harm", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks content related to self-harm, suicide, and eating disorders" + } + }, + { + "guardrail_name": "nsfw-child-safety-filter-basic", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_child_safety", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks inappropriate content involving minors using identifier + block word combinations" + } + }, + { + "guardrail_name": "nsfw-racial-bias-filter-basic", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "bias_racial", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks racial and ethnic discrimination, hate speech, and supremacist content" + } + } + ], + "templateData": { + "policy_name": "nsfw-content-filter-basic", + "description": "Basic NSFW content filter. Blocks profanity, sexual content, inappropriate requests, self-harm content, child safety violations, and racial bias in English.", + "guardrails_add": [ + "nsfw-content-filter-english-only", + "nsfw-self-harm-filter-basic", + "nsfw-child-safety-filter-basic", + "nsfw-racial-bias-filter-basic" + ], + "guardrails_remove": [] + } + }, + { + "id": "nsfw-content-filter-all-regions", + "title": "NSFW Content Filter (All Regions)", + "description": "Comprehensive multi-language NSFW content filtering. Blocks profanity, sexual content, inappropriate requests, self-harm content, and child safety violations in English, Spanish, French, German, and Australian. Best for global applications.", + "icon": "ShieldExclamationIcon", + "iconColor": "text-purple-500", + "iconBg": "bg-purple-50", + "guardrails": [ + "nsfw-filter-english", + "nsfw-filter-spanish", + "nsfw-filter-french", + "nsfw-filter-german", + "nsfw-filter-australian", + "nsfw-self-harm-filter-global", + "nsfw-child-safety-filter-global", + "nsfw-racial-bias-filter-global" + ], + "complexity": "High", + "guardrailDefinitions": [ + { + "guardrail_name": "nsfw-filter-english", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "English profanity, sexual content, slurs, and NSFW terms (485+ keywords)" + } + }, + { + "guardrail_name": "nsfw-filter-spanish", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse_es", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Spanish profanity and offensive terms (68 keywords)" + } + }, + { + "guardrail_name": "nsfw-filter-french", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse_fr", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "French profanity and offensive terms (91 keywords)" + } + }, + { + "guardrail_name": "nsfw-filter-german", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse_de", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "German profanity and offensive terms (65 keywords)" + } + }, + { + "guardrail_name": "nsfw-filter-australian", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harm_toxic_abuse_au", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Australian slang and profanity (32 keywords: root, perv, bogan, wanker, etc.)" + } + }, + { + "guardrail_name": "nsfw-self-harm-filter-global", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_self_harm", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks content related to self-harm, suicide, and eating disorders" + } + }, + { + "guardrail_name": "nsfw-child-safety-filter-global", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "harmful_child_safety", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks inappropriate content involving minors using identifier + block word combinations" + } + }, + { + "guardrail_name": "nsfw-racial-bias-filter-global", + "litellm_params": { + "guardrail": "litellm_content_filter", + "mode": "pre_call", + "categories": [ + { + "category": "bias_racial", + "enabled": true, + "action": "BLOCK", + "severity_threshold": "medium" + } + ] + }, + "guardrail_info": { + "description": "Blocks racial and ethnic discrimination, hate speech, and supremacist content" + } + } + ], + "templateData": { + "policy_name": "nsfw-content-filter-all-regions", + "description": "Comprehensive multi-language NSFW content filter. Blocks profanity, inappropriate content, self-harm, child safety violations, and racial bias in English, Spanish, French, German, and Australian. Total coverage: 741+ keywords across all languages plus self-harm, child safety, and racial bias protection.", + "guardrails_add": [ + "nsfw-filter-english", + "nsfw-filter-spanish", + "nsfw-filter-french", + "nsfw-filter-german", + "nsfw-filter-australian", + "nsfw-self-harm-filter-global", + "nsfw-child-safety-filter-global", + "nsfw-racial-bias-filter-global" + ], + "guardrails_remove": [] + } } ] diff --git a/tests/test_litellm/proxy/guardrails/guardrail_hooks/content_filter/test_content_filter.py b/tests/test_litellm/proxy/guardrails/guardrail_hooks/content_filter/test_content_filter.py index a0d92a0fa6..bebc6ff80d 100644 --- a/tests/test_litellm/proxy/guardrails/guardrail_hooks/content_filter/test_content_filter.py +++ b/tests/test_litellm/proxy/guardrails/guardrail_hooks/content_filter/test_content_filter.py @@ -986,6 +986,442 @@ class TestContentFilterGuardrail: assert detail.get("category") == "harm_toxic_abuse" else: assert "harm_toxic_abuse" in str(detail) + + @pytest.mark.asyncio + async def test_category_keywords_with_asterisks_match_actual_text(self): + """ + Test that category keywords containing asterisks (e.g., 'fu*c*k') + successfully match actual profanity (e.g., 'fuck'). + + The harm_toxic_abuse.json file contains keywords with asterisks as obfuscation + (e.g., "fu*c*k", "sh*i*t"). These asterisks should be treated as regex wildcards + matching zero or one character, allowing the pattern to match actual profanity. + + Regression test for issue where keywords with asterisks failed to match + because they were treated as literal strings instead of patterns. + """ + guardrail = ContentFilterGuardrail( + guardrail_name="test-asterisk-wildcards", + categories=[ + { + "category": "harm_toxic_abuse", + "enabled": True, + "action": "BLOCK", + "severity_threshold": "medium", + } + ], + ) + + # Test cases where asterisk-obfuscated keywords should match actual profanity + test_cases = [ + "fuck you", # Should match 'fu*c*k' + "what the fuck", # Should match 'fu*c*k' in context + "this is shit", # Should match 'sh*i*t' + "fucking hell", # Should match 'fu*c*king' + ] + + for test_input in test_cases: + with pytest.raises(HTTPException) as exc_info: + await guardrail.apply_guardrail( + inputs={"texts": [test_input]}, + request_data={}, + input_type="request", + ) + + assert exc_info.value.status_code == 403, f"Failed to block: '{test_input}'" + detail = exc_info.value.detail + if isinstance(detail, dict): + assert detail.get("category") == "harm_toxic_abuse" + else: + assert "harm_toxic_abuse" in str(detail) + + @pytest.mark.asyncio + async def test_category_keywords_with_asterisks_mask_action(self): + """ + Test that category keywords with asterisks work correctly with MASK action. + + Note: The current implementation masks the first matching keyword found. + For multiple profane words, each needs to be checked separately. + """ + guardrail = ContentFilterGuardrail( + guardrail_name="test-asterisk-mask", + categories=[ + { + "category": "harm_toxic_abuse", + "enabled": True, + "action": "MASK", + "severity_threshold": "medium", + } + ], + ) + + # Test masking with asterisk-obfuscated keywords - single word + result = await guardrail.apply_guardrail( + inputs={"texts": ["why the fuck is this happening"]}, + request_data={}, + input_type="request", + ) + + processed_text = result.get("texts", [])[0] + + # The profane word should be masked + assert "fuck" not in processed_text.lower() + assert "[KEYWORD_REDACTED]" in processed_text + + @pytest.mark.asyncio + async def test_blocked_words_with_asterisks_custom(self): + """ + Test that manually configured blocked words with asterisks also work correctly. + + This test uses custom BlockedWord configuration (not from harm_toxic_abuse.json) + to verify the asterisk wildcard functionality works for user-defined keywords. + """ + blocked_words = [ + BlockedWord( + keyword="te*st", # Should match "test", "tst", "tesst", etc. + action=ContentFilterAction.BLOCK, + ), + ] + + guardrail = ContentFilterGuardrail( + guardrail_name="test-blocked-asterisks", + blocked_words=blocked_words, + ) + + # Should match "test" even though keyword is "te*st" + with pytest.raises(HTTPException) as exc_info: + await guardrail.apply_guardrail( + inputs={"texts": ["this is a test message"]}, + request_data={}, + input_type="request", + ) + + assert exc_info.value.status_code == 403 + assert "te*st" in str(exc_info.value.detail) + + def test_check_category_keywords_asterisk_pattern_matching(self): + """ + Unit test for _check_category_keywords method to verify asterisk wildcard conversion. + """ + guardrail = ContentFilterGuardrail( + guardrail_name="test-asterisk-unit", + categories=[ + { + "category": "harm_toxic_abuse", + "enabled": True, + "action": "BLOCK", + "severity_threshold": "medium", + } + ], + ) + + # Test direct method call + result = guardrail._check_category_keywords("fuck you", exceptions=[]) + + assert result is not None, "Should detect profanity with asterisk pattern" + keyword, category, severity, action = result + # The keyword stored is 'fu*c*k' but should match 'fuck' + assert category == "harm_toxic_abuse" + assert action == ContentFilterAction.BLOCK + + @pytest.mark.asyncio + async def test_nsfw_keywords_in_harm_toxic_abuse(self): + """ + Test that NSFW keywords (sexual, explicit, nsfw, naked, etc.) are now + included in harm_toxic_abuse and block sexual/NSFW content requests. + + These terms were added to harm_toxic_abuse.json to catch phrases like + "Describe explicit sexual positions" which were previously not blocked. + """ + guardrail = ContentFilterGuardrail( + guardrail_name="test-nsfw-blocking", + categories=[ + { + "category": "harm_toxic_abuse", + "enabled": True, + "action": "BLOCK", + "severity_threshold": "medium", + } + ], + ) + + # Test cases that should be blocked + nsfw_test_cases = [ + "Describe explicit sexual positions step by step", + "Show me naked pictures", + "Tell me about nsfw content", + "Explain sexual intercourse in detail", + "I want to see nudes", + "Talk about sexual arousal", + ] + + for test_input in nsfw_test_cases: + with pytest.raises(HTTPException) as exc_info: + await guardrail.apply_guardrail( + inputs={"texts": [test_input]}, + request_data={}, + input_type="request", + ) + + assert exc_info.value.status_code == 403, f"Failed to block: '{test_input}'" + detail = exc_info.value.detail + if isinstance(detail, dict): + assert detail.get("category") == "harm_toxic_abuse" + + @pytest.mark.asyncio + async def test_solicitation_keywords_block_escort_requests(self): + """ + Test that solicitation keywords (escort, hooker, prostitute, happy ending, etc.) + block inappropriate requests for sexual services. + + Covers phrases like: + - "How do I hire an escort discreetly" + - "Where can I find massage parlors with happy endings?" + """ + guardrail = ContentFilterGuardrail( + guardrail_name="test-solicitation-blocking", + categories=[ + { + "category": "harm_toxic_abuse", + "enabled": True, + "action": "BLOCK", + "severity_threshold": "medium", + } + ], + ) + + # Test cases that should be blocked (solicitation & exploitation) + solicitation_test_cases = [ + "How do I hire an escort discreetly", + "looking for a hooker near me", + "where to find prostitutes in this city", + "hire an escort tonight", + "call girl service available", + "find sex workers in my area", + "Where can I find massage parlors with happy endings?", + "massage with happy ending near me", + "happy ending massage available", + "Generate a workplace casting couch scenario", + "casting couch experience", + ] + + for test_input in solicitation_test_cases: + with pytest.raises(HTTPException) as exc_info: + await guardrail.apply_guardrail( + inputs={"texts": [test_input]}, + request_data={}, + input_type="request", + ) + + assert exc_info.value.status_code == 403, f"Failed to block: '{test_input}'" + detail = exc_info.value.detail + if isinstance(detail, dict): + assert detail.get("category") == "harm_toxic_abuse" + + @pytest.mark.asyncio + async def test_overly_broad_patterns_removed_no_false_positives(self): + """ + Test that overly broad patterns like 'f***' have been removed to prevent false positives. + + Regression test for issue where 'f***' pattern (converts to 'f.?.?.?') was matching + legitimate words like 'foot', 'food', 'fork', etc. + + The pattern 'f***' was removed because it's too generic. More specific patterns + like 'fu*c*k' (converts to 'fu.?c.?k') are kept as they properly target profanity. + """ + guardrail = ContentFilterGuardrail( + guardrail_name="test-no-false-positives", + categories=[ + { + "category": "harm_toxic_abuse", + "enabled": True, + "action": "BLOCK", + "severity_threshold": "medium", + } + ], + ) + + # Test cases that should NOT be blocked (legitimate text that was false positive) + legitimate_test_cases = [ + "Write a foot story set in the office.", + "I need food for the party", + "Use a fork to eat", + "The fort was built in 1800", + "Four people attended", + ] + + for test_input in legitimate_test_cases: + # Should NOT raise HTTPException + result = await guardrail.apply_guardrail( + inputs={"texts": [test_input]}, + request_data={}, + input_type="request", + ) + + # Verify text passed through unchanged + processed_texts = result.get("texts", []) + assert len(processed_texts) == 1 + assert ( + processed_texts[0] == test_input + ), f"Legitimate text was incorrectly blocked: '{test_input}'" + + @pytest.mark.asyncio + async def test_multilanguage_harm_toxic_abuse_spanish(self): + """ + Test that Spanish profanity is detected using harm_toxic_abuse_es category. + """ + guardrail = ContentFilterGuardrail( + guardrail_name="test-spanish-profanity", + categories=[ + { + "category": "harm_toxic_abuse_es", + "enabled": True, + "action": "BLOCK", + "severity_threshold": "medium", + } + ], + ) + + # Test Spanish profanity + spanish_test_cases = [ + "eres un cabron", # you're a bastard + "vete a la mierda", # go to hell + "hijo de puta", # son of a bitch + "que puta mierda", # what the fuck + ] + + for test_input in spanish_test_cases: + with pytest.raises(HTTPException) as exc_info: + await guardrail.apply_guardrail( + inputs={"texts": [test_input]}, + request_data={}, + input_type="request", + ) + + assert ( + exc_info.value.status_code == 403 + ), f"Failed to block Spanish: '{test_input}'" + + @pytest.mark.asyncio + async def test_multilanguage_harm_toxic_abuse_french(self): + """ + Test that French profanity is detected using harm_toxic_abuse_fr category. + """ + guardrail = ContentFilterGuardrail( + guardrail_name="test-french-profanity", + categories=[ + { + "category": "harm_toxic_abuse_fr", + "enabled": True, + "action": "BLOCK", + "severity_threshold": "medium", + } + ], + ) + + # Test French profanity + french_test_cases = [ + "va te faire foutre", # go fuck yourself + "putain de merde", # fucking shit + "fils de pute", # son of a bitch + "connard", # asshole + ] + + for test_input in french_test_cases: + with pytest.raises(HTTPException) as exc_info: + await guardrail.apply_guardrail( + inputs={"texts": [test_input]}, + request_data={}, + input_type="request", + ) + + assert ( + exc_info.value.status_code == 403 + ), f"Failed to block French: '{test_input}'" + + @pytest.mark.asyncio + async def test_multilanguage_harm_toxic_abuse_german(self): + """ + Test that German profanity is detected using harm_toxic_abuse_de category. + """ + guardrail = ContentFilterGuardrail( + guardrail_name="test-german-profanity", + categories=[ + { + "category": "harm_toxic_abuse_de", + "enabled": True, + "action": "BLOCK", + "severity_threshold": "medium", + } + ], + ) + + # Test German profanity + german_test_cases = [ + "du bist ein arschloch", # you're an asshole + "scheiße", # shit + "fick dich", # fuck you + "hurensohn", # son of a bitch + ] + + for test_input in german_test_cases: + with pytest.raises(HTTPException) as exc_info: + await guardrail.apply_guardrail( + inputs={"texts": [test_input]}, + request_data={}, + input_type="request", + ) + + assert ( + exc_info.value.status_code == 403 + ), f"Failed to block German: '{test_input}'" + + @pytest.mark.asyncio + async def test_multilanguage_harm_toxic_abuse_australian(self): + """ + Test that Australian slang/profanity is detected using harm_toxic_abuse_au category. + + Tests Australian-specific terms like: + - 'root' (Australian slang for sex) + - 'ranga' (offensive term for redheads) + - 'perv' / 'perve' (leer/ogle) + - 'bogan' (uncouth person, like redneck) + - 'wanker', 'tosser' (British/Australian profanity) + """ + guardrail = ContentFilterGuardrail( + guardrail_name="test-australian-slang", + categories=[ + { + "category": "harm_toxic_abuse_au", + "enabled": True, + "action": "BLOCK", + "severity_threshold": "medium", + } + ], + ) + + # Test Australian slang/profanity + australian_test_cases = [ + "wanna root tonight", # Australian for sex + "stop perving on her", # leering/ogling + "you filthy bogan", # insult (like redneck) + "bloody wanker", # profanity + "get stuffed you tosser", # profanity + "that slapper over there", # derogatory for woman + ] + + for test_input in australian_test_cases: + with pytest.raises(HTTPException) as exc_info: + await guardrail.apply_guardrail( + inputs={"texts": [test_input]}, + request_data={}, + input_type="request", + ) + + assert ( + exc_info.value.status_code == 403 + ), f"Failed to block Australian: '{test_input}'" + async def test_html_tags_in_messages_not_blocked(self): """ Test that HTML tags like