diff --git a/crazy_functions/Latex输出PDF结果.py b/crazy_functions/Latex输出PDF结果.py index e79cf82..0ba9f19 100644 --- a/crazy_functions/Latex输出PDF结果.py +++ b/crazy_functions/Latex输出PDF结果.py @@ -6,7 +6,7 @@ pj = os.path.join ARXIV_CACHE_DIR = os.path.expanduser(f"~/arxiv_cache/") # =================================== 工具函数 =============================================== -专业词汇声明 = 'If the term "agent" is used in this section, it should be translated to "智能体". ' +# 专业词汇声明 = 'If the term "agent" is used in this section, it should be translated to "智能体". ' def switch_prompt(pfg, mode, more_requirement): """ Generate prompts and system prompts based on the mode for proofreading or translating. @@ -291,7 +291,7 @@ def Latex翻译中文并重新编译PDF(txt, llm_kwargs, plugin_kwargs, chatbot, 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区, 用该压缩包+对话历史存档进行反馈 ...')) + chatbot.append((f"失败了", '虽然PDF生成失败了, 但请查收结果(压缩包), 内含已经翻译的Tex文档, 您可以到Github Issue区, 用该压缩包进行反馈。如系统是Linux,请检查系统字体(见Github wiki) ...')) 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/vt_fns/vt_call_plugin.py b/crazy_functions/vt_fns/vt_call_plugin.py index 8ee88b1..09b136f 100644 --- a/crazy_functions/vt_fns/vt_call_plugin.py +++ b/crazy_functions/vt_fns/vt_call_plugin.py @@ -3,7 +3,7 @@ from typing import List from toolbox import update_ui_lastest_msg, get_conf from request_llm.bridge_all import predict_no_ui_long_connection from crazy_functions.json_fns.pydantic_io import GptJsonIO -import copy, json, pickle, os, sys +import copy, json, pickle, os, sys, time def read_avail_plugin_enum(): @@ -20,6 +20,23 @@ def read_avail_plugin_enum(): def wrap_code(txt): return f"\n```\n{txt}\n```\n" +def have_any_recent_upload_files(chatbot): + _5min = 5 * 60 + if not chatbot: return False # chatbot is None + most_recent_uploaded = chatbot._cookies.get("most_recent_uploaded", None) + if not most_recent_uploaded: return False # most_recent_uploaded is None + if time.time() - most_recent_uploaded["time"] < _5min: return True # most_recent_uploaded is new + else: return False # most_recent_uploaded is too old + +def get_recent_file_prompt_support(chatbot): + most_recent_uploaded = chatbot._cookies.get("most_recent_uploaded", None) + path = most_recent_uploaded['path'] + prompt = "\nAdditional Information:\n" + prompt = "In case that this plugin requires a path or a file as argument," + prompt += f"it is important for you to know that the user has recently uploaded a file, located at: `{path}`" + prompt += f"Only use it when necessary, otherwise, you can ignore this file." + return prompt + def execute_plugin(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_intention): plugin_arr_enum_prompt, plugin_arr_dict = read_avail_plugin_enum() class Plugin(BaseModel): @@ -56,6 +73,11 @@ def execute_plugin(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prom return # ⭐ ⭐ ⭐ 确认插件参数 + if not have_any_recent_upload_files(chatbot): + appendix_info = "" + else: + appendix_info = get_recent_file_prompt_support(chatbot) + plugin = plugin_arr_dict[plugin_sel.plugin_selection] yield from update_ui_lastest_msg(lastmsg=f"正在执行任务: {txt}\n\n提取插件参数...", chatbot=chatbot, history=history, delay=0) class PluginExplicit(BaseModel): @@ -65,7 +87,7 @@ def execute_plugin(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prom gpt_json_io.format_instructions += "The information about this plugin is:" + plugin["Info"] inputs = f"A plugin named {plugin_sel.plugin_selection} is selected, " + \ "you should extract plugin_arg from the user requirement, the user requirement is: \n\n" + \ - ">> " + txt.rstrip('\n').replace('\n','\n>> ') + '\n\n' + \ + ">> " + (txt + appendix_info).rstrip('\n').replace('\n','\n>> ') + '\n\n' + \ gpt_json_io.format_instructions run_gpt_fn = lambda inputs, sys_prompt: predict_no_ui_long_connection( inputs=inputs, llm_kwargs=llm_kwargs, history=[], sys_prompt=sys_prompt, observe_window=[]) diff --git a/main.py b/main.py index 50028c2..feebfb6 100644 --- a/main.py +++ b/main.py @@ -113,7 +113,7 @@ def main(): plugin_advanced_arg = gr.Textbox(show_label=True, label="高级参数输入区", visible=False, placeholder="这里是特殊函数插件的高级参数输入区").style(container=False) with gr.Row(): - switchy_bt = gr.Button(r"请先从插件列表中选择", variant="secondary") + switchy_bt = gr.Button(r"请先从插件列表中选择", variant="secondary").style(size="sm") with gr.Row(): with gr.Accordion("点击展开“文件上传区”。上传本地文件/压缩包供函数插件调用。", open=False) as area_file_up: file_upload = gr.Files(label="任何文件, 但推荐上传压缩文件(zip, tar)", file_count="multiple") @@ -172,7 +172,7 @@ def main(): click_handle = functional[k]["Button"].click(fn=ArgsGeneralWrapper(predict), inputs=[*input_combo, gr.State(True), gr.State(k)], outputs=output_combo) cancel_handles.append(click_handle) # 文件上传区,接收文件后与chatbot的互动 - file_upload.upload(on_file_uploaded, [file_upload, chatbot, txt, txt2, checkboxes], [chatbot, txt, txt2]) + file_upload.upload(on_file_uploaded, [file_upload, chatbot, txt, txt2, checkboxes, cookies], [chatbot, txt, txt2, cookies]) # 函数插件-固定按钮区 for k in plugins: if not plugins[k].get("AsButton", True): continue diff --git a/themes/common.css b/themes/common.css index 33bb4f0..c43e54d 100644 --- a/themes/common.css +++ b/themes/common.css @@ -13,3 +13,9 @@ #input-plugin-group .svelte-1gfkn6j { visibility: hidden; } + + +/* height of the upload box */ +.wrap.svelte-xwlu1w { + min-height: var(--size-32); +} \ No newline at end of file diff --git a/toolbox.py b/toolbox.py index 6da2347..9a06895 100644 --- a/toolbox.py +++ b/toolbox.py @@ -24,6 +24,19 @@ pj = os.path.join class ChatBotWithCookies(list): def __init__(self, cookie): + """ + cookies = { + 'top_p': top_p, + 'temperature': temperature, + 'lock_plugin': bool, + "files_to_promote": ["file1", "file2"], + "most_recent_uploaded": { + "path": "uploaded_path", + "time": time.time(), + "time_str": "timestr", + } + } + """ self._cookies = cookie def write_list(self, list): @@ -503,15 +516,15 @@ def promote_file_to_downloadzone(file, rename_file=None, chatbot=None): if not os.path.exists(new_path): shutil.copyfile(file, new_path) # 将文件添加到chatbot cookie中,避免多用户干扰 if chatbot: - if 'file_to_promote' in chatbot._cookies: current = chatbot._cookies['file_to_promote'] + if 'files_to_promote' in chatbot._cookies: current = chatbot._cookies['files_to_promote'] else: current = [] - chatbot._cookies.update({'file_to_promote': [new_path] + current}) + chatbot._cookies.update({'files_to_promote': [new_path] + current}) def disable_auto_promotion(chatbot): - chatbot._cookies.update({'file_to_promote': []}) + chatbot._cookies.update({'files_to_promote': []}) return -def on_file_uploaded(files, chatbot, txt, txt2, checkboxes): +def on_file_uploaded(files, chatbot, txt, txt2, checkboxes, cookies): """ 当文件被上传时的回调函数 """ @@ -546,14 +559,20 @@ def on_file_uploaded(files, chatbot, txt, txt2, checkboxes): f'[Local Message] 收到以下文件: \n\n{moved_files_str}' + f'\n\n调用路径参数已自动修正到: \n\n{txt}' + f'\n\n现在您点击任意“红颜色”标识的函数插件时,以上文件将被作为输入参数'+err_msg]) - return chatbot, txt, txt2 + cookies.update({ + 'most_recent_uploaded': { + 'path': f'private_upload/{time_tag}', + 'time': time.time(), + 'time_str': time_tag + }}) + return chatbot, txt, txt2, cookies def on_report_generated(cookies, files, chatbot): from toolbox import find_recent_files - if 'file_to_promote' in cookies: - report_files = cookies['file_to_promote'] - cookies.pop('file_to_promote') + if 'files_to_promote' in cookies: + report_files = cookies['files_to_promote'] + cookies.pop('files_to_promote') else: report_files = find_recent_files('gpt_log') if len(report_files) == 0: