/
PMV2208
/
server
Обзор
Документация
Войти
/
PMV2208
/
server
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app.py
135 строк
6 KB
PMV2208
Update: app.py
25 июн 2026, 15:38
Верифицирован
25 июн 2026, 15:38
4be85fb
Код
Авторство
О чём код?
# Установка необходимых библиотек (если ещё не установлены) import os import uuid import threading import time from flask import Flask, jsonify # request убран из импорта! from flask_cors import CORS from gigachat import GigaChat import logging # --- Импорт CloudPub SDK --- from cloudpub_python_sdk import Connection, Protocol, Auth # ---- Конфигурация (из переменных окружения) ---- GIGACHAT_CREDENTIALS = os.getenv("GIGACHAT_CREDENTIALS") if not GIGACHAT_CREDENTIALS: GIGACHAT_CREDENTIALS = "MDE5ZWZhMzQtYmEyYi03NmI1LTlkYTItMWFjYTAwZDZkOWVmOjQ4YjI3NGRiLWY5NTItNDZiZi04MmE5LTllYzUxMzM5Zjc2Nw==" # ---- Конфигурация CloudPub ---- CLOUDPUB_TOKEN = "vxF9EEgx91CVX6zBid6k6cH3q0NCriEGPWjmClCeHXU" CLOUDPUB_EMAIL = os.getenv("CLOUDPUB_EMAIL") CLOUDPUB_PASSWORD = os.getenv("CLOUDPUB_PASSWORD") auth_method = "token" SYSTEM_PROMPT = """Ты — поддерживающий психологический чат-бот для осуждённой молодёжи. Твои правила: 1. Ты не психотерапевт и не даёшь клинических диагнозов. 2. Твоя задача — выслушать, проявить эмпатию, предложить простые техники саморегуляции. 3. Если пользователь говорит о суициде, насилии или причинении вреда — ты НЕМЕДЛЕННО предлагаешь контакты службы поддержки и сообщаешь, что с ним свяжется психолог. 4. Ты никогда не осуждаешь, не даёшь оценок, не читаешь мораль. 5. Твои ответы — короткие (2–4 предложения), тёплые, на понятном подростку языке. 6. Ты не используешь сложные термины без объяснения. 7. Если не знаешь ответа — говори честно и предлагаешь обратиться к специалисту.""" sysflag = False # ---- Инициализация GigaChat ---- giga = GigaChat( credentials=GIGACHAT_CREDENTIALS, verify_ssl_certs=False ) # ---- Хранилище сессий (в памяти) ---- sessions = {} MAX_HISTORY_LENGTH = 20 # ---- Flask-приложение ---- app = Flask(__name__) CORS(app) @app.route('/chat', methods=['POST']) def chat(): from flask import request # ЛОКАЛЬНЫЙ ИМПОРТ – теперь request существует только внутри запроса data = request.get_json() if not data or 'text' not in data: return jsonify({"error": "Поле 'text' обязательно"}), 400 user_text = data['text'] session_id = data.get('session_id') if not session_id or session_id not in sessions: session_id = str(uuid.uuid4()) sessions[session_id] = [] sessions[session_id].append({"role": "user", "content": user_text}) if len(sessions[session_id]) > MAX_HISTORY_LENGTH: sessions[session_id] = sessions[session_id][-MAX_HISTORY_LENGTH:] try: messages = [{"role": "system", "content": SYSTEM_PROMPT}] + sessions[session_id] response = giga.chat({"messages": messages}) answer = response.choices[0].message.content sessions[session_id].append({"role": "assistant", "content": answer}) return jsonify({"response": answer, "session_id": session_id}) except Exception as e: if session_id in sessions and sessions[session_id]: sessions[session_id].pop() return jsonify({"error": str(e)}), 500 @app.route('/clear', methods=['POST']) def clear_history(): from flask import request # ЛОКАЛЬНЫЙ ИМПОРТ data = request.get_json() if not data or 'session_id' not in data: return jsonify({"error": "Поле 'session_id' обязательно"}), 400 session_id = data['session_id'] if session_id in sessions: sessions[session_id] = [] return jsonify({"status": "ok", "message": f"История для сессии {session_id} очищена"}) else: return jsonify({"error": "Сессия не найдена"}), 404 @app.route('/health', methods=['GET']) def health_check(): return {"status": "ok", "message": "Сервер работает"} # ---- Функция для публикации туннеля через CloudPub ---- def publish_tunnel(): try: # Блокируем логирование SDK sdk_logger = logging.getLogger('cloudpub_python_sdk') sdk_logger.addHandler(logging.NullHandler()) sdk_logger.propagate = False conn = Connection( token="vxF9EEgx91CVX6zBid6k6cH3q0NCriEGPWjmClCeHXU" ) endpoint = conn.publish( Protocol.HTTP, # для локального проброса HTTP достаточно "localhost:5000", name="Мой психологический чат-бот", auth=Auth.NONE ) print(f"✅ Сервис опубликован: {endpoint.url}") except Exception as e: print(f"❌ Ошибка при создании туннеля CloudPub: {e}") # ---- Запуск приложения ---- if __name__ == '__main__': time.sleep(2) publish_tunnel() print("🚀 Сервер запущен на порту 5000") app.run(host='0.0.0.0', port=5000) # (Опционально) удаляем глобальную переменную request, если она всё же осталась # Но после локального импорта её нет в глобальной области, так что это не нужно.