File size: 2,355 Bytes
87848d5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
"""
Модуль для обробки логіки чату.
"""

from typing import List, Tuple, Optional
import menu_loader
import llm_client

# Глобальна змінна для кешування меню
_menu_cache: Optional[str] = None


def load_menu_once() -> str:
    """
    Завантажує меню один раз та кешує його.
    
    Returns:
        Текст меню
        
    Raises:
        Exception: При помилках завантаження меню
    """
    global _menu_cache
    
    if _menu_cache is None:
        _menu_cache = menu_loader.load_menu()
    
    return _menu_cache


def process_message(message: str, history: List[Tuple[str, str]]) -> str:
    """
    Обробляє повідомлення користувача та повертає відповідь бота.
    
    Args:
        message: Повідомлення від користувача
        history: Історія чату у форматі Gradio [(user_msg, bot_msg), ...]
        
    Returns:
        Відповідь бота
    """
    # Перевірка на порожнє повідомлення
    if not message or not message.strip():
        return "❌ Будь ласка, введіть ваше запитання."
    
    # Перевірка на занадто довге повідомлення
    if len(message) > 500:
        return "❌ Повідомлення занадто довге. Будь ласка, сформулюйте коротше (до 500 символів)."
    
    try:
        # Завантажуємо меню (lazy loading з кешуванням)
        menu_context = load_menu_once()
        
        # Отримуємо відповідь від LLM
        bot_response = llm_client.create_chat_completion(
            user_message=message,
            menu_context=menu_context,
            conversation_history=history
        )
        
        return bot_response
        
    except FileNotFoundError as e:
        # Помилка відсутності файлу меню
        return str(e)
    
    except ValueError as e:
        # Помилка з API ключем
        return str(e)
    
    except Exception as e:
        # Інші помилки
        return f"❌ Виникла помилка: {str(e)}"