Pearx commited on
Commit
955585c
1 Parent(s): 9f5bda5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +125 -110
app.py CHANGED
@@ -35,30 +35,80 @@ with st.sidebar:
35
  )
36
  st.write("---")
37
 
38
- c1, c2 = st.columns(2)
39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  create_chat_button = c1.button('新建', use_container_width=True, key='create_chat_button')
41
  if create_chat_button:
42
- st.session_state['history_chats'] = ['New Chat_' + str(uuid.uuid4())] + st.session_state['history_chats']
43
- st.session_state["current_chat_index"] = 0
44
  st.experimental_rerun()
45
 
46
  delete_chat_button = c2.button('删除', use_container_width=True, key='delete_chat_button')
47
  if delete_chat_button:
48
- if len(st.session_state['history_chats']) == 1:
49
- chat_init = 'New Chat_' + str(uuid.uuid4())
50
- st.session_state['history_chats'].append(chat_init)
51
- pre_chat_index = st.session_state['history_chats'].index(current_chat)
52
- if pre_chat_index > 0:
53
- st.session_state["current_chat_index"] = st.session_state['history_chats'].index(current_chat) - 1
54
- else:
55
- st.session_state["current_chat_index"] = 0
56
- st.session_state['history_chats'].remove(current_chat)
57
- remove_data(st.session_state["path"], current_chat)
58
  st.experimental_rerun()
59
 
