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

125 lines
4.4 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
import logging
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 = "请求错误,请尝试重发。如果持续错误,请联系管理员检查。"
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