镜像自地址
https://github.com/binary-husky/gpt_academic.git
已同步 2025-12-06 06:26:47 +00:00
test new dropdown js code
这个提交包含在:
@@ -51,6 +51,7 @@ def get_crazy_functions():
|
|||||||
"Group": "对话|编程|学术|智能体",
|
"Group": "对话|编程|学术|智能体",
|
||||||
"Color": "stop",
|
"Color": "stop",
|
||||||
"AsButton": True,
|
"AsButton": True,
|
||||||
|
"Info": "使用自然语言实现您的想法",
|
||||||
"Function": HotReload(虚空终端),
|
"Function": HotReload(虚空终端),
|
||||||
},
|
},
|
||||||
"解析整个Python项目": {
|
"解析整个Python项目": {
|
||||||
|
|||||||
49
main.py
49
main.py
@@ -84,7 +84,7 @@ def main():
|
|||||||
with gr.Blocks(title="GPT 学术优化", theme=set_theme, analytics_enabled=False, css=advanced_css) as app_block:
|
with gr.Blocks(title="GPT 学术优化", theme=set_theme, analytics_enabled=False, css=advanced_css) as app_block:
|
||||||
gr.HTML(title_html)
|
gr.HTML(title_html)
|
||||||
secret_css = gr.Textbox(visible=False, elem_id="secret_css")
|
secret_css = gr.Textbox(visible=False, elem_id="secret_css")
|
||||||
register_advanced_plugin_init_code_arr = ""
|
register_advanced_plugin_init_arr = ""
|
||||||
|
|
||||||
cookies, web_cookie_cache = make_cookie_cache() # 定义 后端state(cookies)、前端(web_cookie_cache)两兄弟
|
cookies, web_cookie_cache = make_cookie_cache() # 定义 后端state(cookies)、前端(web_cookie_cache)两兄弟
|
||||||
with gr_L1():
|
with gr_L1():
|
||||||
@@ -147,7 +147,7 @@ def main():
|
|||||||
plugin_advanced_arg = gr.Textbox(show_label=True, label="高级参数输入区", visible=False, elem_id="advance_arg_input_legacy",
|
plugin_advanced_arg = gr.Textbox(show_label=True, label="高级参数输入区", visible=False, elem_id="advance_arg_input_legacy",
|
||||||
placeholder="这里是特殊函数插件的高级参数输入区").style(container=False)
|
placeholder="这里是特殊函数插件的高级参数输入区").style(container=False)
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
switchy_bt = gr.Button(r"请先从插件列表中选择", variant="secondary").style(size="sm")
|
switchy_bt = gr.Button(r"请先从插件列表中选择", variant="secondary", elem_id="elem_switchy_bt").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", elem_id="elem_upload")
|
file_upload = gr.Files(label="任何文件, 推荐上传压缩文件(zip, tar)", file_count="multiple", elem_id="elem_upload")
|
||||||
@@ -217,10 +217,25 @@ def main():
|
|||||||
file_upload.upload(on_file_uploaded, [file_upload, chatbot, txt, txt2, checkboxes, cookies], [chatbot, txt, txt2, cookies]).then(None, None, None, _js=r"()=>{toast_push('上传完毕 ...'); cancel_loading_status();}")
|
file_upload.upload(on_file_uploaded, [file_upload, chatbot, txt, txt2, checkboxes, cookies], [chatbot, txt, txt2, cookies]).then(None, None, None, _js=r"()=>{toast_push('上传完毕 ...'); cancel_loading_status();}")
|
||||||
file_upload_2.upload(on_file_uploaded, [file_upload_2, chatbot, txt, txt2, checkboxes, cookies], [chatbot, txt, txt2, cookies]).then(None, None, None, _js=r"()=>{toast_push('上传完毕 ...'); cancel_loading_status();}")
|
file_upload_2.upload(on_file_uploaded, [file_upload_2, chatbot, txt, txt2, checkboxes, cookies], [chatbot, txt, txt2, cookies]).then(None, None, None, _js=r"()=>{toast_push('上传完毕 ...'); cancel_loading_status();}")
|
||||||
# 函数插件-固定按钮区
|
# 函数插件-固定按钮区
|
||||||
|
def encode_plugin_info(k, plugin)->str:
|
||||||
|
import copy
|
||||||
|
from themes.theme import to_cookie_str
|
||||||
|
plugin_ = copy.copy(plugin)
|
||||||
|
plugin_.pop("Function", None)
|
||||||
|
plugin_.pop("Class", None)
|
||||||
|
plugin_.pop("Button", None)
|
||||||
|
plugin_["Info"] = plugin.get("Info", k)
|
||||||
|
if plugin.get("AdvancedArgs", False):
|
||||||
|
plugin_["Label"] = f"插件[{k}]的高级参数说明:" + plugin.get("ArgsReminder", f"没有提供高级参数功能说明")
|
||||||
|
else:
|
||||||
|
plugin_["Label"] = f"插件[{k}]不需要高级参数。"
|
||||||
|
return to_cookie_str(plugin_)
|
||||||
|
|
||||||
for k in plugins:
|
for k in plugins:
|
||||||
|
register_advanced_plugin_init_arr += f"""register_plugin_init("{k}","{encode_plugin_info(k, plugins[k])}");"""
|
||||||
if plugins[k].get("Class", None):
|
if plugins[k].get("Class", None):
|
||||||
plugins[k]["JsMenu"] = plugins[k]["Class"]().get_js_code_for_generating_menu(k)
|
plugins[k]["JsMenu"] = plugins[k]["Class"]().get_js_code_for_generating_menu(k)
|
||||||
register_advanced_plugin_init_code_arr += """register_advanced_plugin_init_code("{k}","{gui_js}");""".format(k=k, gui_js=plugins[k]["JsMenu"])
|
register_advanced_plugin_init_arr += """register_advanced_plugin_init_code("{k}","{gui_js}");""".format(k=k, gui_js=plugins[k]["JsMenu"])
|
||||||
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
|
||||||
@@ -230,21 +245,23 @@ def main():
|
|||||||
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):
|
# def on_dropdown_changed(k):
|
||||||
variant = plugins[k]["Color"] if "Color" in plugins[k] else "secondary"
|
# variant = plugins[k]["Color"] if "Color" in plugins[k] else "secondary" # 选择颜色
|
||||||
info = plugins[k].get("Info", k)
|
# info = plugins[k].get("Info", k) # 获取info
|
||||||
ret = {switchy_bt: gr.update(value=k, variant=variant, info_str=f'函数插件区: {info}')}
|
# ret = {switchy_bt: gr.update(value=k, variant=variant, info_str=f'函数插件区: {info}')}
|
||||||
if plugins[k].get("AdvancedArgs", False): # 是否唤起高级插件参数区
|
# if plugins[k].get("AdvancedArgs", False): # 是否唤起高级插件参数区
|
||||||
ret.update({plugin_advanced_arg: gr.update(visible=True, label=f"插件[{k}]的高级参数说明:" + plugins[k].get("ArgsReminder", [f"没有提供高级参数功能说明"]))})
|
# ret.update({plugin_advanced_arg: gr.update(visible=True, label=f"插件[{k}]的高级参数说明:" + plugins[k].get("ArgsReminder", [f"没有提供高级参数功能说明"]))})
|
||||||
else:
|
# else:
|
||||||
ret.update({plugin_advanced_arg: gr.update(visible=False, label=f"插件[{k}]不需要高级参数。")})
|
# ret.update({plugin_advanced_arg: gr.update(visible=False, label=f"插件[{k}]不需要高级参数。")})
|
||||||
return ret
|
# return ret
|
||||||
dropdown.select(on_dropdown_changed, [dropdown], [switchy_bt, plugin_advanced_arg] )
|
# dropdown.select(on_dropdown_changed, [dropdown], [switchy_bt, plugin_advanced_arg] )
|
||||||
|
# 函数插件-下拉菜单与随变按钮的互动(新版-更流畅)
|
||||||
|
dropdown.select(None, [dropdown], None, _js=f"""(dropdown)=>run_dropdown_shift(dropdown)""")
|
||||||
|
|
||||||
def on_md_dropdown_changed(k):
|
def on_md_dropdown_changed(k):
|
||||||
return {chatbot: gr.update(label="当前模型:"+k)}
|
return {chatbot: gr.update(label="当前模型:"+k)}
|
||||||
md_dropdown.select(on_md_dropdown_changed, [md_dropdown], [chatbot] )
|
md_dropdown.select(on_md_dropdown_changed, [md_dropdown], [chatbot])
|
||||||
|
|
||||||
def on_theme_dropdown_changed(theme, secret_css):
|
def on_theme_dropdown_changed(theme, secret_css):
|
||||||
adjust_theme, css_part1, _, adjust_dynamic_theme = load_dynamic_theme(theme)
|
adjust_theme, css_part1, _, adjust_dynamic_theme = load_dynamic_theme(theme)
|
||||||
@@ -314,7 +331,7 @@ def main():
|
|||||||
outputs = [web_cookie_cache, cookies, *customize_btns.values(), *predefined_btns.values()], _js=js_code_for_persistent_cookie_init)
|
outputs = [web_cookie_cache, cookies, *customize_btns.values(), *predefined_btns.values()], _js=js_code_for_persistent_cookie_init)
|
||||||
|
|
||||||
app_block.load(None, inputs=[], outputs=None, _js=f"""()=>GptAcademicJavaScriptInit("{DARK_MODE}","{INIT_SYS_PROMPT}","{ADD_WAIFU}","{LAYOUT}","{TTS_TYPE}")""") # 配置暗色主题或亮色主题
|
app_block.load(None, inputs=[], outputs=None, _js=f"""()=>GptAcademicJavaScriptInit("{DARK_MODE}","{INIT_SYS_PROMPT}","{ADD_WAIFU}","{LAYOUT}","{TTS_TYPE}")""") # 配置暗色主题或亮色主题
|
||||||
app_block.load(None, inputs=[], outputs=None, _js="""()=>{REP}""".replace("REP", register_advanced_plugin_init_code_arr))
|
app_block.load(None, inputs=[], outputs=None, _js="""()=>{REP}""".replace("REP", register_advanced_plugin_init_arr))
|
||||||
|
|
||||||
# gradio的inbrowser触发不太稳定,回滚代码到原始的浏览器打开函数
|
# gradio的inbrowser触发不太稳定,回滚代码到原始的浏览器打开函数
|
||||||
def run_delayed_tasks():
|
def run_delayed_tasks():
|
||||||
|
|||||||
@@ -1690,24 +1690,67 @@ function close_current_pop_up_plugin(){
|
|||||||
hide_all_elem();
|
hide_all_elem();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 生成高级插件的选择菜单
|
// 生成高级插件的选择菜单
|
||||||
advanced_plugin_init_code_lib = {}
|
plugin_init_info_lib = {}
|
||||||
|
function register_plugin_init(key, base64String){
|
||||||
|
console.log('x')
|
||||||
|
const stringData = atob(base64String);
|
||||||
|
let guiJsonData = JSON.parse(stringData);
|
||||||
|
if (key in plugin_init_info_lib)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plugin_init_info_lib[key] = {};
|
||||||
|
}
|
||||||
|
plugin_init_info_lib[key].info = guiJsonData.Info;
|
||||||
|
plugin_init_info_lib[key].color = guiJsonData.Color;
|
||||||
|
plugin_init_info_lib[key].label = guiJsonData.Label
|
||||||
|
plugin_init_info_lib[key].enable_advanced_arg = guiJsonData.AdvancedArgs;
|
||||||
|
plugin_init_info_lib[key].arg_reminder = guiJsonData.ArgsReminder;
|
||||||
|
}
|
||||||
function register_advanced_plugin_init_code(key, code){
|
function register_advanced_plugin_init_code(key, code){
|
||||||
advanced_plugin_init_code_lib[key] = code;
|
if (key in plugin_init_info_lib)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plugin_init_info_lib[key] = {};
|
||||||
|
}
|
||||||
|
plugin_init_info_lib[key].secondary_menu_code = code;
|
||||||
}
|
}
|
||||||
function run_advanced_plugin_launch_code(key){
|
function run_advanced_plugin_launch_code(key){
|
||||||
// convert js code string to function
|
// convert js code string to function
|
||||||
generate_menu(advanced_plugin_init_code_lib[key], key);
|
generate_menu(plugin_init_info_lib[key].secondary_menu_code, key);
|
||||||
}
|
}
|
||||||
function on_flex_button_click(key){
|
function on_flex_button_click(key){
|
||||||
if (advanced_plugin_init_code_lib.hasOwnProperty(key)){
|
if (plugin_init_info_lib.hasOwnProperty(key) && plugin_init_info_lib[key].hasOwnProperty('secondary_menu_code')){
|
||||||
run_advanced_plugin_launch_code(key);
|
run_advanced_plugin_launch_code(key);
|
||||||
}else{
|
}else{
|
||||||
document.getElementById("old_callback_btn_for_plugin_exe").click();
|
document.getElementById("old_callback_btn_for_plugin_exe").click();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
async function run_dropdown_shift(dropdown){
|
||||||
|
let key = dropdown;
|
||||||
|
push_data_to_gradio_component({
|
||||||
|
value: key,
|
||||||
|
variant: plugin_init_info_lib[key].color,
|
||||||
|
info_str: plugin_init_info_lib[key].info,
|
||||||
|
__type__: 'update'
|
||||||
|
}, "elem_switchy_bt", "obj");
|
||||||
|
|
||||||
|
if (plugin_init_info_lib[key].enable_advanced_arg){
|
||||||
|
push_data_to_gradio_component({
|
||||||
|
visible: true,
|
||||||
|
label: plugin_init_info_lib[key].label,
|
||||||
|
__type__: 'update'
|
||||||
|
}, "advance_arg_input_legacy", "obj");
|
||||||
|
} else {
|
||||||
|
push_data_to_gradio_component({
|
||||||
|
visible: false,
|
||||||
|
label: plugin_init_info_lib[key].label,
|
||||||
|
__type__: 'update'
|
||||||
|
}, "advance_arg_input_legacy", "obj");
|
||||||
|
}
|
||||||
|
}
|
||||||
在新工单中引用
屏蔽一个用户