镜像自地址
https://github.com/binary-husky/gpt_academic.git
已同步 2025-12-06 14:36:48 +00:00
unify plugin calling
这个提交包含在:
37
main.py
37
main.py
@@ -132,8 +132,10 @@ def main():
|
|||||||
visible = True if match_group(plugin['Group'], DEFAULT_FN_GROUPS) else False
|
visible = True if match_group(plugin['Group'], DEFAULT_FN_GROUPS) else False
|
||||||
variant = plugins[k]["Color"] if "Color" in plugin else "secondary"
|
variant = plugins[k]["Color"] if "Color" in plugin else "secondary"
|
||||||
info = plugins[k].get("Info", k)
|
info = plugins[k].get("Info", k)
|
||||||
|
btn_elem_id = str(hash(k))
|
||||||
plugin['Button'] = plugins[k]['Button'] = gr.Button(k, variant=variant,
|
plugin['Button'] = plugins[k]['Button'] = gr.Button(k, variant=variant,
|
||||||
visible=visible, info_str=f'函数插件区: {info}').style(size="sm")
|
visible=visible, info_str=f'函数插件区: {info}', elem_id=btn_elem_id).style(size="sm")
|
||||||
|
plugin['ButtonElemId'] = btn_elem_id
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
with gr.Accordion("更多函数插件", open=True):
|
with gr.Accordion("更多函数插件", open=True):
|
||||||
dropdown_fn_list = []
|
dropdown_fn_list = []
|
||||||
@@ -239,23 +241,13 @@ def main():
|
|||||||
if not plugins[k].get("AsButton", True): continue
|
if not plugins[k].get("AsButton", True): continue
|
||||||
if plugins[k].get("Class", None) is None:
|
if plugins[k].get("Class", None) is None:
|
||||||
assert plugins[k].get("Function", None) is not None
|
assert plugins[k].get("Function", None) is not None
|
||||||
click_handle = plugins[k]["Button"].click(ArgsGeneralWrapper(plugins[k]["Function"]), [*input_combo], output_combo)
|
click_handle = plugins[k]["Button"].click(None, inputs=[], outputs=None, _js=f"""()=>run_classic_plugin_via_id("{plugins[k]["ButtonElemId"]}")""")
|
||||||
click_handle.then(on_report_generated, [cookies, file_upload, chatbot], [cookies, file_upload, chatbot]).then(None, [plugins[k]["Button"]], None, _js=r"(fn)=>on_plugin_exe_complete(fn)")
|
# click_handle = plugins[k]["Button"].click(ArgsGeneralWrapper(plugins[k]["Function"]), [*input_combo], output_combo)
|
||||||
cancel_handles.append(click_handle)
|
# click_handle.then(on_report_generated, [cookies, file_upload, chatbot], [cookies, file_upload, chatbot]).then(None, [plugins[k]["Button"]], None, _js=r"(fn)=>on_plugin_exe_complete(fn)")
|
||||||
|
# cancel_handles.append(click_handle)
|
||||||
else:
|
else:
|
||||||
click_handle = plugins[k]["Button"].click(None, inputs=[], outputs=None, _js=f"""()=>run_advanced_plugin_launch_code("{k}")""")
|
click_handle = plugins[k]["Button"].click(None, inputs=[], outputs=None, _js=f"""()=>run_advanced_plugin_launch_code("{k}")""")
|
||||||
|
|
||||||
# 函数插件-下拉菜单与随变按钮的互动(旧版)
|
|
||||||
# def on_dropdown_changed(k):
|
|
||||||
# variant = plugins[k]["Color"] if "Color" in plugins[k] else "secondary" # 选择颜色
|
|
||||||
# info = plugins[k].get("Info", k) # 获取info
|
|
||||||
# ret = {switchy_bt: gr.update(value=k, variant=variant, info_str=f'函数插件区: {info}')}
|
|
||||||
# if plugins[k].get("AdvancedArgs", False): # 是否唤起高级插件参数区
|
|
||||||
# ret.update({plugin_advanced_arg: gr.update(visible=True, label=f"插件[{k}]的高级参数说明:" + plugins[k].get("ArgsReminder", [f"没有提供高级参数功能说明"]))})
|
|
||||||
# else:
|
|
||||||
# ret.update({plugin_advanced_arg: gr.update(visible=False, label=f"插件[{k}]不需要高级参数。")})
|
|
||||||
# return ret
|
|
||||||
# dropdown.select(on_dropdown_changed, [dropdown], [switchy_bt, plugin_advanced_arg] )
|
|
||||||
# 函数插件-下拉菜单与随变按钮的互动(新版-更流畅)
|
# 函数插件-下拉菜单与随变按钮的互动(新版-更流畅)
|
||||||
dropdown.select(None, [dropdown], None, _js=f"""(dropdown)=>run_dropdown_shift(dropdown)""")
|
dropdown.select(None, [dropdown], None, _js=f"""(dropdown)=>run_dropdown_shift(dropdown)""")
|
||||||
|
|
||||||
@@ -272,13 +264,7 @@ def main():
|
|||||||
return css_part2 + css_part1
|
return css_part2 + css_part1
|
||||||
|
|
||||||
theme_handle = theme_dropdown.select(on_theme_dropdown_changed, [theme_dropdown, secret_css], [secret_css])
|
theme_handle = theme_dropdown.select(on_theme_dropdown_changed, [theme_dropdown, secret_css], [secret_css])
|
||||||
theme_handle.then(
|
theme_handle.then(None, [secret_css], None, _js=js_code_for_css_changing)
|
||||||
None,
|
|
||||||
[secret_css],
|
|
||||||
None,
|
|
||||||
_js=js_code_for_css_changing
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
switchy_bt.click(None, [switchy_bt], None, _js="(switchy_bt)=>on_flex_button_click(switchy_bt)")
|
switchy_bt.click(None, [switchy_bt], None, _js="(switchy_bt)=>on_flex_button_click(switchy_bt)")
|
||||||
# 随变按钮的回调函数注册
|
# 随变按钮的回调函数注册
|
||||||
@@ -293,9 +279,10 @@ def main():
|
|||||||
click_handle_ng.then(on_report_generated, [cookies, file_upload, chatbot], [cookies, file_upload, chatbot]).then(None, [switchy_bt], None, _js=r"(fn)=>on_plugin_exe_complete(fn)")
|
click_handle_ng.then(on_report_generated, [cookies, file_upload, chatbot], [cookies, file_upload, chatbot]).then(None, [switchy_bt], None, _js=r"(fn)=>on_plugin_exe_complete(fn)")
|
||||||
cancel_handles.append(click_handle_ng)
|
cancel_handles.append(click_handle_ng)
|
||||||
# 新一代插件的高级参数区确认按钮(隐藏)
|
# 新一代插件的高级参数区确认按钮(隐藏)
|
||||||
click_handle_ng = new_plugin_callback.click(route_switchy_bt_with_arg, [
|
click_handle_ng = new_plugin_callback.click(route_switchy_bt_with_arg,
|
||||||
gr.State(["new_plugin_callback", "usr_confirmed_arg"] + input_combo_order),
|
[
|
||||||
new_plugin_callback, usr_confirmed_arg, *input_combo
|
gr.State(["new_plugin_callback", "usr_confirmed_arg"] + input_combo_order), # 第一个参数: 指定了后续参数的名称
|
||||||
|
new_plugin_callback, usr_confirmed_arg, *input_combo # 后续参数: 真正的参数
|
||||||
], output_combo)
|
], output_combo)
|
||||||
click_handle_ng.then(on_report_generated, [cookies, file_upload, chatbot], [cookies, file_upload, chatbot]).then(None, [switchy_bt], None, _js=r"(fn)=>on_plugin_exe_complete(fn)")
|
click_handle_ng.then(on_report_generated, [cookies, file_upload, chatbot], [cookies, file_upload, chatbot]).then(None, [switchy_bt], None, _js=r"(fn)=>on_plugin_exe_complete(fn)")
|
||||||
cancel_handles.append(click_handle_ng)
|
cancel_handles.append(click_handle_ng)
|
||||||
|
|||||||
@@ -1706,6 +1706,7 @@ function register_plugin_init(key, base64String){
|
|||||||
}
|
}
|
||||||
plugin_init_info_lib[key].info = guiJsonData.Info;
|
plugin_init_info_lib[key].info = guiJsonData.Info;
|
||||||
plugin_init_info_lib[key].color = guiJsonData.Color;
|
plugin_init_info_lib[key].color = guiJsonData.Color;
|
||||||
|
plugin_init_info_lib[key].elem_id = guiJsonData.ButtonElemId;
|
||||||
plugin_init_info_lib[key].label = guiJsonData.Label
|
plugin_init_info_lib[key].label = guiJsonData.Label
|
||||||
plugin_init_info_lib[key].enable_advanced_arg = guiJsonData.AdvancedArgs;
|
plugin_init_info_lib[key].enable_advanced_arg = guiJsonData.AdvancedArgs;
|
||||||
plugin_init_info_lib[key].arg_reminder = guiJsonData.ArgsReminder;
|
plugin_init_info_lib[key].arg_reminder = guiJsonData.ArgsReminder;
|
||||||
@@ -1754,3 +1755,35 @@ async function run_dropdown_shift(dropdown){
|
|||||||
}, "advance_arg_input_legacy", "obj");
|
}, "advance_arg_input_legacy", "obj");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function run_classic_plugin_via_id(plugin_elem_id){
|
||||||
|
// find elementid
|
||||||
|
for (key in plugin_init_info_lib){
|
||||||
|
if (plugin_init_info_lib[key].elem_id == plugin_elem_id){
|
||||||
|
let current_btn_name = await get_data_from_gradio_component(plugin_elem_id);
|
||||||
|
console.log(current_btn_name);
|
||||||
|
|
||||||
|
gui_args = {}
|
||||||
|
// 关闭菜单 (如果处于开启状态)
|
||||||
|
push_data_to_gradio_component({
|
||||||
|
visible: false,
|
||||||
|
__type__: 'update'
|
||||||
|
}, "plugin_arg_menu", "obj");
|
||||||
|
hide_all_elem();
|
||||||
|
// 为了与旧插件兼容,生成菜单时,自动加载旧高级参数输入区的值
|
||||||
|
let advance_arg_input_legacy = await get_data_from_gradio_component('advance_arg_input_legacy');
|
||||||
|
if (advance_arg_input_legacy.length != 0){
|
||||||
|
gui_args = {
|
||||||
|
"advanced_arg": advance_arg_input_legacy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// execute the plugin
|
||||||
|
push_data_to_gradio_component(JSON.stringify(gui_args), "invisible_current_pop_up_plugin_arg_final", "string");
|
||||||
|
push_data_to_gradio_component(current_btn_name, "invisible_callback_btn_for_plugin_exe", "string");
|
||||||
|
document.getElementById("invisible_callback_btn_for_plugin_exe").click();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// console.log('unable to find function');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|||||||
@@ -31,18 +31,27 @@ def define_gui_advanced_plugin_class(plugins):
|
|||||||
invisible_callback_btn_for_plugin_exe = gr.Button(r"未选定任何插件", variant="secondary", visible=False, elem_id="invisible_callback_btn_for_plugin_exe").style(size="sm")
|
invisible_callback_btn_for_plugin_exe = gr.Button(r"未选定任何插件", variant="secondary", visible=False, elem_id="invisible_callback_btn_for_plugin_exe").style(size="sm")
|
||||||
# 随变按钮的回调函数注册
|
# 随变按钮的回调函数注册
|
||||||
def route_switchy_bt_with_arg(request: gr.Request, input_order, *arg):
|
def route_switchy_bt_with_arg(request: gr.Request, input_order, *arg):
|
||||||
arguments = {k:v for k,v in zip(input_order, arg)}
|
arguments = {k:v for k,v in zip(input_order, arg)} # 重新梳理输入参数,转化为kwargs字典
|
||||||
which_plugin = arguments.pop('new_plugin_callback')
|
which_plugin = arguments.pop('new_plugin_callback') # 获取需要执行的插件名称
|
||||||
if which_plugin in [r"未选定任何插件"]: return
|
if which_plugin in [r"未选定任何插件"]: return
|
||||||
usr_confirmed_arg = arguments.pop('usr_confirmed_arg')
|
usr_confirmed_arg = arguments.pop('usr_confirmed_arg') # 获取插件参数
|
||||||
arg_confirm: dict = {}
|
arg_confirm: dict = {}
|
||||||
usr_confirmed_arg_dict = json.loads(usr_confirmed_arg)
|
usr_confirmed_arg_dict = json.loads(usr_confirmed_arg) # 读取插件参数
|
||||||
for arg_name in usr_confirmed_arg_dict:
|
for arg_name in usr_confirmed_arg_dict:
|
||||||
arg_confirm.update({arg_name: str(usr_confirmed_arg_dict[arg_name]['user_confirmed_value'])})
|
arg_confirm.update({arg_name: str(usr_confirmed_arg_dict[arg_name]['user_confirmed_value'])})
|
||||||
|
|
||||||
|
if plugins[which_plugin].get("Class", None) is not None: # 获取插件执行函数
|
||||||
plugin_obj = plugins[which_plugin]["Class"]
|
plugin_obj = plugins[which_plugin]["Class"]
|
||||||
arguments['plugin_advanced_arg'] = arg_confirm
|
plugin_exe = plugin_obj.execute
|
||||||
if arg_confirm.get('main_input', None) is not None:
|
else:
|
||||||
|
plugin_exe = plugins[which_plugin]["Function"]
|
||||||
|
|
||||||
|
arguments['plugin_advanced_arg'] = arg_confirm # 更新高级参数输入区的参数
|
||||||
|
if arg_confirm.get('main_input', None) is not None: # 更新主输入区的参数
|
||||||
arguments['txt'] = arg_confirm['main_input']
|
arguments['txt'] = arg_confirm['main_input']
|
||||||
yield from ArgsGeneralWrapper(plugin_obj.execute)(request, *arguments.values())
|
|
||||||
|
# 万事俱备,开始执行
|
||||||
|
yield from ArgsGeneralWrapper(plugin_exe)(request, *arguments.values())
|
||||||
|
|
||||||
return invisible_callback_btn_for_plugin_exe, route_switchy_bt_with_arg, usr_confirmed_arg
|
return invisible_callback_btn_for_plugin_exe, route_switchy_bt_with_arg, usr_confirmed_arg
|
||||||
|
|
||||||
|
|||||||
在新工单中引用
屏蔽一个用户