/
pr_aytipelag
/
DataSphere_Analytics
Обзор
Документация
Войти
/
pr_aytipelag
/
DataSphere_Analytics
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
app.py
178 строк
11 KB
kontrama
загружена финальная, рабочая версия сайта
19 июн 2025, 14:42
19 июн 2025, 14:42
4a14896
Код
Авторство
О чём код?
from flask import Flask, render_template, request, jsonify, session from dotenv import load_dotenv import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import os import re from openai import OpenAI # Загрузить переменные среды load_dotenv() app = Flask(__name__) app.config['SECRET_KEY'] = os.urandom(24) # Для защиты от CSRF ## Загрузка учётных данных эл.почты #EMAIL_ADDRESS = os.environ.get('EMAIL_ADDRESS') #EMAIL_PASSWORD = os.environ.get('EMAIL_PASSWORD') ## Проврека установленных учетных данных #if not EMAIL_ADDRESS or not EMAIL_PASSWORD: # raise ValueError("Учётные файлы электронной почты не указанны в файле .env") # Настройка API OpenRouter (из app.py(1) Кости) OPENROUTER_API_KEY = "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" client = OpenAI( base_url="https://openrouter.ai/api/v1", api_key=OPENROUTER_API_KEY, ) # system prompt и начальный user prompt SYSTEM_MESSAGE = { "role": "system", "content": ( "Вы — виртуальный ассистент компании DataSphere Analytics, эксперта в области анализа больших данных и интеллектуальных бизнес-решений. " "Используйте следующую информацию о компании для ответов клиентам:\n\n" "DataSphere Analytics специализируется на анализе больших данных и предоставлении интеллектуальных решений для стратегических бизнес-решений. " "Мы помогаем организациям преобразовать данные в ценную информацию для более осознанных и точных решений. Наши решения основаны на передовых методах машинного обучения и аналитики, обеспечивая точность и глубину анализа.\n\n" "Основные направления:\n" "- Анализ больших данных: обработка и анализ больших объёмов данных для выявления скрытых тенденций и возможностей.\n" "- Машинное обучение: разработка моделей для предсказания рыночных трендов, прогнозирования продаж и оптимизации операций.\n" "- Интерактивные дашборды: создание визуализированных отчетов и дашбордов для удобного доступа к ключевым KPI.\n" "- Консалтинг: анализ текущего состояния бизнеса и рекомендации по оптимизации процессов.\n" "- Измеримые результаты: повышение прибыли на 20-40%, снижение времени принятия решений на 50%, улучшение качества данных на 80%.\n\n" "Цель: помочь организациям использовать данные как стратегический инструмент для улучшения бизнес-процессов и повышения конкурентоспособности." "Если пользователь просит связать его с менеджером, не отвечайте на этот вопрос самостоятельно. Вместо этого, передайте эту просьбу на электронную почту менеджера и сообщите пользователю, что его запрос принят и менеджер свяжется с ним в ближайшее время.\n\n" ) } INITIAL_USER_INSTRUCTION = { "role": "user", "content": ( "Ваша задача — кратко и понятно рассказывать клиентам о возможностях компании, выявлять их потребности и предлагать соответствующие решения. " "Клиенты могут спрашивать о том, как мы помогаем бизнесу принимать лучшие решения, какие технологии и методы используем, а также о результатах, " "которых могут ожидать. Стиль общения — профессиональный, но доступный. Отвечайте одним абзацем, включающим 2-3 связанных темы из контекста, " "без лишней информации и символов Юникода. Если пользователь приветствует вас или задаёт общие вопросы (например, «привет», «как дела?», «добрый день»), " "отвечайте вежливо и дружелюбно, поддерживая разговор. Если вопрос не по теме и не является приветствием, вежливо сообщайте, что вы специализируетесь " "на вопросах, связанных с DataSphere Analytics." ) } # Функция чат-бота (из app.py(1) Кости) def ask_openrouter(messages): completion = client.chat.completions.create( extra_headers={ "HTTP-Referer": "https://test.example", "X-Title": "data security", }, model="deepseek/deepseek-r1-0528:free", messages=messages ) return completion.choices[0].message.content # Генерация токена CSRF def generate_csrf_token(): if 'csrf_token' not in session: session['csrf_token'] = os.urandom(16).hex() return session['csrf_token'] app.jinja_env.globals['csrf_token'] = generate_csrf_token # Маршрут главной страницы @app.route('/', methods=['GET']) def index(): return render_template('index.html') # Маршрут формы запроса @app.route('/request', methods=['GET', 'POST']) def request_form(): if request.method == 'POST': # Проверка CSRF if request.form.get('csrf_token') != session.get('csrf_token'): return render_template('error.html', message='Неверный токен CSRF') name = request.form.get('name') email = request.form.get('email') message = request.form.get('message') # Базовая проверка if not name or not email or not message: return render_template('error.html', message='Все поля обязательны для заполнения') if not re.match(r'^[\w\.-]+@[\w\.-]+\.\w+$', email): return render_template('error.html', message='Неверный адрес электронной почты') # Очистка полей от вредоносных символов name = ''.join(c for c in name if c.isalnum() or c in ' -') message = ''.join(c for c in message if c.isprintable()) # Подготовка письма msg = MIMEMultipart() msg['From'] = 'Datasphere.Analytics@test.com' #Поддельный эл.адрес (не имеет значения), для будущей работы сайта поставить: EMAIL_ADDRESS msg['To'] = email msg['Subject'] = 'Спасибо, что обратились к нам!' body = f"Здравствуйте {name},\n\nВаше сообщение: {message}\n\nС вами свяжется ответственное лицо в течение 24 часов.\n\nС уважением,\n\nКоманда Datasphere Analytics" msg.attach(MIMEText(body, 'plain')) try: # Отправка электронного письма через Mailpit SMTP server = smtplib.SMTP('127.0.0.1', 1025) #SMTP-порт Mailpit по умолчанию. Поменять для нужного порта почтового сервиса ##В этой настройке для Mailpit не требуется starttls() или login() #server.starttls() #server.login(EMAIL_ADDRESS, EMAIL_PASSWORD) server.sendmail('Datasphere.Analytics@test.com', email, msg.as_string()) server.quit() return render_template('success.html') except Exception as e: return render_template('error.html', message=f'Ошибка отправки электронного письма: {str(e)}') return render_template('request.html') # API чата (из app.py(1) Кости) @app.route('/api/chat', methods=['POST']) def chat_api(): data = request.json user_prompt = data.get('prompt', '') if not user_prompt.strip(): return jsonify({"error": "Пустое поле"}), 400 # Формируем сообщения без истории, только system, initial user и текущий запрос # Проверяем, просит ли пользователь связать с менеджером (пример простого ключевого слова) keywords = ['связать с менеджером', 'позвоните менеджеру', 'хочу поговорить с менеджером', 'передайте менеджеру'] if any(kw in user_prompt.lower() for kw in keywords): # Отправляем письмо менеджеру try: send_email_to_manager(user_prompt) except Exception as e: # Логируем ошибку, но всё равно ответим пользователю print(f"Ошибка отправки письма менеджеру: {e}") # Отвечаем пользователю answer = ( "Спасибо за ваш запрос! Мы передали вашу просьбу менеджеру, " "и он свяжется с вами в ближайшее время." ) return jsonify({"answer": answer}) # Если не просьба связать с менеджером — обычный диалог с моделью messages = [SYSTEM_MESSAGE, INITIAL_USER_INSTRUCTION, {"role": "user", "content": user_prompt}] answer = ask_openrouter(messages) return jsonify({"answer": answer}) def send_email_to_manager(user_prompt): msg = MIMEMultipart() msg['From'] = 'Datasphere.Analytics@test.com' msg['To'] = 'menedger@test.com' msg['Subject'] = 'Запрос помощи от пользователя' body = f"Пользователь запросил помощь менеджера.\n\nСообщение: {user_prompt}\n\nПожалуйста, ответьте в ближайшее время." msg.attach(MIMEText(body, 'plain')) try: server = smtplib.SMTP('127.0.0.1', 1025) server.sendmail('Datasphere.Analytics@test.com', 'menedger@test.com', msg.as_string()) server.quit() except Exception as e: print(f"Не удалось отправить электронное письмо менеджеру: {str(e)}") if __name__ == '__main__': app.run(debug=True)