60
- for i in range(5):
61
- st.write("\n")
 
 
 
 
 
 
 
 
62
  st.caption("""
63
  - 双击页面可直接定位输入栏
64
  - Ctrl + Enter 可快捷提交问题
@@ -76,32 +126,10 @@ if "history" + current_chat not in st.session_state:
76
  for k, v in value.items():
77
  st.session_state[k + current_chat + "value"] = v
78
 
79
- # 一键复制按钮
80
- st.markdown('<center><a href="https://huggingface.co/spaces/Pearx/ChatGPT-Assistant?duplicate=true">'
81
- '<img src="https://bit.ly/3gLdBN6" alt="Duplicate Space"></a><center>', unsafe_allow_html=True)
82
-
83
  # 对话展示
84
  show_messages(st.session_state["history" + current_chat])
85
 
86
 
87
- # 数据写入文件
88
- def write_data(new_chat_name=current_chat):
89
- if "apikey" in st.secrets:
90
- st.session_state["paras"] = {
91
- "temperature": st.session_state["temperature" + current_chat],
92
- "top_p": st.session_state["top_p" + current_chat],
93
- "presence_penalty": st.session_state["presence_penalty" + current_chat],
94
- "frequency_penalty": st.session_state["frequency_penalty" + current_chat],
95
- }
96
- st.session_state["contexts"] = {
97
- "context_select": st.session_state["context_select" + current_chat],
98
- "context_input": st.session_state["context_input" + current_chat],
99
- "context_level": st.session_state["context_level" + current_chat],
100
- }
101
- save_data(st.session_state["path"], new_chat_name, st.session_state["history" + current_chat],
102
- st.session_state["paras"], st.session_state["contexts"])
103
-
104
-
105
  def callback_fun(arg):
106
  # 连续快速点击新建与删除会触发错误回调,增加判断
107
  if ("history" + current_chat in st.session_state) and ("frequency_penalty" + current_chat in st.session_state):
@@ -109,6 +137,11 @@ def callback_fun(arg):
109
  st.session_state[arg + current_chat + "value"] = st.session_state[arg + current_chat]
110
 
111
 
 
 
 
 
 
112
  # 输入内容展示
113
  area_user_svg = st.empty()
114
  area_user_content = st.empty()
@@ -140,11 +173,6 @@ with tap_context:
140
  on_change=callback_fun, args=("context_input",))
141
 
142
  with tap_set:
143
- def clear_button_callback():
144
- st.session_state['history' + current_chat] = copy.deepcopy(initial_content_history)
145
- write_data()
146
-
147
-
148
  c1, c2 = st.columns(2)
149
  with c1:
150
  st.button("清空聊天记录", use_container_width=True, on_click=clear_button_callback)
@@ -195,76 +223,67 @@ with tap_input:
195
  # 修改窗口名称
196
  user_input_content = st.session_state['user_input_area']
197
  df_history = pd.DataFrame(st.session_state["history" + current_chat])
198
- if len(df_history.query('role!="system"')) == 0:
199
- current_chat_index = st.session_state['history_chats'].index(current_chat)
200
- new_name = extract_chars(user_input_content, 18) + '_' + str(uuid.uuid4())
201
- new_name = filename_correction(new_name)
202
- st.session_state['history_chats'][current_chat_index] = new_name
203
- st.session_state["current_chat_index"] = current_chat_index
204
- # 写入新文件
205
- write_data(new_name)
206
- # 转移数据
207
- st.session_state['history' + new_name] = st.session_state['history' + current_chat]
208
- for item in ["context_select", "context_input", "context_level", *initial_content_all['paras']]:
209
- st.session_state[item + new_name + "value"] = st.session_state[item + current_chat + "value"]
210
- remove_data(st.session_state["path"], current_chat)
211
-
212
 
213
  with st.form("input_form", clear_on_submit=True):
214
- user_input = st.text_area("**输入:**", key="user_input_area")
215
  submitted = st.form_submit_button("确认提交", use_container_width=True, on_click=input_callback)
216
  if submitted:
217
  st.session_state['user_input_content'] = user_input
218
 
219
- if st.session_state['user_input_content'] != '':
220
- if 'r' in st.session_state:
221
- st.session_state.pop("r")
222
- st.session_state[current_chat + 'report'] = ""
223
- st.session_state['pre_user_input_content'] = url_correction(
224
- remove_hashtag_right__space(st.session_state['user_input_content']
225
- .replace('\n', '\n\n')))
226
- st.session_state['user_input_content'] = ''
227
-
228
- show_each_message(st.session_state['pre_user_input_content'], 'user',
229
- [area_user_svg.markdown, area_user_content.markdown])
230
-
231
- context_level_tem = st.session_state['context_level' + current_chat]
232
- history_need_input = (get_history_input(st.session_state["history" + current_chat], context_level_tem) +
233
- [{"role": "user", "content": st.session_state['pre_user_input_content']}])
234
- for ctx in [st.session_state['context_input' + current_chat],
235
- set_context_all[st.session_state['context_select' + current_chat]]]:
236
- if ctx != "":
237
- history_need_input = [{"role": "system", "content": ctx}] + history_need_input
238
-
239
- paras_need_input = {
240
- "temperature": st.session_state["temperature" + current_chat],
241
- "top_p": st.session_state["top_p" + current_chat],
242
- "presence_penalty": st.session_state["presence_penalty" + current_chat],
243
- "frequency_penalty": st.session_state["frequency_penalty" + current_chat],
244
- }
245
- with st.spinner("🤔"):
246
- try:
247
- if apikey := st.session_state['apikey_input']:
248
- openai.api_key = apikey
249
- else:
250
- openai.api_key = st.secrets["apikey"]
251
- r = openai.ChatCompletion.create(model=model, messages=history_need_input, stream=True,
252
- **paras_need_input)
253
- except (FileNotFoundError, KeyError):
254
- area_error.error("缺失 OpenAI API Key,请在复制项目后配置Secrets,或者在设置中进行临时配置。"
255
- "详情见[项目仓库](https://github.com/PierXuY/ChatGPT-Assistant)。")
256
- except openai.error.AuthenticationError:
257
- area_error.error("无效的 OpenAI API Key。")
258
- except openai.error.APIConnectionError as e:
259
- area_error.error("连接超时,请重试。报错: \n" + str(e.args[0]))
260
- except openai.error.InvalidRequestError as e:
261
- area_error.error("无效的请求,请重试。报错: \n" + str(e.args[0]))
262
- except openai.error.RateLimitError as e:
263
- area_error.error("请求速率过快,请重试。报错: \n" + str(e.args[0]))
264
  else:
265
- st.session_state["chat_of_r"] = current_chat
266
- st.session_state["r"] = r
267
- st.experimental_rerun()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
268
 
269
  if ("r" in st.session_state) and (current_chat == st.session_state["chat_of_r"]):
270
  if current_chat + 'report' not in st.session_state:
@@ -287,15 +306,11 @@ if ("r" in st.session_state) and (current_chat == st.session_state["chat_of_r"])
287
  st.session_state["history" + current_chat].append(
288
  {"role": "user", "content": st.session_state['pre_user_input_content']})
289
  st.session_state["history" + current_chat].append(
290
- {"role": "assistant", "content": url_correction(st.session_state[current_chat + 'report'])})
291
  write_data()
292
-
293
  # 用户在网页点击stop时,ss某些情形下会暂时为空
294
  if current_chat + 'report' in st.session_state:
295
  st.session_state.pop(current_chat + 'report')
296
  if 'r' in st.session_state:
297
  st.session_state.pop("r")
298
  st.experimental_rerun()
299
-
300
- # 添加事件监听
301
- v1.html(js_code, height=0)
 
35
  )
36
  st.write("---")
37
 
 
38
 
39
+ # 数据写入文件
40
+ def write_data(new_chat_name=current_chat):
41
+ if "apikey" in st.secrets:
42
+ st.session_state["paras"] = {
43
+ "temperature": st.session_state["temperature" + current_chat],
44
+ "top_p": st.session_state["top_p" + current_chat],
45
+ "presence_penalty": st.session_state["presence_penalty" + current_chat],
46
+ "frequency_penalty": st.session_state["frequency_penalty" + current_chat],
47
+ }
48
+ st.session_state["contexts"] = {
49
+ "context_select": st.session_state["context_select" + current_chat],
50
+ "context_input": st.session_state["context_input" + current_chat],
51
+ "context_level": st.session_state["context_level" + current_chat],
52
+ }
53
+ save_data(st.session_state["path"], new_chat_name, st.session_state["history" + current_chat],
54
+ st.session_state["paras"], st.session_state["contexts"])
55
+
56
+
57
+ def reset_chat_name_fun(chat_name):
58
+ chat_name = chat_name + '_' + str(uuid.uuid4())
59
+ new_name = filename_correction(chat_name)
60
+ current_chat_index = st.session_state['history_chats'].index(current_chat)
61
+ st.session_state['history_chats'][current_chat_index] = new_name
62
+ st.session_state["current_chat_index"] = current_chat_index
63
+ # 写入新文件
64
+ write_data(new_name)
65
+ # 转移数据
66
+ st.session_state['history' + new_name] = st.session_state['history' + current_chat]
67
+ for item in ["context_select", "context_input", "context_level", *initial_content_all['paras']]:
68
+ st.session_state[item + new_name + "value"] = st.session_state[item + current_chat + "value"]
69
+ remove_data(st.session_state["path"], current_chat)
70
+
71
+
72
+ def create_chat_fun():
73
+ st.session_state['history_chats'] = ['New Chat_' + str(uuid.uuid4())] + st.session_state['history_chats']
74
+ st.session_state["current_chat_index"] = 0
75
+
76
+
77
+ def delete_chat_fun():
78
+ if len(st.session_state['history_chats']) == 1:
79
+ chat_init = 'New Chat_' + str(uuid.uuid4())
80
+ st.session_state['history_chats'].append(chat_init)
81
+ pre_chat_index = st.session_state['history_chats'].index(current_chat)
82
+ if pre_chat_index > 0:
83
+ st.session_state["current_chat_index"] = st.session_state['history_chats'].index(current_chat) - 1
84
+ else:
85
+ st.session_state["current_chat_index"] = 0
86
+ st.session_state['history_chats'].remove(current_chat)
87
+ remove_data(st.session_state["path"], current_chat)
88
+
89
+
90
+ with st.sidebar:
91
+ c1, c2 = st.columns(2)
92
  create_chat_button = c1.button('新建', use_container_width=True, key='create_chat_button')
93
  if create_chat_button:
94
+ create_chat_fun()
 
95
  st.experimental_rerun()
96
 
97
  delete_chat_button = c2.button('删除', use_container_width=True, key='delete_chat_button')
98
  if delete_chat_button:
99
+ delete_chat_fun()
 
 
 
 
 
 
 
 
 
100
  st.experimental_rerun()
101
 
102
+ with st.sidebar:
103
+ if ("set_chat_name" in st.session_state) and st.session_state['set_chat_name'] != '':
104
+ reset_chat_name_fun(st.session_state['set_chat_name'])
105
+ st.session_state['set_chat_name'] = ''
106
+ st.experimental_rerun()
107
+
108
+ st.write("\n")
109
+ st.text_input("设定窗口名称:", key="set_chat_name")
110
+ st.write("\n")
111
+ st.write("\n")
112
  st.caption("""
113
  - 双击页面可直接定位输入栏
114
  - Ctrl + Enter 可快捷提交问题
 
126
  for k, v in value.items():
127
  st.session_state[k + current_chat + "value"] = v
128
 
 
 
 
 
129
  # 对话展示
130
  show_messages(st.session_state["history" + current_chat])
131
 
132
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  def callback_fun(arg):
134
  # 连续快速点击新建与删除会触发错误回调,增加判断
135
  if ("history" + current_chat in st.session_state) and ("frequency_penalty" + current_chat in st.session_state):
 
137
  st.session_state[arg + current_chat + "value"] = st.session_state[arg + current_chat]
138
 
139
 
140
+ def clear_button_callback():
141
+ st.session_state['history' + current_chat] = copy.deepcopy(initial_content_history)
142
+ write_data()
143
+
144
+
145
  # 输入内容展示
146
  area_user_svg = st.empty()
147
  area_user_content = st.empty()
 
173
  on_change=callback_fun, args=("context_input",))
