# Visualization Agents ## Overview This folder contains AI-powered agents that enhance the sentiment analysis dashboard with intelligent, context-aware insights and analysis capabilities. ## Architecture ### Base Agent Pattern All agents inherit from `BaseVisualizationAgent` which provides: - Common interface (`process()`, `validate_input()`) - Error handling - Logging functionality - Consistent configuration ### LLM Helper `utils/llm_helper.py` provides: - OpenAI API integration - Retry logic with exponential backoff - JSON mode support - Token usage tracking ## Available Agents ### 1. ContentSummaryAgent **Purpose**: Analyze and summarize comments for content pieces **Location**: `agents/content_summary_agent.py` **Input**: ```python { 'content_sk': str, # Content identifier 'content_description': str, # Content title/description 'comments': DataFrame or list # Comments data } ``` **Output**: ```python { 'success': bool, 'content_sk': str, 'summary': { 'executive_summary': str, # 2-3 sentence overview 'main_themes': [ # Top themes discussed { 'theme': str, 'sentiment': str, # positive/negative/mixed 'description': str } ], 'praise_points': [str], # What users love 'key_complaints': [str], # Main concerns 'frequently_asked_questions': [str], # Common questions 'unexpected_insights': [str], # Surprising patterns 'action_recommendations': [ # Suggested actions { 'priority': str, # high/medium/low 'action': str } ] }, 'metadata': { 'total_comments_analyzed': int, 'model_used': str, 'tokens_used': int } } ``` **Configuration**: - Model: `gpt-5-nano` (configurable) - Temperature: 0.3 (lower for focused summaries) - Sampling: All negative comments + up to 50 positive/neutral (if >100 total) **Features**: - **Smart sampling**: Prioritizes negative comments, samples others - **Context preservation**: Includes sentiment and intent metadata - **Token optimization**: Truncates long comments to 300 chars - **Structured output**: JSON format with guaranteed fields - **Error handling**: Graceful failures with retry capability ## UI Integration ### Poor Sentiment Contents Page **Location**: `components/poor_sentiment_contents.py` **User Flow**: 1. User views content cards on Poor Sentiment Contents page 2. Clicks "🔍 Generate AI Analysis" button 3. Agent processes comments (with spinner indicator) 4. Summary displays in expandable section 5. Result cached in session state **Display Sections**: - **Executive Summary**: High-level overview (info box) - **Main Themes**: Key topics with sentiment indicators - **Praise Points** ✅ & **Key Complaints** âš ī¸ (side-by-side) - **FAQs** ❓ & **Unexpected Insights** 💡 (side-by-side) - **Recommended Actions** đŸŽ¯ (priority-coded) - **Analysis Metadata** â„šī¸ (expandable details) **Session Caching**: - Summaries stored in `st.session_state.content_summaries` - Key: `content_sk` - Persists during session, cleared on page reload - Prevents redundant API calls ## Usage Example ```python from agents.content_summary_agent import ContentSummaryAgent import pandas as pd # Initialize agent agent = ContentSummaryAgent(model="gpt-5-nano", temperature=0.3) # Prepare input input_data = { 'content_sk': '12345', 'content_description': 'Advanced Drum Fills Tutorial', 'comments': comments_df # DataFrame with comments } # Generate summary result = agent.process(input_data) if result['success']: summary = result['summary'] print(summary['executive_summary']) for theme in summary['main_themes']: print(f"Theme: {theme['theme']} ({theme['sentiment']})") print(f" {theme['description']}") else: print(f"Error: {result['error']}") ``` ## Environment Setup ### Required Environment Variables Add to `.env` file (parent directory): ```bash OPENAI_API_KEY=your_openai_api_key_here ``` ### Dependencies All dependencies already in `visualization/requirements.txt`: - `streamlit>=1.28.0` - `pandas>=2.0.0` - `python-dotenv>=1.0.0` - OpenAI library (inherited from parent project) ## Error Handling ### Agent-Level Errors - **Invalid input**: Returns `{'success': False, 'error': 'Invalid input data'}` - **LLM API failure**: Retries up to 3 times with exponential backoff - **JSON parsing error**: Returns error with raw content - **Exception**: Catches all exceptions, logs, returns error dict ### UI-Level Errors - Displays error message in red box - Provides "🔄 Retry Analysis" button - Clears cache and regenerates on retry - Logs errors to agent logger ## Performance Considerations ### API Costs - Model: `gpt-5-nano` (cost-effective) - Sampling strategy: Reduces tokens by up to 50% for large comment sets - Comment truncation: Max 300 chars per comment - Session caching: Eliminates duplicate API calls ### Response Time - Average: 5-10 seconds for 50-100 comments - Depends on: Comment count, OpenAI API latency - User feedback: Spinner shows "Analyzing comments with AI..." ### Scalability - Handles up to 100 comments per analysis (after sampling) - Parallel requests: Each content analyzed independently - Session state: Memory usage scales with number of analyzed contents ## Extending Agents ### Adding New Agents 1. **Create agent file**: ```python # agents/new_agent.py from agents.base_agent import BaseVisualizationAgent from utils.llm_helper import LLMHelper class NewAgent(BaseVisualizationAgent): def __init__(self, model="gpt-5-nano", temperature=0.7): super().__init__(name="NewAgent", model=model, temperature=temperature) self.llm_helper = LLMHelper(model=model, temperature=temperature) def validate_input(self, input_data): # Validation logic return True def process(self, input_data): # Processing logic pass ``` 2. **Update `__init__.py`**: ```python from .new_agent import NewAgent __all__ = ['ContentSummaryAgent', 'NewAgent'] ``` 3. **Integrate in UI**: - Import agent in component file - Add UI controls (buttons, inputs) - Display results - Handle caching if needed ### Best Practices 1. **Input Validation**: Always validate required fields 2. **Error Handling**: Use `handle_error()` method 3. **Logging**: Use `log_processing()` for debugging 4. **Structured Output**: Return consistent dict format 5. **Caching**: Use session state for expensive operations 6. **Token Optimization**: Sample/truncate data for large inputs 7. **User Feedback**: Show spinners for async operations 8. **Graceful Degradation**: Provide fallbacks for failures ## Testing ### Manual Testing 1. Start dashboard: `streamlit run app.py` 2. Navigate to "âš ī¸ Poor Sentiment Contents" page 3. Click "🔍 Generate AI Analysis" for any content 4. Verify summary displays correctly 5. Check session caching (click button again) 6. Test error handling (disconnect network) ### Unit Testing ```python # tests/test_content_summary_agent.py import pytest from agents.content_summary_agent import ContentSummaryAgent def test_validate_input(): agent = ContentSummaryAgent() # Valid input valid_input = { 'content_sk': '123', 'content_description': 'Test', 'comments': [] } assert agent.validate_input(valid_input) == True # Missing field invalid_input = {'content_sk': '123'} assert agent.validate_input(invalid_input) == False ``` ## Future Enhancements ### Planned Features 1. **Batch Analysis**: Analyze multiple contents at once 2. **Trend Detection**: Compare with historical summaries 3. **Export Summaries**: Download as PDF/CSV 4. **Custom Prompts**: User-defined analysis focus 5. **Multi-language Support**: Summaries in user's language ### Additional Agents (Roadmap) - **InsightsSummaryAgent**: Overall dataset insights - **InteractiveChatbotAgent**: Conversational analysis - **ComparativeContentAgent**: Content comparison - **ReplySuggestionAgent**: Generate reply suggestions - **TrendForecastingAgent**: Predict sentiment trends ## Troubleshooting ### Common Issues **Issue**: `OPENAI_API_KEY not found` - **Solution**: Add key to `.env` file in parent directory **Issue**: Import error for `agents` module - **Solution**: Ensure `__init__.py` exists in `visualization/agents/` **Issue**: LLM timeout errors - **Solution**: Reduce comment count or increase retry limit **Issue**: JSON parsing errors - **Solution**: Check LLM prompt format, ensure JSON mode enabled **Issue**: Cached summaries not showing - **Solution**: Check `st.session_state.content_summaries` initialization ## Support For issues or questions: 1. Check this README 2. Review agent logs in console 3. Inspect session state in Streamlit 4. Verify environment variables 5. Check OpenAI API status ## Version History ### v1.0.0 (Current) - Initial release - ContentSummaryAgent implementation - Poor Sentiment Contents page integration - Session-based caching - Error handling and retry logic - Comprehensive UI display