This repository has been archived on 2023-05-17. You can view files and clone it, but cannot push or open issues or pull requests.
web-gpt/project/main.py
2023-04-05 00:09:48 +08:00

120 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
main = Blueprint('main', __name__)
@main.route('/')
def index():
notice = current_app.config['HOMEPAGE_NOTICE']
if notice:
notice = notice.split("\\n")
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})
openai_resp = openai.ChatCompletion.create(
model=current_app.config['OPENAI_MODEL_NAME'],
messages=messages
)
msg_resp = openai_resp['choices'][0]['message']['content']
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