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