support file implementation
This commit is contained in:
parent
d0af074225
commit
1639796041
@ -6,7 +6,7 @@ pj = os.path.join
|
|||||||
ARXIV_CACHE_DIR = os.path.expanduser(f"~/arxiv_cache/")
|
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):
|
def switch_prompt(pfg, mode, more_requirement):
|
||||||
"""
|
"""
|
||||||
Generate prompts and system prompts based on the mode for proofreading or translating.
|
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) # 刷新界面
|
yield from update_ui(chatbot=chatbot, history=history); time.sleep(1) # 刷新界面
|
||||||
promote_file_to_downloadzone(file=zip_res, chatbot=chatbot)
|
promote_file_to_downloadzone(file=zip_res, chatbot=chatbot)
|
||||||
else:
|
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) # 刷新界面
|
yield from update_ui(chatbot=chatbot, history=history); time.sleep(1) # 刷新界面
|
||||||
promote_file_to_downloadzone(file=zip_res, chatbot=chatbot)
|
promote_file_to_downloadzone(file=zip_res, chatbot=chatbot)
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ from typing import List
|
|||||||
from toolbox import update_ui_lastest_msg, get_conf
|
from toolbox import update_ui_lastest_msg, get_conf
|
||||||
from request_llm.bridge_all import predict_no_ui_long_connection
|
from request_llm.bridge_all import predict_no_ui_long_connection
|
||||||
from crazy_functions.json_fns.pydantic_io import GptJsonIO
|
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():
|
def read_avail_plugin_enum():
|
||||||
@ -20,6 +20,23 @@ def read_avail_plugin_enum():
|
|||||||
def wrap_code(txt):
|
def wrap_code(txt):
|
||||||
return f"\n```\n{txt}\n```\n"
|
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):
|
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()
|
plugin_arr_enum_prompt, plugin_arr_dict = read_avail_plugin_enum()
|
||||||
class Plugin(BaseModel):
|
class Plugin(BaseModel):
|
||||||
@ -56,6 +73,11 @@ def execute_plugin(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prom
|
|||||||
return
|
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]
|
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)
|
yield from update_ui_lastest_msg(lastmsg=f"正在执行任务: {txt}\n\n提取插件参数...", chatbot=chatbot, history=history, delay=0)
|
||||||
class PluginExplicit(BaseModel):
|
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"]
|
gpt_json_io.format_instructions += "The information about this plugin is:" + plugin["Info"]
|
||||||
inputs = f"A plugin named {plugin_sel.plugin_selection} is selected, " + \
|
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" + \
|
"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
|
gpt_json_io.format_instructions
|
||||||
run_gpt_fn = lambda inputs, sys_prompt: predict_no_ui_long_connection(
|
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=[])
|
inputs=inputs, llm_kwargs=llm_kwargs, history=[], sys_prompt=sys_prompt, observe_window=[])
|
||||||
|
4
main.py
4
main.py
@ -113,7 +113,7 @@ def main():
|
|||||||
plugin_advanced_arg = gr.Textbox(show_label=True, label="高级参数输入区", visible=False,
|
plugin_advanced_arg = gr.Textbox(show_label=True, label="高级参数输入区", visible=False,
|
||||||
placeholder="这里是特殊函数插件的高级参数输入区").style(container=False)
|
placeholder="这里是特殊函数插件的高级参数输入区").style(container=False)
|
||||||
with gr.Row():
|
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.Row():
|
||||||
with gr.Accordion("点击展开“文件上传区”。上传本地文件/压缩包供函数插件调用。", open=False) as area_file_up:
|
with gr.Accordion("点击展开“文件上传区”。上传本地文件/压缩包供函数插件调用。", open=False) as area_file_up:
|
||||||
file_upload = gr.Files(label="任何文件, 但推荐上传压缩文件(zip, tar)", file_count="multiple")
|
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)
|
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)
|
cancel_handles.append(click_handle)
|
||||||
# 文件上传区,接收文件后与chatbot的互动
|
# 文件上传区,接收文件后与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:
|
for k in plugins:
|
||||||
if not plugins[k].get("AsButton", True): continue
|
if not plugins[k].get("AsButton", True): continue
|
||||||
|
@ -13,3 +13,9 @@
|
|||||||
#input-plugin-group .svelte-1gfkn6j {
|
#input-plugin-group .svelte-1gfkn6j {
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* height of the upload box */
|
||||||
|
.wrap.svelte-xwlu1w {
|
||||||
|
min-height: var(--size-32);
|
||||||
|
}
|
35
toolbox.py
35
toolbox.py
@ -24,6 +24,19 @@ pj = os.path.join
|
|||||||
|
|
||||||
class ChatBotWithCookies(list):
|
class ChatBotWithCookies(list):
|
||||||
def __init__(self, cookie):
|
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
|
self._cookies = cookie
|
||||||
|
|
||||||
def write_list(self, list):
|
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)
|
if not os.path.exists(new_path): shutil.copyfile(file, new_path)
|
||||||
# 将文件添加到chatbot cookie中,避免多用户干扰
|
# 将文件添加到chatbot cookie中,避免多用户干扰
|
||||||
if chatbot:
|
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 = []
|
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):
|
def disable_auto_promotion(chatbot):
|
||||||
chatbot._cookies.update({'file_to_promote': []})
|
chatbot._cookies.update({'files_to_promote': []})
|
||||||
return
|
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'[Local Message] 收到以下文件: \n\n{moved_files_str}' +
|
||||||
f'\n\n调用路径参数已自动修正到: \n\n{txt}' +
|
f'\n\n调用路径参数已自动修正到: \n\n{txt}' +
|
||||||
f'\n\n现在您点击任意“红颜色”标识的函数插件时,以上文件将被作为输入参数'+err_msg])
|
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):
|
def on_report_generated(cookies, files, chatbot):
|
||||||
from toolbox import find_recent_files
|
from toolbox import find_recent_files
|
||||||
if 'file_to_promote' in cookies:
|
if 'files_to_promote' in cookies:
|
||||||
report_files = cookies['file_to_promote']
|
report_files = cookies['files_to_promote']
|
||||||
cookies.pop('file_to_promote')
|
cookies.pop('files_to_promote')
|
||||||
else:
|
else:
|
||||||
report_files = find_recent_files('gpt_log')
|
report_files = find_recent_files('gpt_log')
|
||||||
if len(report_files) == 0:
|
if len(report_files) == 0:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user