-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
97 lines (78 loc) · 3.69 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from flask import Flask, render_template, request, session, redirect, url_for
import openai
import os
import re
app = Flask(__name__)
app.secret_key = 'your_secret_key' # 用于加密会话数据,建议使用一个随机生成的密钥
# 初始化 OpenAI 客户端
openai.api_key = os.getenv("OPENAI_API_KEY")
# 用于保存所有会话内容的文件路径
CHAT_HISTORY_FILE = "chat_history.txt"
def save_chat_history(messages):
"""保存会话内容到文件"""
with open(CHAT_HISTORY_FILE, "a") as f:
for message in messages[1:]: # 跳过第一条系统消息
f.write(f"{message['role'].capitalize()}: {message['content']}\n")
f.write("\n") # 添加空行分隔每个会话
def load_chat_history():
"""加载所有会话内容,按从旧到新的顺序显示,并排除当前会话"""
if os.path.exists(CHAT_HISTORY_FILE):
with open(CHAT_HISTORY_FILE, "r") as f:
chat_history = f.read().strip().split("\n\n") # 每个会话用双换行分隔
if len(chat_history) > 1:
# 将会话按正序排列(旧到新),排除最新的会话
return "\n\n".join(chat_history[:-1])
else:
# 只有一条历史记录时,不显示内容
return ""
return ""
def clean_response(text):
"""清除 ** 号并在序号后无空行"""
text = re.sub(r'\*\*', '', text) # 去除 ** 号
# 在序号后紧跟内容,不添加额外的换行符
text = re.sub(r'(\d+\.)\s*', r'\1 ', text)
return text
@app.route("/", methods=["GET", "POST"])
def index():
if "messages" not in session:
session["messages"] = [{"role": "system", "content": "You are a helpful assistant."}]
if request.method == "POST":
user_input = request.form.get("user_input")
if user_input:
# 添加用户消息到对话历史
session["messages"].append({"role": "user", "content": user_input})
try:
# 请求 OpenAI API 获取回应
completion = openai.ChatCompletion.create(
model="gpt-4o", # 使用的模型
messages=session["messages"], # 提供当前对话历史
max_tokens=550, # 设置最大生成令牌数
temperature=0.7, # 设置生成文本的创新性(温度)
top_p=1.0 # 设置核采样的累积概率阈值
)
# 获取 AI 的回应
assistant_response = completion.choices[0].message["content"].strip()
# 清理返回的文本
assistant_response = clean_response(assistant_response)
# 将 AI 的回应添加到对话历史
session["messages"].append({"role": "assistant", "content": assistant_response})
# 保存会话内容,包括当前问题和答案
save_chat_history(session["messages"])
except openai.error.OpenAIError as e:
assistant_response = f"An OpenAI error occurred: {e}"
except Exception as e:
assistant_response = f"An unexpected error occurred: {e}"
chat_history = load_chat_history()
return render_template("index.html", messages=session["messages"][1:], chat_history=chat_history)
@app.route("/new_session")
def new_session():
session.pop("messages", None) # 清除对话历史
# 清空聊天记录文件
with open(CHAT_HISTORY_FILE, "w") as f:
f.write("")
return redirect(url_for("index"))
if __name__ == "__main__":
# 清空聊天记录文件(重启时)
with open(CHAT_HISTORY_FILE, "w") as f:
f.write("")
app.run(debug=True)