127 lines
4.5 KiB
Python
127 lines
4.5 KiB
Python
from flask import Blueprint, render_template, current_app, request, flash, redirect, url_for
|
||
from flask_login import login_required, current_user, login_manager
|
||
from .models import User, Conversation
|
||
from . import db
|
||
from datetime import datetime, timedelta
|
||
import openai
|
||
import logging
|
||
import time
|
||
|
||
main = Blueprint('main', __name__)
|
||
|
||
logger = logging.getLogger('waitress')
|
||
|
||
|
||
@main.route('/')
|
||
def index():
|
||
|
||
notice = current_app.config['HOMEPAGE_NOTICE']
|
||
return render_template('index.html', user=current_user, homepage_notice=notice)
|
||
|
||
|
||
@main.route('/profile')
|
||
@login_required
|
||
def profile():
|
||
if current_user.role == "admin":
|
||
return render_template('profile.html', user=current_user, accounts=User.query.all())
|
||
return render_template('profile.html', user=current_user)
|
||
|
||
|
||
@main.route('/manage')
|
||
@login_required
|
||
def manage():
|
||
if current_user.role == "admin":
|
||
accountid = request.args.get('id')
|
||
if accountid:
|
||
accounts = User.query.filter_by(id=accountid)
|
||
else:
|
||
accounts = User.query
|
||
if accounts:
|
||
return render_template('manage.html', user=current_user, accounts=accounts)
|
||
else:
|
||
flash("无此用户id!")
|
||
return redirect(request.referrer if request.referrer else url_for('main.index'))
|
||
|
||
flash("您无权管理其他账户")
|
||
return redirect(url_for('main.index'))
|
||
|
||
|
||
@main.route('/chat')
|
||
@login_required
|
||
def chat():
|
||
if current_user.isActivated:
|
||
if request.args.get("act") == "get_history":
|
||
chats_desc = Conversation.query.filter_by(
|
||
userid=current_user.id, useremail=current_user.email).order_by(Conversation.datetime.desc()).limit(20).all()
|
||
msgs = []
|
||
for chat in reversed(chats_desc):
|
||
msgs.append(
|
||
{"request": chat.request, "response": chat.response, "datetime": chat.datetime})
|
||
return msgs
|
||
return render_template('chat.html', user=current_user)
|
||
else:
|
||
flash("您的账户暂未被激活")
|
||
return redirect(url_for('main.index'))
|
||
return redirect(url_for('main.index'))
|
||
|
||
|
||
@main.route('/chat', methods=['POST'])
|
||
@login_required
|
||
def chat_post():
|
||
openai.api_key = current_app.config['OPENAI_API_KEY']
|
||
openai.proxy = current_app.config['NETWORK_PROXY']
|
||
|
||
msg = request.form.get("msg")
|
||
|
||
new_conversation = Conversation(userid=current_user.id,
|
||
useremail=current_user.email,
|
||
username=current_user.name,
|
||
request=msg,
|
||
response="")
|
||
db.session.add(new_conversation)
|
||
db.session.commit()
|
||
|
||
if current_user.is_authenticated and current_user.isActivated:
|
||
messages = [
|
||
{"role": "system",
|
||
"content": current_app.config['OPENAI_PROMPT']},
|
||
]
|
||
chats_desc = Conversation.query.filter_by(
|
||
userid=current_user.id, useremail=current_user.email).order_by(Conversation.datetime.desc()).limit(20).all()
|
||
for chat in reversed(chats_desc):
|
||
if chat.datetime <= datetime.utcnow() - timedelta(seconds=300):
|
||
continue
|
||
if chat.response:
|
||
messages.append(
|
||
{"role": "assistant", "content": chat.response})
|
||
else:
|
||
messages.append(
|
||
{"role": "user", "content": chat.request})
|
||
try:
|
||
openai_resp = openai.ChatCompletion.create(
|
||
model=current_app.config['OPENAI_MODEL_NAME'],
|
||
messages=messages
|
||
)
|
||
msg_resp = openai_resp['choices'][0]['message']['content']
|
||
except Exception as e:
|
||
logger.error("OpenAI API request failed: %s", repr(e))
|
||
msg_resp = "请求错误,请尝试重发。如果持续错误,请联系管理员检查。" + "\n"+"错误信息: " + repr(e)
|
||
time.sleep(1)
|
||
|
||
if msg_resp:
|
||
response = {"message": msg_resp, "status": "success"}
|
||
else:
|
||
response = {"message": "请求错误", "status": "success"}
|
||
else:
|
||
response = {"message": "请先登录/激活", "status": "fail"}
|
||
|
||
new_conversation = Conversation(userid=current_user.id,
|
||
useremail=current_user.email,
|
||
username=current_user.name,
|
||
request=msg,
|
||
response=msg_resp)
|
||
db.session.add(new_conversation)
|
||
db.session.commit()
|
||
|
||
return response
|