from flask import Flask, render_template_string, request, jsonify import os # Импорты модулей from parser import parse_all from data_layer import load_courses, filter_courses, recommend_courses, is_relevant from llm import answer, generate_recommendations app = Flask(__name__) # Инициализация данных courses = load_courses() print(f'Загружено курсов: {len(courses)}') # Простой HTML шаблон HTML_TEMPLATE = ''' ITMO Магистратура - Чат-бот

🤖 ITMO Магистратура - Чат-бот

Загружено курсов: {{ courses_count }}

Привет! Задавай вопросы о магистерских программах ITMO.

Рекомендации курсов

''' @app.route('/') def index(): """Главная страница""" return render_template_string(HTML_TEMPLATE, courses_count=len(courses)) @app.route('/api/chat', methods=['POST']) def chat(): """API для чата""" try: data = request.get_json() message = data.get('message', '').strip() if not message: return jsonify({'error': 'Пустое сообщение'}), 400 # Проверяем релевантность if not is_relevant(message): response = '''Похоже, вопрос не относится к магистратурам ITMO и их учебным планам. Попробуйте спросить, например: • "Какие дисциплины по NLP в 1 семестре программы ИИ?" • "Расскажи о программе AI Product" • "Какие курсы по машинному обучению есть в программе ИИ?" • "Сколько кредитов за дисциплину 'Глубокое обучение'?" • "Какие курсы подходят для моего профиля?"''' return jsonify({'response': response}) # Определяем программу из сообщения program_id = None message_lower = message.lower() if any(word in message_lower for word in ['ai product', 'продукт', 'менеджмент', 'аналитика']): program_id = 'ai_product' elif any(word in message_lower for word in ['ии', 'ai', 'машинное обучение', 'глубокое обучение', 'nlp', 'cv']): program_id = 'ai' # Извлекаем семестр если указан semester = None for i in range(1, 5): if f'{i} семестр' in message_lower or f'{i} семестре' in message_lower: semester = i break # Фильтруем курсы context = filter_courses(message, program_id, semester) if not context: response = 'К сожалению, не нашел релевантной информации в учебных планах ITMO. Попробуйте переформулировать вопрос.' else: # Генерируем ответ с помощью LLM response = answer(message, context) return jsonify({'response': response}) except Exception as e: return jsonify({'error': f'Ошибка обработки: {str(e)}'}), 500 @app.route('/api/recommendations', methods=['POST']) def get_recommendations(): """API для рекомендаций""" try: data = request.get_json() programming_exp = data.get('programming_exp', 2) math_level = data.get('math_level', 2) interests = data.get('interests', []) semester = data.get('semester', '') if not semester: return jsonify({'error': 'Пожалуйста, укажите семестр для получения рекомендаций.'}), 400 try: semester_int = int(semester) except ValueError: return jsonify({'error': 'Пожалуйста, выберите корректный семестр.'}), 400 # Формируем профиль profile = { 'programming_experience': programming_exp, 'math_level': math_level, 'interests': interests, 'semester': semester_int } # Получаем рекомендации recommended_courses = recommend_courses(profile) if not recommended_courses: return jsonify({'error': f'К сожалению, не найдено подходящих курсов для {semester} семестра.'}), 404 # Генерируем ответ с помощью LLM response = generate_recommendations(recommended_courses, profile) return jsonify({'response': response}) except Exception as e: return jsonify({'error': f'Ошибка получения рекомендаций: {str(e)}'}), 500 @app.route('/api/update', methods=['POST']) def update_data(): """API для обновления данных""" try: success = parse_all() if success: # Перезагружаем курсы global courses courses = load_courses() return jsonify({'message': f'Данные успешно обновлены! Загружено {len(courses)} курсов.'}) else: return jsonify({'error': 'Ошибка при обновлении данных. Используются базовые курсы.'}), 500 except Exception as e: return jsonify({'error': f'Ошибка обновления данных: {str(e)}'}), 500 @app.route('/api/status') def status(): """API для статуса системы""" return jsonify({ 'status': 'ok', 'courses_count': len(courses), 'llm_available': True }) # Для HF Spaces if __name__ == '__main__': port = int(os.environ.get('PORT', 7860)) app.run(host='0.0.0.0', port=port, debug=False)