import gradio as gr import threading import time from chatbot import ITMOChatbot from update_data import update_data_async # Инициализация с обработкой ошибок try: chatbot = ITMOChatbot() print('Чат-бот инициализирован успешно') except Exception as e: print(f'Ошибка инициализации чат-бота: {e}') chatbot = None def chat_with_bot(message, history): if not message.strip(): return history, '' if not chatbot: return history + [[message, 'Чат-бот не инициализирован. Попробуйте обновить страницу.']], '' try: response, relevance_score = chatbot.chat(message, history) # Проверяем, что ответ не пустой и не содержит технических деталей if not response or response.startswith('[') or len(response.strip()) < 5: response = 'К сожалению, не смог сгенерировать ответ. Попробуйте переформулировать вопрос.' # Убираем лишние скобки и форматирование if response.startswith('[[') and response.endswith(']]'): # Извлекаем только текст ответа из формата [['user', 'bot_response']] try: import ast parsed = ast.literal_eval(response) if isinstance(parsed, list) and len(parsed) > 0 and isinstance(parsed[0], list) and len(parsed[0]) > 1: response = parsed[0][1] except: # Если не удалось распарсить, берем как есть pass return history + [[message, response]], '' except Exception as e: print(f'Ошибка в чате: {e}') error_msg = 'Произошла ошибка при обработке запроса. Попробуйте еще раз.' return history + [[message, error_msg]], '' def get_recommendations(programming_exp, math_level, interests, semester, skills): if not semester: return 'Пожалуйста, укажите семестр для получения рекомендаций.' if not chatbot: return 'Чат-бот не инициализирован. Попробуйте обновить страницу.' try: # Объединяем интересы и навыки all_interests = list(set(interests + skills)) profile = { 'programming_experience': programming_exp, 'math_level': math_level, 'interests': all_interests, 'semester': semester } recommendations = chatbot.recommend_courses(profile) # Проверяем качество ответа if not recommendations or recommendations.startswith('[') or len(recommendations.strip()) < 10: recommendations = 'К сожалению, не удалось сгенерировать рекомендации. Попробуйте изменить параметры профиля.' return recommendations except Exception as e: print(f'Ошибка в рекомендациях: {e}') return f'Ошибка при получении рекомендаций: {str(e)}' def update_data_ui(): try: update_data_async() return 'Данные успешно обновлены!' except Exception as e: return f'Ошибка при обновлении данных: {str(e)}' def update_data_thread(): return gr.update(value='Обновление данных...', interactive=False) with gr.Blocks(title='ITMO Магистратура - Чат-бот', theme=gr.themes.Soft()) as demo: gr.Markdown('# 🤖 Чат-бот для абитуриентов магистратур ITMO') gr.Markdown('Задавайте вопросы о программах ИИ и AI Product, получайте персональные рекомендации по курсам.') with gr.Row(): with gr.Column(scale=2): chatbot_interface = gr.ChatInterface( chat_with_bot, title='💬 Чат с ботом', description='Спрашивайте о дисциплинах, программах, учебных планах', examples=[ 'Какие дисциплины по NLP в 1 семестре программы ИИ?', 'Расскажи о программе AI Product', 'Какие курсы по машинному обучению есть в программе ИИ?', 'Сколько кредитов за дисциплину "Глубокое обучение"?' ] ) with gr.Column(scale=1): gr.Markdown('### 👤 Профиль для рекомендаций') with gr.Row(): programming_exp = gr.Slider( minimum=0, maximum=5, value=2, step=1, label='Опыт программирования (0-5)', info='0 - нет опыта, 5 - эксперт' ) math_level = gr.Slider( minimum=0, maximum=4, value=2, step=1, label='Уровень математики (0-4)', info='0 - базовый, 4 - продвинутый' ) gr.Markdown('**Интересы:**') interests = gr.CheckboxGroup( choices=['ml', 'dl', 'nlp', 'cv', 'product', 'business', 'research', 'data', 'systems'], value=['ml'], label='Области интересов', info='Выберите интересующие направления' ) gr.Markdown('**Навыки:**') skills = gr.CheckboxGroup( choices=['python', 'java', 'sql', 'git', 'docker', 'aws', 'tensorflow', 'pytorch', 'scikit-learn'], value=['python'], label='Технические навыки', info='Выберите имеющиеся навыки' ) semester = gr.Dropdown( choices=['1', '2', '3', '4'], label='Целевой семестр', info='Для получения рекомендаций' ) recommend_btn = gr.Button('🎯 Получить рекомендации', variant='primary') recommendations_output = gr.Textbox( label='Рекомендации', lines=12, interactive=False ) recommend_btn.click( get_recommendations, inputs=[programming_exp, math_level, interests, semester, skills], outputs=recommendations_output ) with gr.Row(): update_btn = gr.Button('🔄 Обновить данные', variant='secondary') update_status = gr.Textbox( label='Статус обновления', interactive=False, visible=False ) update_btn.click( update_data_thread, outputs=update_status ).then( update_data_ui, outputs=update_status ) if __name__ == '__main__': # Для Docker и HF Spaces demo.launch(server_name='0.0.0.0', server_port=7860)