# sentiment_tools.py - CrewAI Native Version from crewai.tools import BaseTool from typing import Type from pydantic import BaseModel, Field class SentimentInput(BaseModel): """Input schema for SentimentTool.""" text: str = Field(..., description="Text to analyze for sentiment") class SentimentTool(BaseTool): name: str = "Analyze Sentiment" description: str = "Analyzes the sentiment of a given text using keyword analysis" args_schema: Type[BaseModel] = SentimentInput def _run(self, text: str) -> str: try: # Simple sentiment analysis without heavy models for faster execution text_lower = text.lower() # Positive indicators positive_words = [ 'bull', 'bullish', 'up', 'rise', 'rising', 'gain', 'gains', 'positive', 'strong', 'growth', 'increase', 'rally', 'surge', 'optimistic', 'good', 'great', 'excellent', 'buy', 'moon' ] # Negative indicators negative_words = [ 'bear', 'bearish', 'down', 'fall', 'falling', 'loss', 'losses', 'negative', 'weak', 'decline', 'decrease', 'crash', 'dump', 'pessimistic', 'bad', 'poor', 'terrible', 'sell', 'fear' ] positive_count = sum(1 for word in positive_words if word in text_lower) negative_count = sum(1 for word in negative_words if word in text_lower) if positive_count > negative_count: confidence = min(0.9, 0.6 + (positive_count - negative_count) * 0.1) return f"Positive (confidence: {confidence:.1f})" elif negative_count > positive_count: confidence = min(0.9, 0.6 + (negative_count - positive_count) * 0.1) return f"Negative (confidence: {confidence:.1f})" else: return "Neutral (confidence: 0.5)" except Exception as e: return f"Sentiment analysis error: {str(e)}"