Spaces:
Running
Running
# src/utils/greeting_handler.py | |
import re | |
import random | |
from typing import Tuple, Optional | |
class GreetingHandler: | |
"""Handler for detecting and responding to greetings""" | |
# Singleton instance | |
_instance = None | |
def __new__(cls): | |
if cls._instance is None: | |
cls._instance = super(GreetingHandler, cls).__new__(cls) | |
cls._instance._initialize() | |
return cls._instance | |
def _initialize(self): | |
"""Initialize patterns and responses""" | |
# Common greeting patterns with word boundaries to match whole words | |
self.greeting_patterns = [ | |
# English Greetings | |
r'\b(hi|hello|hey|howdy|greetings|good morning|good afternoon|good evening|good day)\b', | |
r'\bho+la\b', # Spanish greeting with possible repeated 'o' | |
r'\bhiy+a\b', # "Hiya" with possible repeated 'y' | |
r'\bhel+o+\b', # "Hello" with possible repeated letters | |
r'\bhey+\b', # "Hey" with possible repeated 'y' | |
r'\bhi+\b', # "Hi" with possible repeated 'i' | |
r'\byo+\b', # "Yo" with possible repeated 'o' | |
r'how are you(\s|\?|$)', | |
r'what\'?s up', | |
r'nice to (meet|see) you', | |
r'\bhiya\b', | |
r'\bsup\b', | |
r'\bwhat up\b', | |
r'\bhow\'?s it going\b', | |
r'\bhow\'?s everything\b', | |
r'\bhow\'?s life\b', | |
r'\bhow\'?s your day\b', | |
r'\bhow\'?ve you been\b', | |
r'\bwhat\'?s new\b', | |
r'\bany news\b', | |
r'\bhowdy partner\b', | |
r'\bheya\b', | |
r'\bhallo\b', | |
r'\bhey there\b', | |
r'\btop of the morning\b', | |
# International Greetings | |
r'\bbonjour\b', # French greeting | |
r'\bciao\b', # Italian greeting | |
r'\bnamaste\b', # Hindi greeting | |
r'\bsalam\b', # Arabic greeting | |
r'\bassalamu alaikum\b', # Islamic greeting | |
r'\bshalom\b', # Hebrew greeting | |
# Russian Greetings (Transliterated) | |
r'\bprivet\b', # "Privet" - Informal Hello | |
r'\bzdravstvuyte\b', # "Zdravstvuyte" - Formal Hello | |
r'\bdobroe utro\b', # "Dobroe utro" - Good morning | |
r'\bdobryy den\b', # "Dobryy den" - Good afternoon | |
r'\bdobryy vecher\b', # "Dobryy vecher" - Good evening | |
r'\bkak dela\b', # "Kak dela" - How are you? | |
r'\bkak pozhivayesh\b', # "Kak pozhivayesh" - How have you been? | |
# Arabic Greetings (Transliterated) | |
r'\bmarhaban\b', # "Marhaban" - Hello | |
r'\bahlan\b', # "Ahlan" - Informal Hello | |
r'\bassalamu alaykum\b', # "As-salamu alaykum" - Peace be upon you | |
r'\bsabah al-khair\b', # "Sabah al-khair" - Good morning | |
r'\bmasa al-khair\b', # "Masa al-khair" - Good evening | |
r'\bkayfa halak\b', # "Kayfa halak" (m) - How are you? | |
r'\bkayfa halik\b', # "Kayfa halik" (f) - How are you? | |
r'\bkayfa al-umur\b', # "Kayfa al-umur" - How’s everything? | |
r'\bakhbarak\b', # "Akhbarak" (m) - Any news? | |
r'\bakhbarik\b', # "Akhbarik" (f) - Any news? | |
] | |
self.compiled_patterns = [re.compile( | |
pattern, re.IGNORECASE) for pattern in self.greeting_patterns] | |
# List of greeting responses to choose from for variety | |
self.greeting_responses = [ | |
"Hello! How can I help you today?", | |
"Hi there! What can I assist you with?", | |
"Hey! How can I be of service?", | |
"Greetings! How may I assist you?", | |
"Hello! I'm here to help. What would you like to know?", | |
"Hi! I'm your assistant. What can I help you with?", | |
"Hello there! I'm ready to assist you. What's on your mind?", | |
"Hey! I'm here to provide information. What are you looking for?", | |
"Hi! How can I assist you today?" | |
] | |
# Special responses for "how are you" type greetings | |
self.how_are_you_responses = [ | |
"I'm doing great, thanks for asking! How can I help you today?", | |
"I'm well, thank you! How may I assist you?", | |
"I'm fine, thanks! What can I help you with?", | |
"Doing well! I'm ready to help with whatever you need." | |
] | |
def is_greeting(self, query: str) -> Tuple[bool, Optional[str]]: | |
""" | |
Check if the query is a greeting | |
Args: | |
query (str): The user query | |
Returns: | |
Tuple[bool, Optional[str]]: (is_greeting, appropriate_response) | |
""" | |
# Convert to lowercase for case-insensitive matching | |
query_lower = query.lower().strip() | |
# Skip detection for longer queries (likely not just greetings) | |
word_count = len(query_lower.split()) | |
if word_count > 10: | |
return False, None | |
# Check if query matches any greeting pattern | |
is_how_are_you = False | |
for pattern in self.compiled_patterns: | |
if re.search(pattern, query_lower): | |
# Special case for "how are you" type queries | |
if "how are you" in query_lower: | |
is_how_are_you = True | |
return True, self._get_response(is_how_are_you) | |
return False, None | |
def _get_response(self, is_how_are_you: bool = False) -> str: | |
""" | |
Get an appropriate greeting response | |
Args: | |
is_how_are_you (bool): Whether this is a "how are you" type greeting | |
Returns: | |
str: A greeting response | |
""" | |
if is_how_are_you: | |
return random.choice(self.how_are_you_responses) | |
return random.choice(self.greeting_responses) | |