Spaces:
Sleeping
Sleeping
| """ | |
| Модуль для обробки логіки чату. | |
| """ | |
| 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)}" | |