qingxu99 commited on
Commit
6c17f3e
1 Parent(s): c295bb4

添加历史存档读取的功能

Browse files
crazy_functional.py CHANGED
@@ -21,16 +21,22 @@ def get_crazy_functions():
21
  from crazy_functions.总结word文档 import 总结word文档
22
  from crazy_functions.解析JupyterNotebook import 解析ipynb文件
23
  from crazy_functions.对话历史存档 import 对话历史存档
 
 
 
24
  from crazy_functions.批量Markdown翻译 import Markdown英译中
25
  function_plugins = {
26
-
27
  "解析整个Python项目": {
28
  "Color": "stop", # 按钮颜色
29
  "Function": HotReload(解析一个Python项目)
30
  },
31
- "保存当前的对话": {
32
  "AsButton":False,
33
- "Function": HotReload(对话历史存档)
 
 
 
 
34
  },
35
  "[测试功能] 解析Jupyter Notebook文件": {
36
  "Color": "stop",
@@ -92,7 +98,11 @@ def get_crazy_functions():
92
  "AsButton": False, # 加入下拉菜单中
93
  "Function": HotReload(批量生成函数注释)
94
  },
 
 
 
95
  "[多线程Demo] 解析此项目本身(源码自译解)": {
 
96
  "Function": HotReload(解析项目本身)
97
  },
98
  "[多线程demo] 把本项目源代码切换成全英文": {
@@ -100,7 +110,7 @@ def get_crazy_functions():
100
  "AsButton": False, # 加入下拉菜单中
101
  "Function": HotReload(全项目切换英文)
102
  },
103
- "[函数插件模板Demo] 历史上的今天": {
104
  # HotReload 的意思是热更新,修改函数插件代码后,不需要重启程序,代码直接生效
105
  "Function": HotReload(高阶功能模板函数)
106
  },
 
21
  from crazy_functions.总结word文档 import 总结word文档
22
  from crazy_functions.解析JupyterNotebook import 解析ipynb文件
23
  from crazy_functions.对话历史存档 import 对话历史存档
24
+ from crazy_functions.对话历史存档 import 载入对话历史存档
25
+ from crazy_functions.对话历史存档 import 删除所有本地对话历史记录
26
+
27
  from crazy_functions.批量Markdown翻译 import Markdown英译中
28
  function_plugins = {
 
29
  "解析整个Python项目": {
30
  "Color": "stop", # 按钮颜色
31
  "Function": HotReload(解析一个Python项目)
32
  },
33
+ "载入对话历史存档": {
34
  "AsButton":False,
35
+ "Function": HotReload(载入对话历史存档)
36
+ },
37
+ "删除所有本地对话历史记录(请谨慎操作)": {
38
+ "AsButton":False,
39
+ "Function": HotReload(删除所有本地对话历史记录)
40
  },
41
  "[测试功能] 解析Jupyter Notebook文件": {
42
  "Color": "stop",
 
98
  "AsButton": False, # 加入下拉菜单中
99
  "Function": HotReload(批量生成函数注释)
100
  },
101
+ "保存当前的对话": {
102
+ "Function": HotReload(对话历史存档)
103
+ },
104
  "[多线程Demo] 解析此项目本身(源码自译解)": {
105
+ "AsButton": False, # 加入下拉菜单中
106
  "Function": HotReload(解析项目本身)
107
  },
108
  "[多线程demo] 把本项目源代码切换成全英文": {
 
110
  "AsButton": False, # 加入下拉菜单中
111
  "Function": HotReload(全项目切换英文)
112
  },
113
+ "[插件demo] 历史上的今天": {
114
  # HotReload 的意思是热更新,修改函数插件代码后,不需要重启程序,代码直接生效
115
  "Function": HotReload(高阶功能模板函数)
116
  },
crazy_functions/crazy_utils.py CHANGED
@@ -563,3 +563,46 @@ def read_and_clean_pdf_text(fp):
563
  # print亮绿('***************************')
564
 
565
  return meta_txt, page_one_meta
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
563
  # print亮绿('***************************')
564
 
565
  return meta_txt, page_one_meta
566
+
567
+
568
+ def get_files_from_everything(txt, type): # type='.md'
569
+ """
570
+ 这个函数是用来获取指定目录下所有指定类型(如.md)的文件,并且对于网络上的文件,也可以获取它。
571
+ 下面是对每个参数和返回值的说明:
572
+ 参数
573
+ - txt: 路径或网址,表示要搜索的文件或者文件夹路径或网络上的文件。
574
+ - type: 字符串,表示要搜索的文件类型。默认是.md。
575
+ 返回值
576
+ - success: 布尔值,表示函数是否成功执行。
577
+ - file_manifest: 文件路径列表,里面包含以指定类型为后缀名的所有文件的绝对路径。
578
+ - project_folder: 字符串,表示文件所在的文件夹路径。如果是网络上的文件,就是临时文件夹的路径。
579
+ 该函数详细注释已添加,请确认是否满足您的需要。
580
+ """
581
+ import glob, os
582
+
583
+ success = True
584
+ if txt.startswith('http'):
585
+ # 网络的远程文件
586
+ import requests
587
+ from toolbox import get_conf
588
+ proxies, = get_conf('proxies')
589
+ r = requests.get(txt, proxies=proxies)
590
+ with open('./gpt_log/temp'+type, 'wb+') as f: f.write(r.content)
591
+ project_folder = './gpt_log/'
592
+ file_manifest = ['./gpt_log/temp'+type]
593
+ elif txt.endswith(type):
594
+ # 直接给定文件
595
+ file_manifest = [txt]
596
+ project_folder = os.path.dirname(txt)
597
+ elif os.path.exists(txt):
598
+ # 本地路径,递归搜索
599
+ project_folder = txt
600
+ file_manifest = [f for f in glob.glob(f'{project_folder}/**/*'+type, recursive=True)]
601
+ if len(file_manifest) == 0:
602
+ success = False
603
+ else:
604
+ project_folder = None
605
+ file_manifest = []
606
+ success = False
607
+
608
+ return success, file_manifest, project_folder
crazy_functions/对话历史存档.py CHANGED
@@ -1,7 +1,7 @@
1
  from toolbox import CatchException, update_ui
2
  from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
3
 
4
- def write_chat_to_file(chatbot, file_name=None):
5
  """
6
  将对话记录history以Markdown格式写入文件中。如果没有指定文件名,则使用当前时间生成文件名。
7
  """
@@ -12,19 +12,42 @@ def write_chat_to_file(chatbot, file_name=None):
12
  os.makedirs('./gpt_log/', exist_ok=True)
13
  with open(f'./gpt_log/{file_name}', 'w', encoding='utf8') as f:
14
  for i, contents in enumerate(chatbot):
15
- for content in contents:
16
  try: # 这个bug没找到触发条件,暂时先这样顶一下
17
  if type(content) != str: content = str(content)
18
  except:
19
  continue
20
  f.write(content)
21
- f.write('\n\n')
 
22
  f.write('<hr color="red"> \n\n')
23
-
 
 
 
 
 
24
  res = '对话历史写入:' + os.path.abspath(f'./gpt_log/{file_name}')
25
  print(res)
26
  return res
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  @CatchException
29
  def 对话历史存档(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
30
  """
@@ -37,6 +60,64 @@ def 对话历史存档(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_
37
  web_port 当前软件运行的端口号
38
  """
39
 
40
- chatbot.append(("保存当前对话", f"[Local Message] {write_chat_to_file(chatbot)}"))
 
41
  yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 # 由于请求gpt需要一段时间,我们先及时地做一次界面更新
42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  from toolbox import CatchException, update_ui
2
  from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
3
 
4
+ def write_chat_to_file(chatbot, history=None, file_name=None):
5
  """
6
  将对话记录history以Markdown格式写入文件中。如果没有指定文件名,则使用当前时间生成文件名。
7
  """
 
12
  os.makedirs('./gpt_log/', exist_ok=True)
13
  with open(f'./gpt_log/{file_name}', 'w', encoding='utf8') as f:
14
  for i, contents in enumerate(chatbot):
15
+ for j, content in enumerate(contents):
16
  try: # 这个bug没找到触发条件,暂时先这样顶一下
17
  if type(content) != str: content = str(content)
18
  except:
19
  continue
20
  f.write(content)
21
+ if j == 0:
22
+ f.write('<hr style="border-top: dotted 3px #ccc;">')
23
  f.write('<hr color="red"> \n\n')
24
+ f.write('<hr color="blue"> \n\n raw chat context:\n')
25
+ f.write('<code>')
26
+ for h in history:
27
+ f.write("\n>>>" + h)
28
+ f.write('</code>')
29
+
30
  res = '对话历史写入:' + os.path.abspath(f'./gpt_log/{file_name}')
31
  print(res)
32
  return res
33
 
34
+ def read_file_to_chat(chatbot, history, file_name):
35
+ with open(file_name, 'r', encoding='utf8') as f:
36
+ file_content = f.read()
37
+ html, history = file_content.split('<hr color="blue"> \n\n raw chat context:\n')
38
+ history = history.strip('<code>')
39
+ history = history.strip('</code>')
40
+ history = history.split("\n>>>")
41
+ history = list(filter(lambda x:x!="", history))
42
+ html = html.split('<hr color="red"> \n\n')
43
+ html = list(filter(lambda x:x!="", html))
44
+ chatbot.clear()
45
+ for i, h in enumerate(html):
46
+ i_say, gpt_say = h.split('<hr style="border-top: dotted 3px #ccc;">')
47
+ chatbot.append([i_say, gpt_say])
48
+ chatbot.append([f"存档文件详情?", f"[Local Message] 载入对话{len(html)}条,上下文{len(history)}条。"])
49
+ return chatbot, history
50
+
51
  @CatchException
52
  def 对话历史存档(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
53
  """
 
60
  web_port 当前软件运行的端口号
61
  """
62
 
63
+ chatbot.append(("保存当前对话",
64
+ f"[Local Message] {write_chat_to_file(chatbot, history)},您可以调用“载入对话历史存档”还原当下的对话。\n警告!被保存的对话历史可以被使用该系统的任何人查阅。"))
65
  yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 # 由于请求gpt需要一段时间,我们先及时地做一次界面更新
66
 
67
+ def hide_cwd(str):
68
+ import os
69
+ current_path = os.getcwd()
70
+ replace_path = "."
71
+ return str.replace(current_path, replace_path)
72
+
73
+ @CatchException
74
+ def 载入对话历史存档(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
75
+ """
76
+ txt 输入栏用户输入的文本,例如需要翻译的一段话,再例如一个包含了待处理文件的路径
77
+ llm_kwargs gpt模型参数,如温度和top_p等,一般原样传递下去就行
78
+ plugin_kwargs 插件模型的参数,暂时没有用武之地
79
+ chatbot 聊天显示框的句柄,用于显示给用户
80
+ history 聊天历史,前情提要
81
+ system_prompt 给gpt的静默提醒
82
+ web_port 当前软件运行的端口号
83
+ """
84
+ from .crazy_utils import get_files_from_everything
85
+ success, file_manifest, _ = get_files_from_everything(txt, type='.html')
86
+
87
+ if not success:
88
+ if txt == "": txt = '空空如也的输入栏'
89
+ import glob
90
+ local_history = "<br/>".join(["`"+hide_cwd(f)+"`" for f in glob.glob(f'gpt_log/**/chatGPT对话历史*.html', recursive=True)])
91
+ chatbot.append([f"正在查找对话历史文件(html格式): {txt}", f"找不到任何html文件: {txt}。但本地存储了以下历史文件,您可以将任意一个文件路径粘贴到输入区,然后重试:<br/>{local_history}"])
92
+ yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
93
+ return
94
+
95
+ try:
96
+ chatbot, history = read_file_to_chat(chatbot, history, file_manifest[0])
97
+ yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
98
+ except:
99
+ chatbot.append([f"载入对话历史文件", f"对话历史文件损坏!"])
100
+ yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
101
+ return
102
+
103
+ @CatchException
104
+ def 删除所有本地对话历史记录(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
105
+ """
106
+ txt 输入栏用户输入的文本,例如需要翻译的一段话,再例如一个包含了待处理文件的路径
107
+ llm_kwargs gpt模型参数,如温度和top_p等,一般原样传递下去就行
108
+ plugin_kwargs 插件模型的参数,暂时没有用武之地
109
+ chatbot 聊天显示框的句柄,用于显示给用户
110
+ history 聊天历史,前情提要
111
+ system_prompt 给gpt的静默提醒
112
+ web_port 当前软件运行的端口号
113
+ """
114
+
115
+ import glob, os
116
+ local_history = "<br/>".join(["`"+hide_cwd(f)+"`" for f in glob.glob(f'gpt_log/**/chatGPT对话历史*.html', recursive=True)])
117
+ for f in glob.glob(f'gpt_log/**/chatGPT对话历史*.html', recursive=True):
118
+ os.remove(f)
119
+ chatbot.append([f"删除所有历史对话文件", f"已删除<br/>{local_history}"])
120
+ yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
121
+ return
122
+
123
+
toolbox.py CHANGED
@@ -90,8 +90,9 @@ def CatchException(f):
90
  from toolbox import get_conf
91
  proxies, = get_conf('proxies')
92
  tb_str = '```\n' + trimmed_format_exc() + '```'
93
- if chatbot is None or len(chatbot) == 0:
94
- chatbot = [["插件调度异常", "异常原因"]]
 
95
  chatbot[-1] = (chatbot[-1][0],
96
  f"[Local Message] 实验性函数调用出错: \n\n{tb_str} \n\n当前代理可用性: \n\n{check_proxy(proxies)}")
97
  yield from update_ui(chatbot=chatbot, history=history, msg=f'异常 {e}') # 刷新界面
 
90
  from toolbox import get_conf
91
  proxies, = get_conf('proxies')
92
  tb_str = '```\n' + trimmed_format_exc() + '```'
93
+ if len(chatbot) == 0:
94
+ chatbot.clear()
95
+ chatbot.append(["插件调度异常", "异常原因"])
96
  chatbot[-1] = (chatbot[-1][0],
97
  f"[Local Message] 实验性函数调用出错: \n\n{tb_str} \n\n当前代理可用性: \n\n{check_proxy(proxies)}")
98
  yield from update_ui(chatbot=chatbot, history=history, msg=f'异常 {e}') # 刷新界面