diff --git a/crazy_functions/Latex_Function.py b/crazy_functions/Latex_Function.py index 53bbdd2105..51b03283e2 100644 --- a/crazy_functions/Latex_Function.py +++ b/crazy_functions/Latex_Function.py @@ -3,7 +3,7 @@ from functools import partial from loguru import logger -import glob, os, requests, time, json, tarfile +import glob, os, requests, time, json, tarfile, threading pj = os.path.join ARXIV_CACHE_DIR = get_conf("ARXIV_CACHE_DIR") @@ -338,11 +338,17 @@ def Latex翻译中文并重新编译PDF(txt, llm_kwargs, plugin_kwargs, chatbot, # <-------------- 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", "") - no_cache = more_req.startswith("--no-cache") - if no_cache: more_req.lstrip("--no-cache") + + no_cache = ("--no-cache" in more_req) + if no_cache: more_req = more_req.replace("--no-cache", "").strip() + + allow_gptac_cloud_io = ("--allow-cloudio" in more_req) # 从云端下载翻译结果,以及上传翻译结果到云端 + if allow_gptac_cloud_io: more_req = more_req.replace("--allow-cloudio", "").strip() + allow_cache = not no_cache _switch_prompt_ = partial(switch_prompt, more_requirement=more_req) + # <-------------- check deps -------------> try: import glob, os, time, subprocess @@ -369,6 +375,20 @@ def Latex翻译中文并重新编译PDF(txt, llm_kwargs, plugin_kwargs, chatbot, yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 return + # ################################################################# + if allow_gptac_cloud_io and arxiv_id: + # 访问 GPTAC学术云,查询云端是否存在该论文的翻译版本 + from crazy_functions.latex_fns.latex_actions import check_gptac_cloud + success, downloaded = check_gptac_cloud(arxiv_id, chatbot) + if success: + chatbot.append([ + f"检测到GPTAC云端存在翻译版本, 如果不满意翻译结果, 请禁用云端分享, 然后重新执行。", + None + ]) + yield from update_ui(chatbot=chatbot, history=history) + return + ################################################################# + if os.path.exists(txt): project_folder = txt else: @@ -406,14 +426,21 @@ def Latex翻译中文并重新编译PDF(txt, llm_kwargs, plugin_kwargs, chatbot, # <-------------- zip PDF -------------> zip_res = zip_result(project_folder) if success: + if allow_gptac_cloud_io and arxiv_id: + # 如果用户允许,我们将翻译好的arxiv论文PDF上传到GPTAC学术云 + from crazy_functions.latex_fns.latex_actions import upload_to_gptac_cloud_if_user_allow + threading.Thread(target=upload_to_gptac_cloud_if_user_allow, + args=(chatbot, arxiv_id), daemon=True).start() + chatbot.append((f"成功啦", '请查收结果(压缩包)...')) - yield from update_ui(chatbot=chatbot, history=history); + 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区, 用该压缩包进行反馈。如系统是Linux,请检查系统字体(见Github wiki) ...')) - yield from update_ui(chatbot=chatbot, history=history); + yield from update_ui(chatbot=chatbot, history=history) time.sleep(1) # 刷新界面 promote_file_to_downloadzone(file=zip_res, chatbot=chatbot) diff --git a/crazy_functions/Latex_Function_Wrap.py b/crazy_functions/Latex_Function_Wrap.py index 5d7b1f3194..db49e31591 100644 --- a/crazy_functions/Latex_Function_Wrap.py +++ b/crazy_functions/Latex_Function_Wrap.py @@ -30,6 +30,8 @@ def define_arg_selection_menu(self): default_value="", type="string").model_dump_json(), # 高级参数输入区,自动同步 "allow_cache": ArgProperty(title="是否允许从缓存中调取结果", options=["允许缓存", "从头执行"], default_value="允许缓存", description="无", type="dropdown").model_dump_json(), + "allow_cloudio": + ArgProperty(title="是否允许从GPTAC学术云下载(或者上传)翻译结果", options=["允许", "禁止"], default_value="禁止", description="共享文献,互助互利", type="dropdown").model_dump_json(), } return gui_definition @@ -38,9 +40,14 @@ def execute(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, use 执行插件 """ allow_cache = plugin_kwargs["allow_cache"] + allow_cloudio = plugin_kwargs["allow_cloudio"] advanced_arg = plugin_kwargs["advanced_arg"] if allow_cache == "从头执行": plugin_kwargs["advanced_arg"] = "--no-cache " + plugin_kwargs["advanced_arg"] + + # 从云端下载翻译结果,以及上传翻译结果到云端;人人为我,我为人人。 + if allow_cloudio == "允许": plugin_kwargs["advanced_arg"] = "--allow-cloudio " + plugin_kwargs["advanced_arg"] + yield from Latex翻译中文并重新编译PDF(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_request) diff --git a/crazy_functions/latex_fns/latex_actions.py b/crazy_functions/latex_fns/latex_actions.py index 4293f0d098..496f5399bf 100644 --- a/crazy_functions/latex_fns/latex_actions.py +++ b/crazy_functions/latex_fns/latex_actions.py @@ -3,7 +3,7 @@ import shutil import numpy as np from loguru import logger -from toolbox import update_ui, update_ui_lastest_msg, get_log_folder +from toolbox import update_ui, update_ui_lastest_msg, get_log_folder, gen_time_str from toolbox import get_conf, promote_file_to_downloadzone from crazy_functions.latex_fns.latex_toolbox import PRESERVE, TRANSFORM from crazy_functions.latex_fns.latex_toolbox import set_forbidden_text, set_forbidden_text_begin_end, set_forbidden_text_careful_brace @@ -468,3 +468,66 @@ def write_html(sp_file_contents, sp_file_result, chatbot, project_folder): except: from toolbox import trimmed_format_exc logger.error('writing html result failed:', trimmed_format_exc()) + + +def upload_to_gptac_cloud_if_user_allow(chatbot, arxiv_id): + try: + # 如果用户允许,我们将arxiv论文PDF上传到GPTAC学术云 + from toolbox import map_file_to_sha256 + # 检查是否顺利,如果没有生成预期的文件,则跳过 + is_result_good = False + for file_path in chatbot._cookies.get("files_to_promote", []): + if file_path.endswith('translate_zh.pdf'): + is_result_good = True + if not is_result_good: + return + # 上传文件 + for file_path in chatbot._cookies.get("files_to_promote", []): + align_name = None + # normalized name + for name in ['translate_zh.pdf', 'comparison.pdf']: + if file_path.endswith(name): align_name = name + # if match any align name + if align_name: + logger.info(f'Uploading to GPTAC cloud as the user has set `allow_cloud_io`: {file_path}') + with open(file_path, 'rb') as f: + import requests + url = 'https://cloud-2.agent-matrix.com/arxiv_tf_paper_normal_upload' + files = {'file': (align_name, f, 'application/octet-stream')} + data = { + 'arxiv_id': arxiv_id, + 'file_hash': map_file_to_sha256(file_path), + } + resp = requests.post(url=url, files=files, data=data, timeout=30) + logger.info(f'Uploading terminate ({resp.status_code})`: {file_path}') + except: + # 如果上传失败,不会中断程序,因为这是次要功能 + pass + +def check_gptac_cloud(arxiv_id, chatbot): + import requests + success = False + downloaded = [] + try: + for pdf_target in ['translate_zh.pdf', 'comparison.pdf']: + url = 'https://cloud-2.agent-matrix.com/arxiv_tf_paper_normal_exist' + data = { + 'arxiv_id': arxiv_id, + 'name': pdf_target, + } + resp = requests.post(url=url, data=data) + cache_hit_result = resp.text.strip('"') + if cache_hit_result.startswith("http"): + url = cache_hit_result + logger.info(f'Downloading from GPTAC cloud: {url}') + resp = requests.get(url=url, timeout=30) + target = os.path.join(get_log_folder(plugin_name='gptac_cloud'), gen_time_str(), pdf_target) + os.makedirs(os.path.dirname(target), exist_ok=True) + with open(target, 'wb') as f: + f.write(resp.content) + new_path = promote_file_to_downloadzone(target, chatbot=chatbot) + success = True + downloaded.append(new_path) + except: + pass + return success, downloaded