Features: - Core moderation: warn, kick, ban, timeout, strike system - Automod: banned words filter, scam detection, anti-spam, link filtering - AI moderation: Claude/OpenAI integration, NSFW detection, phishing analysis - Verification system: button, captcha, math, emoji challenges - Rate limiting system with configurable scopes - Event logging: joins, leaves, message edits/deletes, voice activity - Per-guild configuration with caching - Docker deployment support Bug fixes applied: - Fixed await on session.delete() in guild_config.py - Fixed memory leak in AI moderation message tracking (use deque) - Added error handling to bot shutdown - Added error handling to timeout command - Removed unused Literal import - Added prefix validation - Added image analysis limit (3 per message) - Fixed test mock for SQLAlchemy model
68 lines
1.7 KiB
Python
68 lines
1.7 KiB
Python
"""Factory for creating AI providers."""
|
|
|
|
import logging
|
|
from typing import Literal
|
|
|
|
from guardden.services.ai.base import AIProvider
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class NullProvider(AIProvider):
|
|
"""Null provider that does nothing (for when AI is disabled)."""
|
|
|
|
async def moderate_text(self, content, context=None, sensitivity=50):
|
|
from guardden.services.ai.base import ModerationResult
|
|
|
|
return ModerationResult()
|
|
|
|
async def analyze_image(self, image_url, sensitivity=50):
|
|
from guardden.services.ai.base import ImageAnalysisResult
|
|
|
|
return ImageAnalysisResult()
|
|
|
|
async def analyze_phishing(self, url, message_content=None):
|
|
from guardden.services.ai.base import PhishingAnalysisResult
|
|
|
|
return PhishingAnalysisResult()
|
|
|
|
async def close(self):
|
|
pass
|
|
|
|
|
|
def create_ai_provider(
|
|
provider: Literal["anthropic", "openai", "none"],
|
|
api_key: str | None = None,
|
|
) -> AIProvider:
|
|
"""
|
|
Create an AI provider instance.
|
|
|
|
Args:
|
|
provider: The provider type to create
|
|
api_key: API key for the provider
|
|
|
|
Returns:
|
|
AIProvider instance
|
|
|
|
Raises:
|
|
ValueError: If provider is unknown or API key is missing
|
|
"""
|
|
if provider == "none":
|
|
logger.info("AI moderation disabled")
|
|
return NullProvider()
|
|
|
|
if not api_key:
|
|
raise ValueError(f"API key required for {provider} provider")
|
|
|
|
if provider == "anthropic":
|
|
from guardden.services.ai.anthropic_provider import AnthropicProvider
|
|
|
|
return AnthropicProvider(api_key)
|
|
|
|
if provider == "openai":
|
|
from guardden.services.ai.openai_provider import OpenAIProvider
|
|
|
|
return OpenAIProvider(api_key)
|
|
|
|
raise ValueError(f"Unknown AI provider: {provider}")
|