174
 
175
  with tap_set:
 
 
 
 
 
176
  c1, c2 = st.columns(2)
177
  with c1:
178
  st.button("清空聊天记录", use_container_width=True, on_click=clear_button_callback)
 
223
  # 修改窗口名称
224
  user_input_content = st.session_state['user_input_area']
225
  df_history = pd.DataFrame(st.session_state["history" + current_chat])
226
+ if (len(df_history.query('role!="system"')) == 0) and (current_chat.split('_')[0] == 'New Chat'):
227
+ new_name = extract_chars(user_input_content, 18)
228
+ reset_chat_name_fun(new_name)
 
 
 
 
 
 
 
 
 
 
 
229
 
230
  with st.form("input_form", clear_on_submit=True):
231
+ user_input = st.text_area("**输入:**", key="user_input_area", help="内容将以Markdown格式在页面展示")
232
  submitted = st.form_submit_button("确认提交", use_container_width=True, on_click=input_callback)
233
  if submitted:
234
  st.session_state['user_input_content'] = user_input
235
 
236
+ # 添加事件监听
237
+ v1.html(js_code, height=0)
238
+
239
+ if st.session_state['user_input_content'] != '':
240
+ if 'r' in st.session_state:
241
+ st.session_state.pop("r")
242
+ st.session_state[current_chat + 'report'] = ""
243
+ st.session_state['pre_user_input_content'] = st.session_state['user_input_content']
244
+ st.session_state['user_input_content'] = ''
245
+ # 临时展示
246
+ show_each_message(st.session_state['pre_user_input_content'], 'user',
247
+ [area_user_svg.markdown, area_user_content.markdown])
248
+ # 需输入的历史记录
249
+ context_level_tem = st.session_state['context_level' + current_chat]
250
+ history_need_input = (get_history_input(st.session_state["history" + current_chat], context_level_tem) +
251
+ [{"role": "user", "content": st.session_state['pre_user_input_content']}])
252
+ for ctx in [st.session_state['context_input' + current_chat],
253
+ set_context_all[st.session_state['context_select' + current_chat]]]:
254
+ if ctx != "":
255
+ history_need_input = [{"role": "system", "content": ctx}] + history_need_input
256
+ # 设定的模型参数
257
+ paras_need_input = {
258
+ "temperature": st.session_state["temperature" + current_chat],
259
+ "top_p": st.session_state["top_p" + current_chat],
260
+ "presence_penalty": st.session_state["presence_penalty" + current_chat],
261
+ "frequency_penalty": st.session_state["frequency_penalty" + current_chat],
262
+ }
263
+ # 调用接口
264
+ with st.spinner("🤔"):
265
+ try:
266
+ if apikey := st.session_state['apikey_input']:
267
+ openai.api_key = apikey
 
 
 
 
 
 
 
 
 
 
 
 
 
