""" AI Engine models - AI sentiment analysis and NLP This module implements AI capabilities: - Sentiment analysis for text (complaints, comments, social posts) - Generic sentiment result storage - Stubbed AI service interface for future integration """ from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models from apps.core.models import TimeStampedModel, UUIDModel class SentimentResult(UUIDModel, TimeStampedModel): """ AI Sentiment analysis result - linked to any text content. Uses generic foreign key to link to: - Complaints - Survey responses (text answers) - Social media mentions - Call center notes """ # Related object (generic foreign key) content_type = models.ForeignKey( ContentType, on_delete=models.CASCADE ) object_id = models.UUIDField() content_object = GenericForeignKey('content_type', 'object_id') # Text analyzed text = models.TextField(help_text="Text that was analyzed") language = models.CharField( max_length=5, choices=[('en', 'English'), ('ar', 'Arabic')], default='en' ) # Sentiment result sentiment = models.CharField( max_length=20, choices=[ ('positive', 'Positive'), ('neutral', 'Neutral'), ('negative', 'Negative'), ], db_index=True ) # Sentiment score (-1 to 1, where -1 is very negative, 1 is very positive) sentiment_score = models.DecimalField( max_digits=5, decimal_places=4, help_text="Sentiment score from -1 (negative) to 1 (positive)" ) # Confidence level (0 to 1) confidence = models.DecimalField( max_digits=5, decimal_places=4, help_text="Confidence level of the sentiment analysis" ) # AI service information ai_service = models.CharField( max_length=100, default='stub', help_text="AI service used (e.g., 'openai', 'azure', 'aws', 'stub')" ) ai_model = models.CharField( max_length=100, blank=True, help_text="Specific AI model used" ) # Processing metadata processing_time_ms = models.IntegerField( null=True, blank=True, help_text="Time taken to analyze (milliseconds)" ) # Additional analysis (optional) keywords = models.JSONField( default=list, blank=True, help_text="Extracted keywords" ) entities = models.JSONField( default=list, blank=True, help_text="Extracted entities (people, places, etc.)" ) emotions = models.JSONField( default=dict, blank=True, help_text="Emotion scores (joy, anger, sadness, etc.)" ) # Metadata metadata = models.JSONField(default=dict, blank=True) class Meta: ordering = ['-created_at'] indexes = [ models.Index(fields=['sentiment', '-created_at']), models.Index(fields=['content_type', 'object_id']), ] def __str__(self): return f"{self.sentiment} ({self.sentiment_score}) - {self.text[:50]}"