diff --git a/__main__.py b/__main__.py
index 45a9015..0bd14c4 100644
--- a/__main__.py
+++ b/__main__.py
@@ -340,8 +340,8 @@ class ChatBot(ChatBotFrame):
if not crazy_fns[k].get("AsButton", True): continue
self.click_handle = crazy_fns[k]["Button"].click(**self.clear_agrs).then(
ArgsGeneralWrapper(crazy_fns[k]["Function"]), [*self.input_combo, gr.State(PORT)], self.output_combo)
- self.click_handle.then(on_report_generated, [self.file_upload, self.chatbot],
- [self.file_upload, self.chatbot])
+ self.click_handle.then(on_report_generated, [self.cookies, self.file_upload, self.chatbot],
+ [self.cookies, self.file_upload, self.chatbot])
# self.click_handle.then(fn=lambda x: '', inputs=[], outputs=self.txt)
self.cancel_handles.append(self.click_handle)
@@ -373,7 +373,7 @@ class ChatBot(ChatBotFrame):
yield from ArgsGeneralWrapper(crazy_fns[k]["Function"])(*args, **kwargs)
self.click_handle = self.switchy_bt.click(**self.clear_agrs).then(route, [self.switchy_bt, *self.input_combo, gr.State(PORT)], self.output_combo)
- self.click_handle.then(on_report_generated, [self.file_upload, self.chatbot], [self.file_upload, self.chatbot])
+ self.click_handle.then(on_report_generated, [self.cookies, self.file_upload, self.chatbot], [self.file_upload, self.chatbot])
self.cancel_handles.append(self.click_handle)
# 终止按钮的回调函数注册
self.stopBtn.click(fn=None, inputs=None, outputs=None, cancels=self.cancel_handles)
diff --git a/config.py b/config.py
index 1650cce..6a53870 100644
--- a/config.py
+++ b/config.py
@@ -19,8 +19,6 @@ AZURE_API_KEY = "填入azure openai api的密钥"
AZURE_API_VERSION = "填入api版本"
AZURE_ENGINE = "填入ENGINE"
-
-
# [step 2]>> 改为True应用代理,如果直接在海外服务器部署,此处不修改
USE_PROXY = False
diff --git a/core_functional.py b/core_functional.py
index ab1600d..61df804 100644
--- a/core_functional.py
+++ b/core_functional.py
@@ -63,6 +63,7 @@ def get_core_functions():
"Prefix": r"我需要你找一张网络图片。使用Unsplash API(https://source.unsplash.com/960x640/?<英语关键词>)获取图片URL," +
r"然后请使用Markdown格式封装,并且不要有反斜线,不要用代码块。现在,请按以下描述给我发送图片:" + "\n",
"Suffix": r"",
+ "Visible": False,
},
"解释代码": {
"Prefix": r"请解释以下代码:" + "\n```\n",
@@ -73,7 +74,6 @@ def get_core_functions():
r"Note that, reference styles maybe more than one kind, you should transform each item correctly." +
r"Items need to be transformed:",
"Suffix": r"",
- "Visible": False,
}
}
diff --git a/crazy_functional.py b/crazy_functional.py
index 9e978ac..c536e82 100644
--- a/crazy_functional.py
+++ b/crazy_functional.py
@@ -223,15 +223,93 @@ def get_crazy_functions():
###################### 第三组插件 ###########################
# [第三组插件]: 尚未充分测试的函数插件
+ try:
+ from crazy_functions.下载arxiv论文翻译摘要 import 下载arxiv论文并翻译摘要
+ function_plugins.update({
+ "一键下载arxiv论文并翻译摘要(先在input输入编号,如1812.10695)": {
+ "Color": "stop",
+ "AsButton": False, # 加入下拉菜单中
+ "Function": HotReload(下载arxiv论文并翻译摘要)
+ }
+ })
+ except:
+ print('Load function plugin failed')
- from crazy_functions.联网的ChatGPT import 连接网络回答问题
- function_plugins.update({
- "连接网络回答问题": {
- "Color": "primary",
- "AsButton": True, # 加入下拉菜单中
- "Function": HotReload(连接网络回答问题)
- }
- })
+ try:
+ from crazy_functions.联网的ChatGPT import 连接网络回答问题
+ function_plugins.update({
+ "连接网络回答问题(输入问题后点击该插件,需要访问谷歌)": {
+ "Color": "stop",
+ "AsButton": False, # 加入下拉菜单中
+ "Function": HotReload(连接网络回答问题)
+ }
+ })
+ from crazy_functions.联网的ChatGPT_bing版 import 连接bing搜索回答问题
+ function_plugins.update({
+ "连接网络回答问题(中文Bing版,输入问题后点击该插件)": {
+ "Color": "stop",
+ "AsButton": False, # 加入下拉菜单中
+ "Function": HotReload(连接bing搜索回答问题)
+ }
+ })
+ except:
+ print('Load function plugin failed')
+
+ try:
+ from crazy_functions.解析项目源代码 import 解析任意code项目
+ function_plugins.update({
+ "解析项目源代码(手动指定和筛选源代码文件类型)": {
+ "Color": "stop",
+ "AsButton": False,
+ "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False)
+ "ArgsReminder": "输入时用逗号隔开, *代表通配符, 加了^代表不匹配; 不输入代表全部匹配。例如: \"*.c, ^*.cpp, config.toml, ^*.toml\"", # 高级参数输入区的显示提示
+ "Function": HotReload(解析任意code项目)
+ },
+ })
+ except:
+ print('Load function plugin failed')
+
+ try:
+ from crazy_functions.询问多个大语言模型 import 同时问询_指定模型
+ function_plugins.update({
+ "询问多个GPT模型(手动指定询问哪些模型)": {
+ "Color": "stop",
+ "AsButton": False,
+ "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False)
+ "ArgsReminder": "支持任意数量的llm接口,用&符号分隔。例如chatglm&gpt-3.5-turbo&api2d-gpt-4", # 高级参数输入区的显示提示
+ "Function": HotReload(同时问询_指定模型)
+ },
+ })
+ except:
+ print('Load function plugin failed')
+
+ try:
+ from crazy_functions.图片生成 import 图片生成
+ function_plugins.update({
+ "图片生成(先切换模型到openai或api2d)": {
+ "Color": "stop",
+ "AsButton": False,
+ "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False)
+ "ArgsReminder": "在这里输入分辨率, 如256x256(默认)", # 高级参数输入区的显示提示
+ "Function": HotReload(图片生成)
+ },
+ })
+ except:
+ print('Load function plugin failed')
+
+ try:
+ from crazy_functions.总结音视频 import 总结音视频
+ function_plugins.update({
+ "批量总结音视频(输入路径或上传压缩包)": {
+ "Color": "stop",
+ "AsButton": False,
+ "AdvancedArgs": True,
+ "ArgsReminder": "调用openai api 使用whisper-1模型, 目前支持的格式:mp4, m4a, wav, mpga, mpeg, mp3。此处可以输入解析提示,例如:解析为简体中文(默认)。",
+ "Function": HotReload(总结音视频)
+ }
+ })
+ except:
+ print('Load function plugin failed')
from crazy_functions.解析项目源代码 import 解析任意code项目
function_plugins.update({
@@ -330,25 +408,52 @@ def get_crazy_functions():
try:
from crazy_functions.Latex输出PDF结果 import Latex英文纠错加PDF对比
function_plugins.update({
- "[功能尚不稳定] Latex英文纠错+LatexDiff高亮修正位置": {
- "Color": "primary",
+ "Latex英文纠错+高亮修正位置 [需Latex]": {
+ "Color": "stop",
"AsButton": False,
- # "AdvancedArgs": True,
- # "ArgsReminder": "",
+ "AdvancedArgs": True,
+ "ArgsReminder": "如果有必要, 请在此处追加更细致的矫错指令(使用英文)。",
"Function": HotReload(Latex英文纠错加PDF对比)
}
})
from crazy_functions.Latex输出PDF结果 import Latex翻译中文并重新编译PDF
function_plugins.update({
- "[功能尚不稳定] Latex翻译/Arixv翻译+重构PDF": {
- "Color": "primary",
+ "Arixv翻译(输入arxivID)[需Latex]": {
+ "Color": "stop",
"AsButton": False,
- # "AdvancedArgs": True,
- # "ArgsReminder": "",
+ "AdvancedArgs": True,
+ "ArgsReminder":
+ "如果有必要, 请在此处给出自定义翻译命令, 解决部分词汇翻译不准确的问题。 "+
+ "例如当单词'agent'翻译不准确时, 请尝试把以下指令复制到高级参数区: " + 'If the term "agent" is used in this section, it should be translated to "智能体". ',
+ "Function": HotReload(Latex翻译中文并重新编译PDF)
+ }
+ })
+ function_plugins.update({
+ "本地论文翻译(上传Latex压缩包)[需Latex]": {
+ "Color": "stop",
+ "AsButton": False,
+ "AdvancedArgs": True,
+ "ArgsReminder":
+ "如果有必要, 请在此处给出自定义翻译命令, 解决部分词汇翻译不准确的问题。 "+
+ "例如当单词'agent'翻译不准确时, 请尝试把以下指令复制到高级参数区: " + 'If the term "agent" is used in this section, it should be translated to "智能体". ',
"Function": HotReload(Latex翻译中文并重新编译PDF)
}
})
except:
print('Load function plugin failed')
- ###################### 第n组插件 ###########################
+
+ # try:
+ # from crazy_functions.虚空终端 import 终端
+ # function_plugins.update({
+ # "超级终端": {
+ # "Color": "stop",
+ # "AsButton": False,
+ # # "AdvancedArgs": True,
+ # # "ArgsReminder": "",
+ # "Function": HotReload(终端)
+ # }
+ # })
+ # except:
+ # print('Load function plugin failed')
+
return function_plugins
diff --git a/crazy_functions/Latex输出PDF结果.py b/crazy_functions/Latex输出PDF结果.py
index 4f19967..810d802 100644
--- a/crazy_functions/Latex输出PDF结果.py
+++ b/crazy_functions/Latex输出PDF结果.py
@@ -19,9 +19,9 @@ def switch_prompt(pfg, mode, more_requirement):
- sys_prompt_array: A list of strings containing prompts for system prompts.
"""
n_split = len(pfg.sp_file_contents)
- if mode == 'proofread':
+ if mode == 'proofread_en':
inputs_array = [r"Below is a section from an academic paper, proofread this section." +
- r"Do not modify any latex command such as \section, \cite, \begin, \item and equations. " +
+ r"Do not modify any latex command such as \section, \cite, \begin, \item and equations. " + more_requirement +
r"Answer me only with the revised text:" +
f"\n\n{frag}" for frag in pfg.sp_file_contents]
sys_prompt_array = ["You are a professional academic paper writer." for _ in range(n_split)]
@@ -70,6 +70,12 @@ def move_project(project_folder, arxiv_id=None):
shutil.rmtree(new_workfolder)
except:
pass
+
+ # align subfolder if there is a folder wrapper
+ items = glob.glob(pj(project_folder,'*'))
+ if len(glob.glob(pj(project_folder,'*.tex'))) == 0 and len(items) == 1:
+ if os.path.isdir(items[0]): project_folder = items[0]
+
shutil.copytree(src=project_folder, dst=new_workfolder)
return new_workfolder
@@ -90,7 +96,7 @@ def arxiv_download(chatbot, history, txt):
except ValueError:
return False
if ('.' in txt) and ('/' not in txt) and is_float(txt): # is arxiv ID
- txt = 'https://arxiv.org/abs/' + txt
+ txt = 'https://arxiv.org/abs/' + txt.strip()
if ('.' in txt) and ('/' not in txt) and is_float(txt[:10]): # is arxiv ID
txt = 'https://arxiv.org/abs/' + txt[:10]
if not txt.startswith('https://arxiv.org'):
@@ -141,7 +147,11 @@ def Latex英文纠错加PDF对比(txt, llm_kwargs, plugin_kwargs, chatbot, histo
chatbot.append([ "函数插件功能?",
"对整个Latex项目进行纠错, 用latex编译为PDF对修正处做高亮。函数插件贡献者: Binary-Husky。注意事项: 目前仅支持GPT3.5/GPT4,其他模型转化效果未知。目前对机器学习类文献转化效果最好,其他类型文献转化效果未知。仅在Windows系统进行了测试,其他操作系统表现未知。"])
yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
-
+
+ # <-------------- more requirements ------------->
+ if ("advanced_arg" in plugin_kwargs) and (plugin_kwargs["advanced_arg"] == ""): plugin_kwargs.pop("advanced_arg")
+ more_req = plugin_kwargs.get("advanced_arg", "")
+ _switch_prompt_ = partial(switch_prompt, more_requirement=more_req)
# <-------------- check deps ------------->
try:
@@ -180,13 +190,13 @@ def Latex英文纠错加PDF对比(txt, llm_kwargs, plugin_kwargs, chatbot, histo
# <-------------- if merge_translate_zh is already generated, skip gpt req ------------->
- if not os.path.exists(project_folder + '/merge_proofread.tex'):
+ if not os.path.exists(project_folder + '/merge_proofread_en.tex'):
yield from Latex精细分解与转化(file_manifest, project_folder, llm_kwargs, plugin_kwargs,
- chatbot, history, system_prompt, mode='proofread_latex', switch_prompt=switch_prompt)
+ chatbot, history, system_prompt, mode='proofread_en', switch_prompt=_switch_prompt_)
# <-------------- compile PDF ------------->
- success = yield from 编译Latex(chatbot, history, main_file_original='merge', main_file_modified='merge_proofread',
+ success = yield from 编译Latex(chatbot, history, main_file_original='merge', main_file_modified='merge_proofread_en',
work_folder_original=project_folder, work_folder_modified=project_folder, work_folder=project_folder)
@@ -195,6 +205,7 @@ def Latex英文纠错加PDF对比(txt, llm_kwargs, plugin_kwargs, chatbot, histo
if success:
chatbot.append((f"成功啦", '请查收结果(压缩包)...'))
yield from update_ui(chatbot=chatbot, history=history); time.sleep(1) # 刷新界面
+ promote_file_to_downloadzone(file=zip_res, chatbot=chatbot)
else:
chatbot.append((f"失败了", '虽然PDF生成失败了, 但请查收结果(压缩包), 内含已经翻译的Tex文档, 也是可读的, 您可以到Github Issue区, 用该压缩包+对话历史存档进行反馈 ...'))
yield from update_ui(chatbot=chatbot, history=history); time.sleep(1) # 刷新界面
@@ -278,6 +289,7 @@ def Latex翻译中文并重新编译PDF(txt, llm_kwargs, plugin_kwargs, chatbot,
if success:
chatbot.append((f"成功啦", '请查收结果(压缩包)...'))
yield from update_ui(chatbot=chatbot, history=history); time.sleep(1) # 刷新界面
+ promote_file_to_downloadzone(file=zip_res, chatbot=chatbot)
else:
chatbot.append((f"失败了", '虽然PDF生成失败了, 但请查收结果(压缩包), 内含已经翻译的Tex文档, 也是可读的, 您可以到Github Issue区, 用该压缩包+对话历史存档进行反馈 ...'))
yield from update_ui(chatbot=chatbot, history=history); time.sleep(1) # 刷新界面
diff --git a/crazy_functions/crazy_functions_test.py b/crazy_functions/crazy_functions_test.py
index 3ef555d..60b6b87 100644
--- a/crazy_functions/crazy_functions_test.py
+++ b/crazy_functions/crazy_functions_test.py
@@ -192,7 +192,10 @@ def test_Latex():
# txt = r"https://arxiv.org/abs/2306.07831"
# txt = r"https://arxiv.org/abs/2212.10156"
# txt = r"https://arxiv.org/abs/2211.11559"
- txt = r"https://arxiv.org/abs/2303.08774"
+ # txt = r"https://arxiv.org/abs/2303.08774"
+ # txt = r"https://arxiv.org/abs/2303.12712"
+ # txt = r"C:\Users\fuqingxu\arxiv_cache\2303.12712\workfolder"
+ txt = r"C:\Users\fuqingxu\Desktop\9"
for cookies, cb, hist, msg in (Latex翻译中文并重新编译PDF)(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
diff --git a/crazy_functions/latex_utils.py b/crazy_functions/latex_utils.py
index 3e4f37c..b3cac58 100644
--- a/crazy_functions/latex_utils.py
+++ b/crazy_functions/latex_utils.py
@@ -8,24 +8,49 @@ pj = os.path.join
"""
========================================================================
Part One
-Latex segmentation to a linklist
+Latex segmentation with a binary mask (PRESERVE=0, TRANSFORM=1)
========================================================================
"""
PRESERVE = 0
TRANSFORM = 1
-def split_worker(text, mask, pattern, flags=0):
+def set_forbidden_text(text, mask, pattern, flags=0):
"""
Add a preserve text area in this paper
+ e.g. with pattern = r"\\begin\{algorithm\}(.*?)\\end\{algorithm\}"
+ you can mask out (mask = PRESERVE so that text become untouchable for GPT)
+ everything between "\begin{equation}" and "\end{equation}"
"""
+ if isinstance(pattern, list): pattern = '|'.join(pattern)
pattern_compile = re.compile(pattern, flags)
for res in pattern_compile.finditer(text):
mask[res.span()[0]:res.span()[1]] = PRESERVE
return text, mask
-def split_worker_careful_brace(text, mask, pattern, flags=0):
+def reverse_forbidden_text(text, mask, pattern, flags=0, forbid_wrapper=True):
"""
- Move area into preserve area
+ Move area out of preserve area (make text editable for GPT)
+ count the number of the braces so as to catch compelete text area.
+ e.g.
+ \begin{abstract} blablablablablabla. \end{abstract}
+ """
+ if isinstance(pattern, list): pattern = '|'.join(pattern)
+ pattern_compile = re.compile(pattern, flags)
+ for res in pattern_compile.finditer(text):
+ if not forbid_wrapper:
+ mask[res.span()[0]:res.span()[1]] = TRANSFORM
+ else:
+ mask[res.regs[0][0]: res.regs[1][0]] = PRESERVE # '\\begin{abstract}'
+ mask[res.regs[1][0]: res.regs[1][1]] = TRANSFORM # abstract
+ mask[res.regs[1][1]: res.regs[0][1]] = PRESERVE # abstract
+ return text, mask
+
+def set_forbidden_text_careful_brace(text, mask, pattern, flags=0):
+ """
+ Add a preserve text area in this paper (text become untouchable for GPT).
+ count the number of the braces so as to catch compelete text area.
+ e.g.
+ \caption{blablablablabla\texbf{blablabla}blablabla.}
"""
pattern_compile = re.compile(pattern, flags)
for res in pattern_compile.finditer(text):
@@ -40,9 +65,12 @@ def split_worker_careful_brace(text, mask, pattern, flags=0):
mask[begin:end] = PRESERVE
return text, mask
-def split_worker_reverse_careful_brace(text, mask, pattern, flags=0):
+def reverse_forbidden_text_careful_brace(text, mask, pattern, flags=0, forbid_wrapper=True):
"""
- Move area out of preserve area
+ Move area out of preserve area (make text editable for GPT)
+ count the number of the braces so as to catch compelete text area.
+ e.g.
+ \caption{blablablablabla\texbf{blablabla}blablabla.}
"""
pattern_compile = re.compile(pattern, flags)
for res in pattern_compile.finditer(text):
@@ -55,9 +83,12 @@ def split_worker_reverse_careful_brace(text, mask, pattern, flags=0):
p += 1
end = p
mask[begin:end] = TRANSFORM
+ if forbid_wrapper:
+ mask[res.regs[0][0]:begin] = PRESERVE
+ mask[end:res.regs[0][1]] = PRESERVE
return text, mask
-def split_worker_begin_end(text, mask, pattern, flags=0, limit_n_lines=42):
+def set_forbidden_text_begin_end(text, mask, pattern, flags=0, limit_n_lines=42):
"""
Find all \begin{} ... \end{} text block that with less than limit_n_lines lines.
Add it to preserve area
@@ -154,6 +185,7 @@ def rm_comments(main_file):
else:
new_file_remove_comment_lines.append(l)
main_file = '\n'.join(new_file_remove_comment_lines)
+ # main_file = re.sub(r"\\include{(.*?)}", r"\\input{\1}", main_file) # 将 \include 命令转换为 \input 命令
main_file = re.sub(r'(? None:
self.nodes = None
- self.msg = "{\\scriptsize\\textbf{警告:该PDF由GPT-Academic开源项目调用大语言模型+Latex翻译插件一键生成," + \
+ self.msg = "*{\\scriptsize\\textbf{警告:该PDF由GPT-Academic开源项目调用大语言模型+Latex翻译插件一键生成," + \
"版权归原文作者所有。翻译内容可靠性无保障,请仔细鉴别并以原文为准。" + \
"项目Github地址 \\url{https://github.com/binary-husky/gpt_academic/}。"
# 请您不要删除或修改这行警告,除非您是论文的原作者(如果您是论文原作者,欢迎加REAME中的QQ联系开发者)
@@ -448,8 +470,14 @@ class LatexPaperSplit():
if mode == 'translate_zh':
pattern = re.compile(r'\\begin\{abstract\}.*\n')
match = pattern.search(result_string)
- assert match is not None, "Cannot find paper abstract section!"
- position = match.end()
+ if not match:
+ # match \abstract{xxxx}
+ pattern_compile = re.compile(r"\\abstract\{(.*?)\}", flags=re.DOTALL)
+ match = pattern_compile.search(result_string)
+ position = match.regs[1][0]
+ else:
+ # match \begin{abstract}xxxx\end{abstract}
+ position = match.end()
result_string = result_string[:position] + self.msg + msg + self.msg_declare + result_string[position:]
return result_string
@@ -468,6 +496,7 @@ class LatexPaperSplit():
args=(txt, project_folder, return_dict, opts))
p.start()
p.join()
+ p.close()
self.nodes = return_dict['nodes']
self.sp = return_dict['segment_parts_for_gpt']
return self.sp
@@ -522,11 +551,11 @@ class LatexPaperFileGroup():
f.write(res)
return manifest
-def write_html(sp_file_contents, sp_file_result, chatbot):
+def write_html(sp_file_contents, sp_file_result, chatbot, project_folder):
# write html
try:
- import copy
+ import shutil
from .crazy_utils import construct_html
from toolbox import gen_time_str
ch = construct_html()
@@ -544,6 +573,7 @@ def write_html(sp_file_contents, sp_file_result, chatbot):
ch.add_row(a=orig, b=trans)
create_report_file_name = f"{gen_time_str()}.trans.html"
ch.save_file(create_report_file_name)
+ shutil.copyfile(pj('./gpt_log/', create_report_file_name), pj(project_folder, create_report_file_name))
promote_file_to_downloadzone(file=f'./gpt_log/{create_report_file_name}', chatbot=chatbot)
except:
from toolbox import trimmed_format_exc
@@ -624,7 +654,8 @@ def Latex精细分解与转化(file_manifest, project_folder, llm_kwargs, plugin
pfg.get_token_num = None
objdump(pfg, file=pj(project_folder,'temp.pkl'))
- write_html(pfg.sp_file_contents, pfg.sp_file_result, chatbot=chatbot)
+ write_html(pfg.sp_file_contents, pfg.sp_file_result, chatbot=chatbot, project_folder=project_folder)
+
# <-------- 写出文件 ---------->
msg = f"当前大语言模型: {llm_kwargs['llm_model']},当前语言模型温度设定: {llm_kwargs['temperature']}。"
@@ -661,10 +692,9 @@ def remove_buggy_lines(file_path, log_path, tex_name, tex_name_pure, n_fix, work
print("Fatal error occurred, but we cannot identify error, please download zip, read latex log, and compile manually.")
return False, -1, [-1]
-
-def compile_latex_with_timeout(command, timeout=60):
+def compile_latex_with_timeout(command, cwd, timeout=60):
import subprocess
- process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd)
try:
stdout, stderr = process.communicate(timeout=timeout)
except subprocess.TimeoutExpired:
@@ -688,24 +718,24 @@ def 编译Latex(chatbot, history, main_file_original, main_file_modified, work_f
# https://stackoverflow.com/questions/738755/dont-make-me-manually-abort-a-latex-compile-when-theres-an-error
yield from update_ui_lastest_msg(f'尝试第 {n_fix}/{max_try} 次编译, 编译原始PDF ...', chatbot, history) # 刷新Gradio前端界面
- os.chdir(work_folder_original); ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_original}.tex'); os.chdir(current_dir)
+ ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_original}.tex', work_folder_original)
yield from update_ui_lastest_msg(f'尝试第 {n_fix}/{max_try} 次编译, 编译转化后的PDF ...', chatbot, history) # 刷新Gradio前端界面
- os.chdir(work_folder_modified); ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_modified}.tex'); os.chdir(current_dir)
+ ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_modified}.tex', work_folder_modified)
if ok and os.path.exists(pj(work_folder_modified, f'{main_file_modified}.pdf')):
# 只有第二步成功,才能继续下面的步骤
yield from update_ui_lastest_msg(f'尝试第 {n_fix}/{max_try} 次编译, 编译BibTex ...', chatbot, history) # 刷新Gradio前端界面
if not os.path.exists(pj(work_folder_original, f'{main_file_original}.bbl')):
- os.chdir(work_folder_original); ok = compile_latex_with_timeout(f'bibtex {main_file_original}.aux'); os.chdir(current_dir)
+ ok = compile_latex_with_timeout(f'bibtex {main_file_original}.aux', work_folder_original)
if not os.path.exists(pj(work_folder_modified, f'{main_file_modified}.bbl')):
- os.chdir(work_folder_modified); ok = compile_latex_with_timeout(f'bibtex {main_file_modified}.aux'); os.chdir(current_dir)
+ ok = compile_latex_with_timeout(f'bibtex {main_file_modified}.aux', work_folder_modified)
yield from update_ui_lastest_msg(f'尝试第 {n_fix}/{max_try} 次编译, 编译文献交叉引用 ...', chatbot, history) # 刷新Gradio前端界面
- os.chdir(work_folder_original); ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_original}.tex'); os.chdir(current_dir)
- os.chdir(work_folder_modified); ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_modified}.tex'); os.chdir(current_dir)
- os.chdir(work_folder_original); ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_original}.tex'); os.chdir(current_dir)
- os.chdir(work_folder_modified); ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_modified}.tex'); os.chdir(current_dir)
+ ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_original}.tex', work_folder_original)
+ ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_modified}.tex', work_folder_modified)
+ ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_original}.tex', work_folder_original)
+ ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error {main_file_modified}.tex', work_folder_modified)
if mode!='translate_zh':
yield from update_ui_lastest_msg(f'尝试第 {n_fix}/{max_try} 次编译, 使用latexdiff生成论文转化前后对比 ...', chatbot, history) # 刷新Gradio前端界面
@@ -713,13 +743,12 @@ def 编译Latex(chatbot, history, main_file_original, main_file_modified, work_f
ok = compile_latex_with_timeout(f'latexdiff --encoding=utf8 --append-safecmd=subfile {work_folder_original}/{main_file_original}.tex {work_folder_modified}/{main_file_modified}.tex --flatten > {work_folder}/merge_diff.tex')
yield from update_ui_lastest_msg(f'尝试第 {n_fix}/{max_try} 次编译, 正在编译对比PDF ...', chatbot, history) # 刷新Gradio前端界面
- os.chdir(work_folder); ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error merge_diff.tex'); os.chdir(current_dir)
- os.chdir(work_folder); ok = compile_latex_with_timeout(f'bibtex merge_diff.aux'); os.chdir(current_dir)
- os.chdir(work_folder); ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error merge_diff.tex'); os.chdir(current_dir)
- os.chdir(work_folder); ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error merge_diff.tex'); os.chdir(current_dir)
- # <--------------------->
- os.chdir(current_dir)
+ ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error merge_diff.tex', work_folder)
+ ok = compile_latex_with_timeout(f'bibtex merge_diff.aux', work_folder)
+ ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error merge_diff.tex', work_folder)
+ ok = compile_latex_with_timeout(f'pdflatex -interaction=batchmode -file-line-error merge_diff.tex', work_folder)
+
# <---------- 检查结果 ----------->
results_ = ""
@@ -731,13 +760,16 @@ def 编译Latex(chatbot, history, main_file_original, main_file_modified, work_f
results_ += f"对比PDF编译是否成功: {diff_pdf_success};"
yield from update_ui_lastest_msg(f'第{n_fix}编译结束:
{results_}...', chatbot, history) # 刷新Gradio前端界面
+ if diff_pdf_success:
+ result_pdf = pj(work_folder_modified, f'merge_diff.pdf') # get pdf path
+ promote_file_to_downloadzone(result_pdf, rename_file=None, chatbot=chatbot) # promote file to web UI
if modified_pdf_success:
yield from update_ui_lastest_msg(f'转化PDF编译已经成功, 即将退出 ...', chatbot, history) # 刷新Gradio前端界面
- os.chdir(current_dir)
- result_pdf = pj(work_folder_modified, f'{main_file_modified}.pdf')
+ result_pdf = pj(work_folder_modified, f'{main_file_modified}.pdf') # get pdf path
if os.path.exists(pj(work_folder, '..', 'translation')):
shutil.copyfile(result_pdf, pj(work_folder, '..', 'translation', 'translate_zh.pdf'))
- promote_file_to_downloadzone(result_pdf, rename_file=None, chatbot=chatbot)
+
+ promote_file_to_downloadzone(result_pdf, rename_file=None, chatbot=chatbot) # promote file to web UI
return True # 成功啦
else:
if n_fix>=max_try: break
@@ -753,7 +785,6 @@ def 编译Latex(chatbot, history, main_file_original, main_file_modified, work_f
yield from update_ui_lastest_msg(f'由于最为关键的转化PDF编译失败, 将根据报错信息修正tex源文件并重试, 当前报错的latex代码处于第{buggy_lines}行 ...', chatbot, history) # 刷新Gradio前端界面
if not can_retry: break
- os.chdir(current_dir)
return False # 失败啦
diff --git a/crazy_functions/批量翻译PDF文档_多线程.py b/crazy_functions/批量翻译PDF文档_多线程.py
index 06d8a5a..0adac96 100644
--- a/crazy_functions/批量翻译PDF文档_多线程.py
+++ b/crazy_functions/批量翻译PDF文档_多线程.py
@@ -1,5 +1,5 @@
from toolbox import CatchException, report_execption, write_results_to_file
-from toolbox import update_ui
+from toolbox import update_ui, promote_file_to_downloadzone
from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
from .crazy_utils import request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency
from .crazy_utils import read_and_clean_pdf_text
@@ -147,23 +147,14 @@ def 解析PDF(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot,
print('writing html result failed:', trimmed_format_exc())
# 准备文件的下载
- import shutil
for pdf_path in generated_conclusion_files:
# 重命名文件
- rename_file = f'./gpt_log/翻译-{os.path.basename(pdf_path)}'
- if os.path.exists(rename_file):
- os.remove(rename_file)
- shutil.copyfile(pdf_path, rename_file)
- if os.path.exists(pdf_path):
- os.remove(pdf_path)
+ rename_file = f'翻译-{os.path.basename(pdf_path)}'
+ promote_file_to_downloadzone(pdf_path, rename_file=rename_file, chatbot=chatbot)
for html_path in generated_html_files:
# 重命名文件
- rename_file = f'./gpt_log/翻译-{os.path.basename(html_path)}'
- if os.path.exists(rename_file):
- os.remove(rename_file)
- shutil.copyfile(html_path, rename_file)
- if os.path.exists(html_path):
- os.remove(html_path)
+ rename_file = f'翻译-{os.path.basename(html_path)}'
+ promote_file_to_downloadzone(html_path, rename_file=rename_file, chatbot=chatbot)
chatbot.append(("给出输出文件清单", str(generated_conclusion_files + generated_html_files)))
yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
diff --git a/crazy_functions/理解PDF文档内容.py b/crazy_functions/理解PDF文档内容.py
index c0b8266..4cc6387 100644
--- a/crazy_functions/理解PDF文档内容.py
+++ b/crazy_functions/理解PDF文档内容.py
@@ -13,7 +13,9 @@ def 解析PDF(file_name, llm_kwargs, plugin_kwargs, chatbot, history, system_pro
# 递归地切割PDF文件,每一块(尽量是完整的一个section,比如introduction,experiment等,必要时再进行切割)
# 的长度必须小于 2500 个 Token
file_content, page_one = read_and_clean_pdf_text(file_name) # (尝试)按照章节切割PDF
-
+ file_content = file_content.encode('utf-8', 'ignore').decode() # avoid reading non-utf8 chars
+ page_one = str(page_one).encode('utf-8', 'ignore').decode() # avoid reading non-utf8 chars
+
TOKEN_LIMIT_PER_FRAGMENT = 2500
from .crazy_utils import breakdown_txt_to_satisfy_token_limit_for_pdf
diff --git a/crazy_functions/联网的ChatGPT_bing版.py b/crazy_functions/联网的ChatGPT_bing版.py
new file mode 100644
index 0000000..93a84a0
--- /dev/null
+++ b/crazy_functions/联网的ChatGPT_bing版.py
@@ -0,0 +1,102 @@
+from toolbox import CatchException, update_ui
+from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive, input_clipping
+import requests
+from bs4 import BeautifulSoup
+from request_llm.bridge_all import model_info
+
+
+def bing_search(query, proxies=None):
+ query = query
+ url = f"https://cn.bing.com/search?q={query}"
+ headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'}
+ response = requests.get(url, headers=headers, proxies=proxies)
+ soup = BeautifulSoup(response.content, 'html.parser')
+ results = []
+ for g in soup.find_all('li', class_='b_algo'):
+ anchors = g.find_all('a')
+ if anchors:
+ link = anchors[0]['href']
+ if not link.startswith('http'):
+ continue
+ title = g.find('h2').text
+ item = {'title': title, 'link': link}
+ results.append(item)
+
+ for r in results:
+ print(r['link'])
+ return results
+
+
+def scrape_text(url, proxies) -> str:
+ """Scrape text from a webpage
+
+ Args:
+ url (str): The URL to scrape text from
+
+ Returns:
+ str: The scraped text
+ """
+ headers = {
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
+ 'Content-Type': 'text/plain',
+ }
+ try:
+ response = requests.get(url, headers=headers, proxies=proxies, timeout=8)
+ if response.encoding == "ISO-8859-1": response.encoding = response.apparent_encoding
+ except:
+ return "无法连接到该网页"
+ soup = BeautifulSoup(response.text, "html.parser")
+ for script in soup(["script", "style"]):
+ script.extract()
+ text = soup.get_text()
+ lines = (line.strip() for line in text.splitlines())
+ chunks = (phrase.strip() for line in lines for phrase in line.split(" "))
+ text = "\n".join(chunk for chunk in chunks if chunk)
+ return text
+
+@CatchException
+def 连接bing搜索回答问题(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
+ """
+ txt 输入栏用户输入的文本,例如需要翻译的一段话,再例如一个包含了待处理文件的路径
+ llm_kwargs gpt模型参数,如温度和top_p等,一般原样传递下去就行
+ plugin_kwargs 插件模型的参数,暂时没有用武之地
+ chatbot 聊天显示框的句柄,用于显示给用户
+ history 聊天历史,前情提要
+ system_prompt 给gpt的静默提醒
+ web_port 当前软件运行的端口号
+ """
+ history = [] # 清空历史,以免输入溢出
+ chatbot.append((f"请结合互联网信息回答以下问题:{txt}",
+ "[Local Message] 请注意,您正在调用一个[函数插件]的模板,该模板可以实现ChatGPT联网信息综合。该函数面向希望实现更多有趣功能的开发者,它可以作为创建新功能函数的模板。您若希望分享新的功能模组,请不吝PR!"))
+ yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 # 由于请求gpt需要一段时间,我们先及时地做一次界面更新
+
+ # ------------- < 第1步:爬取搜索引擎的结果 > -------------
+ from toolbox import get_conf
+ proxies, = get_conf('proxies')
+ urls = bing_search(txt, proxies)
+ history = []
+
+ # ------------- < 第2步:依次访问网页 > -------------
+ max_search_result = 8 # 最多收纳多少个网页的结果
+ for index, url in enumerate(urls[:max_search_result]):
+ res = scrape_text(url['link'], proxies)
+ history.extend([f"第{index}份搜索结果:", res])
+ chatbot.append([f"第{index}份搜索结果:", res[:500]+"......"])
+ yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 # 由于请求gpt需要一段时间,我们先及时地做一次界面更新
+
+ # ------------- < 第3步:ChatGPT综合 > -------------
+ i_say = f"从以上搜索结果中抽取信息,然后回答问题:{txt}"
+ i_say, history = input_clipping( # 裁剪输入,从最长的条目开始裁剪,防止爆token
+ inputs=i_say,
+ history=history,
+ max_token_limit=model_info[llm_kwargs['llm_model']]['max_token']*3//4
+ )
+ gpt_say = yield from request_gpt_model_in_new_thread_with_ui_alive(
+ inputs=i_say, inputs_show_user=i_say,
+ llm_kwargs=llm_kwargs, chatbot=chatbot, history=history,
+ sys_prompt="请从给定的若干条搜索结果中抽取信息,对最相关的两个搜索结果进行总结,然后回答问题。"
+ )
+ chatbot[-1] = (i_say, gpt_say)
+ history.append(i_say);history.append(gpt_say)
+ yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 # 界面更新
+
diff --git a/crazy_functions/高级功能函数模板.py b/crazy_functions/高级功能函数模板.py
index 7c6a7ff..73ae45f 100644
--- a/crazy_functions/高级功能函数模板.py
+++ b/crazy_functions/高级功能函数模板.py
@@ -1,6 +1,7 @@
from toolbox import CatchException, update_ui
from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
-import datetime
+import datetime, re
+
@CatchException
def 高阶功能模板函数(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
"""
@@ -18,12 +19,34 @@ def 高阶功能模板函数(txt, llm_kwargs, plugin_kwargs, chatbot, history, s
for i in range(5):
currentMonth = (datetime.date.today() + datetime.timedelta(days=i)).month
currentDay = (datetime.date.today() + datetime.timedelta(days=i)).day
- i_say = f'历史中哪些事件发生在{currentMonth}月{currentDay}日?列举两条并发送相关图片。发送图片时,请使用Markdown,将Unsplash API中的PUT_YOUR_QUERY_HERE替换成描述该事件的一个最重要的单词。'
+ i_say = f'历史中哪些事件发生在{currentMonth}月{currentDay}日?用中文列举两条,然后分别给出描述事件的两个英文单词。' + '当你给出关键词时,使用以下json格式:{"KeyWords":[EnglishKeyWord1,EnglishKeyWord2]}。'
gpt_say = yield from request_gpt_model_in_new_thread_with_ui_alive(
inputs=i_say, inputs_show_user=i_say,
llm_kwargs=llm_kwargs, chatbot=chatbot, history=[],
- sys_prompt="当你想发送一张照片时,请使用Markdown, 并且不要有反斜线, 不要用代码块。使用 Unsplash API (https://source.unsplash.com/1280x720/? < PUT_YOUR_QUERY_HERE >)。"
+ sys_prompt='输出格式示例:1908年,美国消防救援事业发展的“美国消防协会”成立。关键词:{"KeyWords":["Fire","American"]}。'
)
+ gpt_say = get_images(gpt_say)
chatbot[-1] = (i_say, gpt_say)
history.append(i_say);history.append(gpt_say)
yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 # 界面更新
+
+
+def get_images(gpt_say):
+ def get_image_by_keyword(keyword):
+ import requests
+ from bs4 import BeautifulSoup
+ response = requests.get(f'https://wallhaven.cc/search?q={keyword}', timeout=2)
+ for image_element in BeautifulSoup(response.content, 'html.parser').findAll("img"):
+ if "data-src" in image_element: break
+ return image_element["data-src"]
+
+ for keywords in re.findall('{"KeyWords":\[(.*?)\]}', gpt_say):
+ keywords = [n.strip('"') for n in keywords.split(',')]
+ try:
+ description = keywords[0]
+ url = get_image_by_keyword(keywords[0])
+ img_tag = f"\n\n"
+ gpt_say += img_tag
+ except:
+ continue
+ return gpt_say
\ No newline at end of file
diff --git a/main.py b/main.py
index b684c27..b2e3c38 100644
--- a/main.py
+++ b/main.py
@@ -104,7 +104,7 @@ def main():
system_prompt = gr.Textbox(show_label=True, placeholder=f"System Prompt", label="System prompt", value=initial_prompt)
top_p = gr.Slider(minimum=-0, maximum=1.0, value=1.0, step=0.01,interactive=True, label="Top-p (nucleus sampling)",)
temperature = gr.Slider(minimum=-0, maximum=2.0, value=1.0, step=0.01, interactive=True, label="Temperature",)
- max_length_sl = gr.Slider(minimum=256, maximum=4096, value=512, step=1, interactive=True, label="Local LLM MaxLength",)
+ max_length_sl = gr.Slider(minimum=256, maximum=8192, value=4096, step=1, interactive=True, label="Local LLM MaxLength",)
checkboxes = gr.CheckboxGroup(["基础功能区", "函数插件区", "底部输入区", "输入清除键", "插件参数区"], value=["基础功能区", "函数插件区"], label="显示/隐藏功能区")
md_dropdown = gr.Dropdown(AVAIL_LLM_MODELS, value=LLM_MODEL, label="更换LLM模型/请求源").style(container=False)
diff --git a/request_llm/bridge_all.py b/request_llm/bridge_all.py
index a56738c..d595ad5 100644
--- a/request_llm/bridge_all.py
+++ b/request_llm/bridge_all.py
@@ -19,6 +19,9 @@ from request_llm.bridge_chatgpt import predict as chatgpt_ui
from .bridge_azure_test import predict_no_ui_long_connection as azure_noui
from .bridge_azure_test import predict as azure_ui
+from .bridge_azure_test import predict_no_ui_long_connection as azure_noui
+from .bridge_azure_test import predict as azure_ui
+
from .bridge_chatglm import predict_no_ui_long_connection as chatglm_noui
from .bridge_chatglm import predict as chatglm_ui
@@ -98,6 +101,24 @@ model_info = {
"token_cnt": get_token_num_gpt35,
},
+ "gpt-3.5-turbo-0613": {
+ "fn_with_ui": chatgpt_ui,
+ "fn_without_ui": chatgpt_noui,
+ "endpoint": openai_endpoint,
+ "max_token": 4096,
+ "tokenizer": tokenizer_gpt35,
+ "token_cnt": get_token_num_gpt35,
+ },
+
+ "gpt-3.5-turbo-16k-0613": {
+ "fn_with_ui": chatgpt_ui,
+ "fn_without_ui": chatgpt_noui,
+ "endpoint": openai_endpoint,
+ "max_token": 1024 * 16,
+ "tokenizer": tokenizer_gpt35,
+ "token_cnt": get_token_num_gpt35,
+ },
+
"gpt-4": {
"fn_with_ui": chatgpt_ui,
"fn_without_ui": chatgpt_noui,
@@ -116,6 +137,16 @@ model_info = {
"token_cnt": get_token_num_gpt35,
},
+ # azure openai
+ "azure-gpt35":{
+ "fn_with_ui": azure_ui,
+ "fn_without_ui": azure_noui,
+ "endpoint": get_conf("AZURE_ENDPOINT"),
+ "max_token": 4096,
+ "tokenizer": tokenizer_gpt35,
+ "token_cnt": get_token_num_gpt35,
+ },
+
# api_2d
"api2d-gpt-3.5-turbo": {
"fn_with_ui": chatgpt_ui,
@@ -135,7 +166,7 @@ model_info = {
"token_cnt": get_token_num_gpt35,
},
- # chatglm
+ # 将 chatglm 直接对齐到 chatglm2
"chatglm": {
"fn_with_ui": chatglm_ui,
"fn_without_ui": chatglm_noui,
@@ -144,6 +175,15 @@ model_info = {
"tokenizer": tokenizer_gpt35,
"token_cnt": get_token_num_gpt35,
},
+ "chatglm2": {
+ "fn_with_ui": chatglm_ui,
+ "fn_without_ui": chatglm_noui,
+ "endpoint": None,
+ "max_token": 1024,
+ "tokenizer": tokenizer_gpt35,
+ "token_cnt": get_token_num_gpt35,
+ },
+
# newbing
"newbing": {
"fn_with_ui": newbing_ui,
diff --git a/request_llm/bridge_chatglm.py b/request_llm/bridge_chatglm.py
index 100783d..deaacd2 100644
--- a/request_llm/bridge_chatglm.py
+++ b/request_llm/bridge_chatglm.py
@@ -40,12 +40,12 @@ class GetGLMHandle(Process):
while True:
try:
if self.chatglm_model is None:
- self.chatglm_tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
+ self.chatglm_tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
device, = get_conf('LOCAL_MODEL_DEVICE')
if device=='cpu':
- self.chatglm_model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).float()
+ self.chatglm_model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).float()
else:
- self.chatglm_model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
+ self.chatglm_model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).half().cuda()
self.chatglm_model = self.chatglm_model.eval()
break
else:
diff --git a/toolbox.py b/toolbox.py
index e5b21b8..262c67a 100644
--- a/toolbox.py
+++ b/toolbox.py
@@ -14,6 +14,7 @@ import glob
import sys
from concurrent.futures import ThreadPoolExecutor
############################### 插件输入输出接驳区 #######################################
+pj = os.path.join
"""
========================================================================
@@ -257,8 +258,6 @@ def report_execption(chatbot, history, a, b):
import re
-
-
def text_divide_paragraph(input_str):
if input_str:
code_blocks = re.findall(r'```[\s\S]*?```', input_str)
@@ -406,8 +405,11 @@ def format_io(self, y):
if y is None or y == []:
return []
i_ask, gpt_reply = y[-1]
- i_ask = text_divide_paragraph(i_ask) # 输入部分太自由,预处理一波
- gpt_reply = close_up_code_segment_during_stream(gpt_reply) # 当代码输出半截的时候,试着补上后个```
+ # 输入部分太自由,预处理一波
+ if i_ask is not None: i_ask = text_divide_paragraph(i_ask)
+ # 当代码输出半截的时候,试着补上后个```
+ if gpt_reply is not None: gpt_reply = close_up_code_segment_during_stream(gpt_reply)
+ # process
y[-1] = (
# None if i_ask is None else markdown.markdown(i_ask, extensions=['fenced_code', 'tables']),
None if i_ask is None else markdown_convertion(i_ask),
@@ -456,7 +458,7 @@ def extract_archive(file_path, dest_dir):
print("Successfully extracted rar archive to {}".format(dest_dir))
except:
print("Rar format requires additional dependencies to install")
- return '\n\n需要安装pip install rarfile来解压rar文件'
+ return '\n\n解压失败! 需要安装pip install rarfile来解压rar文件'
# 第三方库,需要预先pip install py7zr
elif file_extension == '.7z':
@@ -467,7 +469,7 @@ def extract_archive(file_path, dest_dir):
print("Successfully extracted 7z archive to {}".format(dest_dir))
except:
print("7z format requires additional dependencies to install")
- return '\n\n需要安装pip install py7zr来解压7z文件'
+ return '\n\n解压失败! 需要安装pip install py7zr来解压7z文件'
else:
return ''
return ''
@@ -496,13 +498,17 @@ def find_recent_files(directory):
return recent_files
-def promote_file_to_downloadzone(file, rename_file=None):
+def promote_file_to_downloadzone(file, rename_file=None, chatbot=None):
# 将文件复制一份到下载区
import shutil
if rename_file is None: rename_file = f'{gen_time_str()}-{os.path.basename(file)}'
new_path = os.path.join(f'./gpt_log/', rename_file)
- if os.path.exists(new_path): os.remove(new_path)
- shutil.copyfile(file, new_path)
+ if os.path.exists(new_path) and not os.path.samefile(new_path, file): os.remove(new_path)
+ if not os.path.exists(new_path): shutil.copyfile(file, new_path)
+ if chatbot:
+ if 'file_to_promote' in chatbot._cookies: current = chatbot._cookies['file_to_promote']
+ else: current = []
+ chatbot._cookies.update({'file_to_promote': [new_path] + current})
def get_user_upload(chatbot, ipaddr: gr.Request):
@@ -577,16 +583,20 @@ def on_file_uploaded(files, chatbot, txt, ipaddr: gr.Request):
return chatbot, txt
-def on_report_generated(files, chatbot):
+def on_report_generated(cookies, files, chatbot):
from toolbox import find_recent_files
- report_files = find_recent_files('gpt_log')
+ if 'file_to_promote' in cookies:
+ report_files = cookies['file_to_promote']
+ cookies.pop('file_to_promote')
+ else:
+ report_files = find_recent_files('gpt_log')
if len(report_files) == 0:
- return None, chatbot
+ return cookies, None, chatbot
# files.extend(report_files)
file_links = ''
for f in report_files: file_links += f'
{f}'
chatbot.append(['报告如何远程获取?', f'报告已经添加到右侧“文件上传区”(可能处于折叠状态),请查收。{file_links}'])
- return report_files, chatbot
+ return cookies, report_files, chatbot
def is_openai_api_key(key):
API_MATCH_ORIGINAL = re.match(r"sk-[a-zA-Z0-9]{48}$", key)
@@ -913,7 +923,8 @@ def zip_result(folder):
import time
t = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
zip_folder(folder, './gpt_log/', f'{t}-result.zip')
-
+ return pj('./gpt_log/', f'{t}-result.zip')
+
def gen_time_str():
import time
return time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
diff --git a/version b/version
index ceb909a..6353b34 100644
--- a/version
+++ b/version
@@ -1,5 +1,5 @@
{
- "version": 3.41,
+ "version": 3.42,
"show_feature": true,
- "new_feature": "增加gpt-3.5-16k的支持 <-> 新增最强Arxiv论文翻译插件 <-> 修复gradio复制按钮BUG <-> 修复PDF翻译的BUG, 新增HTML中英双栏对照 <-> 添加了OpenAI图片生成插件 <-> 添加了OpenAI音频转文本总结插件 <-> 通过Slack添加对Claude的支持"
+ "new_feature": "完善本地Latex矫错和翻译功能 <-> 增加gpt-3.5-16k的支持 <-> 新增最强Arxiv论文翻译插件 <-> 修复gradio复制按钮BUG <-> 修复PDF翻译的BUG, 新增HTML中英双栏对照 <-> 添加了OpenAI图片生成插件 <-> 添加了OpenAI音频转文本总结插件 <-> 通过Slack添加对Claude的支持"
}