268
  else:
269
+ openai.api_key = st.secrets["apikey"]
270
+ r = openai.ChatCompletion.create(model=model, messages=history_need_input, stream=True,
271
+ **paras_need_input)
272
+ except (FileNotFoundError, KeyError):
273
+ area_error.error("缺失 OpenAI API Key,请在复制项目后配置Secrets,或者在设置中进行临时配置。"
274
+ "详情见[项目仓库](https://github.com/PierXuY/ChatGPT-Assistant)。")
275
+ except openai.error.AuthenticationError:
276
+ area_error.error("无效的 OpenAI API Key。")
277
+ except openai.error.APIConnectionError as e:
278
+ area_error.error("连接超时,请重试。报错: \n" + str(e.args[0]))
279
+ except openai.error.InvalidRequestError as e:
280
+ area_error.error("无效的请求,请重试。报错: \n" + str(e.args[0]))
281
+ except openai.error.RateLimitError as e:
282
+ area_error.error("请求速率过快,请重试。报错: \n" + str(e.args[0]))
283
+ else:
284
+ st.session_state["chat_of_r"] = current_chat
285
+ st.session_state["r"] = r
286
+ st.experimental_rerun()
287
 
288
  if ("r" in st.session_state) and (current_chat == st.session_state["chat_of_r"]):
289
  if current_chat + 'report' not in st.session_state:
 
306
  st.session_state["history" + current_chat].append(
307
  {"role": "user", "content": st.session_state['pre_user_input_content']})
308
  st.session_state["history" + current_chat].append(
309
+ {"role": "assistant", "content": st.session_state[current_chat + 'report']})
310
  write_data()
 
311
  # 用户在网页点击stop时,ss某些情形下会暂时为空
312
  if current_chat + 'report' in st.session_state:
313
  st.session_state.pop(current_chat + 'report')
314
  if 'r' in st.session_state:
315
  st.session_state.pop("r")
316
  st.experimental_rerun()