Crypto-Analyst / sentiment_tools.py
menikev's picture
Update sentiment_tools.py
74851dc verified
# 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)}"