diff --git a/main.py b/main.py
index 310fa6a3..c250ab29 100644
--- a/main.py
+++ b/main.py
@@ -57,7 +57,7 @@ def main():
# 如果WEB_PORT是-1, 则随机选取WEB端口
PORT = find_free_port() if WEB_PORT <= 0 else WEB_PORT
from check_proxy import get_current_version
- from themes.theme import adjust_theme, advanced_css, theme_declaration, js_code_clear, js_code_show_or_hide, js_code_show_or_hide_group2
+ from themes.theme import adjust_theme, advanced_css, theme_declaration, js_code_clear, js_code_show_or_hide
from themes.theme import js_code_for_toggle_darkmode
from themes.theme import load_dynamic_theme, to_cookie_str, from_cookie_str, assign_user_uuid
title_html = f"
GPT 学术优化 {get_current_version()}
{theme_declaration}"
@@ -210,7 +210,7 @@ def main():
ret.update({area_customize: gr.update(visible=("自定义菜单" in a))})
return ret
checkboxes_2.select(fn_area_visibility_2, [checkboxes_2], [area_customize] )
- checkboxes_2.select(None, [checkboxes_2], None, _js=js_code_show_or_hide_group2)
+ checkboxes_2.select(None, [checkboxes_2], None, _js="""apply_checkbox_change_for_group2""")
# 整理反复出现的控件句柄组合
input_combo = [cookies, max_length_sl, md_dropdown, txt, txt2, top_p, temperature, chatbot, history, system_prompt, plugin_advanced_arg]
diff --git a/request_llms/bridge_openrouter.py b/request_llms/bridge_openrouter.py
index a3fd99b8..07ec4249 100644
--- a/request_llms/bridge_openrouter.py
+++ b/request_llms/bridge_openrouter.py
@@ -512,7 +512,7 @@ def generate_payload(inputs:str, llm_kwargs:dict, history:list, system_prompt:st
model, _ = read_one_api_model_name(model)
if llm_kwargs['llm_model'].startswith('openrouter-'):
model = llm_kwargs['llm_model'][len('openrouter-'):]
- model= read_one_api_model_name(model)
+ model, _= read_one_api_model_name(model)
if model == "gpt-3.5-random": # 随机选择, 绕过openai访问频率限制
model = random.choice([
"gpt-3.5-turbo",
diff --git a/request_llms/oai_std_model_template.py b/request_llms/oai_std_model_template.py
index 08e0990c..a5da92ea 100644
--- a/request_llms/oai_std_model_template.py
+++ b/request_llms/oai_std_model_template.py
@@ -1,16 +1,13 @@
import json
import time
import traceback
+
import requests
from loguru import logger
# config_private.py放自己的秘密如API和代理网址
# 读取时首先看是否存在私密的config_private配置文件(不受git管控),如果有,则覆盖原config文件
-from toolbox import (
- get_conf,
- update_ui,
- is_the_upload_folder,
-)
+from toolbox import get_conf, is_the_upload_folder, update_ui
proxies, TIMEOUT_SECONDS, MAX_RETRY = get_conf(
"proxies", "TIMEOUT_SECONDS", "MAX_RETRY"
@@ -42,11 +39,19 @@ def decode_chunk(chunk):
response = ""
reasoning_content = ""
finish_reason = "False"
+
+ # 考虑返回类型是 text/json 和 text/event-stream 两种
+ if chunk.startswith("data: "):
+ chunk = chunk[6:]
+ else:
+ chunk = chunk
+
try:
- chunk = json.loads(chunk[6:])
+ chunk = json.loads(chunk)
except:
response = ""
finish_reason = chunk
+
# 错误处理部分
if "error" in chunk:
response = "API_ERROR"
@@ -55,7 +60,7 @@ def decode_chunk(chunk):
finish_reason = chunk["error"]["code"]
except:
finish_reason = "API_ERROR"
- return response, finish_reason
+ return response, reasoning_content, finish_reason
try:
if chunk["choices"][0]["delta"]["content"] is not None:
@@ -247,9 +252,9 @@ def get_predict_function(
logger.error(error_msg)
raise RuntimeError("Json解析不合常规")
if reasoning:
- # reasoning 的部分加上框 (>)
- return '\n'.join(map(lambda x: '> ' + x, reasoning_buffer.split('\n'))) + \
- '\n\n' + result
+ return f'''
+ {''.join([f'
{line}
' for line in reasoning_buffer.split('\n')])}
+
\n\n''' + result
return result
def predict(
@@ -367,7 +372,7 @@ def get_predict_function(
chunk_decoded = chunk.decode()
chatbot[-1] = (
chatbot[-1][0],
- "[Local Message] {finish_reason},获得以下报错信息:\n"
+ f"[Local Message] {finish_reason},获得以下报错信息:\n"
+ chunk_decoded,
)
yield from update_ui(
@@ -385,7 +390,9 @@ def get_predict_function(
if reasoning:
gpt_replying_buffer += response_text
gpt_reasoning_buffer += reasoning_content
- history[-1] = '\n'.join(map(lambda x: '> ' + x, gpt_reasoning_buffer.split('\n'))) + '\n\n' + gpt_replying_buffer
+ history[-1] = f'''
+ {''.join([f'
{line}
' for line in gpt_reasoning_buffer.split('\n')])}
+
\n\n''' + gpt_replying_buffer
else:
gpt_replying_buffer += response_text
# 如果这里抛出异常,一般是文本过长,详情见get_full_error的输出
diff --git a/themes/gui_toolbar.py b/themes/gui_toolbar.py
index 703edcfb..072fbfe3 100644
--- a/themes/gui_toolbar.py
+++ b/themes/gui_toolbar.py
@@ -26,8 +26,8 @@ def define_gui_toolbar(AVAIL_LLM_MODELS, LLM_MODEL, INIT_SYS_PROMPT, THEME, AVAI
fontfamily_dropdown = gr.Dropdown(AVAIL_FONTS, value=get_conf("FONT"), elem_id="elem_fontfamily", label="更换字体类型").style(container=False)
fontsize_slider = gr.Slider(minimum=5, maximum=25, value=15, step=1, interactive=True, label="字体大小(默认15)", elem_id="elem_fontsize")
checkboxes = gr.CheckboxGroup(["基础功能区", "函数插件区", "浮动输入区", "输入清除键", "插件参数区"], value=["基础功能区", "函数插件区"], label="显示/隐藏功能区", elem_id='cbs').style(container=False)
- opt = ["自定义菜单"]
- value=[]
+ opt = ["自定义菜单", "主标题", "副标题", "显示logo"]
+ value=["主标题", "副标题", "显示logo"]
if ADD_WAIFU: opt += ["添加Live2D形象"]; value += ["添加Live2D形象"]
checkboxes_2 = gr.CheckboxGroup(opt, value=value, label="显示/隐藏自定义菜单", elem_id='cbsc').style(container=False)
dark_mode_btn = gr.Button("切换界面明暗 ☀", variant="secondary").style(size="sm")
diff --git a/themes/init.js b/themes/init.js
index 5d7de63b..06cb5616 100644
--- a/themes/init.js
+++ b/themes/init.js
@@ -128,6 +128,14 @@ function gpt_academic_change_chatbot_font(fontfamily, fontsize, fontcolor) {
}
}
+function footer_show_hide(show) {
+ if (show) {
+ document.querySelector('footer').style.display = '';
+ } else {
+ document.querySelector('footer').style.display = 'none';
+ }
+}
+
async function GptAcademicJavaScriptInit(dark, prompt, live2d, layout, tts) {
// 第一部分,布局初始化
remove_legacy_cookie();
@@ -179,6 +187,7 @@ async function GptAcademicJavaScriptInit(dark, prompt, live2d, layout, tts) {
}
}
}
+
// 字体
gpt_academic_gradio_saveload("load", "elem_fontfamily", "js_fontfamily", null, "str");
gpt_academic_change_chatbot_font(getCookie("js_fontfamily"), null, null);
@@ -205,7 +214,93 @@ async function GptAcademicJavaScriptInit(dark, prompt, live2d, layout, tts) {
}
-
+ if (getCookie("js_show_title")) {
+ // have cookie
+ bool_value = getCookie("js_show_title")
+ bool_value = bool_value == "True";
+ searchString = "主标题";
+ tool_bar_group = "cbsc";
+ const true_function = function () {
+ document.querySelector('.prose.svelte-1ybaih5 h1').style.display = '';
+ }
+ const false_function = function () {
+ document.querySelector('.prose.svelte-1ybaih5 h1').style.display = 'none';
+ }
+ if (bool_value) {
+ // make btns appear
+ true_function();
+ // deal with checkboxes
+ let arr_with_clear_btn = update_array(
+ await get_data_from_gradio_component(tool_bar_group), searchString, "add"
+ )
+ push_data_to_gradio_component(arr_with_clear_btn, tool_bar_group, "no_conversion");
+ } else {
+ false_function();
+ // deal with checkboxes
+ let arr_without_clear_btn = update_array(
+ await get_data_from_gradio_component(tool_bar_group), searchString, "remove"
+ )
+ push_data_to_gradio_component(arr_without_clear_btn, tool_bar_group, "no_conversion");
+ }
+ }
+ if (getCookie("js_show_subtitle")) {
+ // have cookie
+ bool_value = getCookie("js_show_subtitle")
+ bool_value = bool_value == "True";
+ searchString = "副标题";
+ tool_bar_group = "cbsc";
+ const true_function = function () {
+ element = document.querySelector('.prose.svelte-1ybaih5 h2');
+ if (element) element.style.display = '';
+ element = document.querySelector('.prose.svelte-1ybaih5 h6');
+ if (element) element.style.display = '';
+ }
+ const false_function = function () {
+ element = document.querySelector('.prose.svelte-1ybaih5 h2');
+ if (element) element.style.display = 'none';
+ element = document.querySelector('.prose.svelte-1ybaih5 h6');
+ if (element) element.style.display = 'none';
+ }
+ if (bool_value) {
+ // make btns appear
+ true_function();
+ // deal with checkboxes
+ let arr_with_clear_btn = update_array(
+ await get_data_from_gradio_component(tool_bar_group), searchString, "add"
+ )
+ push_data_to_gradio_component(arr_with_clear_btn, tool_bar_group, "no_conversion");
+ } else {
+ false_function();
+ // deal with checkboxes
+ let arr_without_clear_btn = update_array(
+ await get_data_from_gradio_component(tool_bar_group), searchString, "remove"
+ )
+ push_data_to_gradio_component(arr_without_clear_btn, tool_bar_group, "no_conversion");
+ }
+ }
+ if (getCookie("js_show_footer")) {
+ // have cookie
+ bool_value = getCookie("js_show_footer")
+ searchString = "显示logo";
+ tool_bar_group = "cbsc";
+ bool_value = bool_value == "True";
+ if (bool_value) {
+ // make btns appear
+ footer_show_hide(true);
+ // deal with checkboxes
+ let arr_with_clear_btn = update_array(
+ await get_data_from_gradio_component(tool_bar_group), searchString, "add"
+ )
+ push_data_to_gradio_component(arr_with_clear_btn, tool_bar_group, "no_conversion");
+ } else {
+ footer_show_hide(false);
+ // deal with checkboxes
+ let arr_without_clear_btn = update_array(
+ await get_data_from_gradio_component(tool_bar_group), searchString, "remove"
+ )
+ push_data_to_gradio_component(arr_without_clear_btn, tool_bar_group, "no_conversion");
+ }
+ }
// clearButton 自动清除按钮
if (getCookie("js_clearbtn_show_cookie")) {
// have cookie
@@ -219,7 +314,7 @@ async function GptAcademicJavaScriptInit(dark, prompt, live2d, layout, tts) {
let clearButton2 = document.getElementById("elem_clear2"); clearButton2.style.display = "block";
// deal with checkboxes
let arr_with_clear_btn = update_array(
- await get_data_from_gradio_component('cbs'), "输入清除键", "add"
+ await get_data_from_gradio_component("cbs"), "输入清除键", "add"
)
push_data_to_gradio_component(arr_with_clear_btn, "cbs", "no_conversion");
} else {
@@ -228,7 +323,7 @@ async function GptAcademicJavaScriptInit(dark, prompt, live2d, layout, tts) {
let clearButton2 = document.getElementById("elem_clear2"); clearButton2.style.display = "none";
// deal with checkboxes
let arr_without_clear_btn = update_array(
- await get_data_from_gradio_component('cbs'), "输入清除键", "remove"
+ await get_data_from_gradio_component("cbs"), "输入清除键", "remove"
)
push_data_to_gradio_component(arr_without_clear_btn, "cbs", "no_conversion");
}
@@ -268,3 +363,47 @@ async function GptAcademicJavaScriptInit(dark, prompt, live2d, layout, tts) {
change_theme("", "")
}
+
+
+
+function apply_checkbox_change_for_group2(display_panel_arr) {
+ setTimeout(() => {
+ display_panel_arr = get_checkbox_selected_items("cbsc");
+
+ let searchString = "添加Live2D形象";
+ if (display_panel_arr.includes(searchString)) {
+ setCookie("js_live2d_show_cookie", "True", 365);
+ loadLive2D();
+ } else {
+ try {
+ setCookie("js_live2d_show_cookie", "False", 365);
+ $('.waifu').hide();
+ } catch (e) {
+ }
+ }
+
+
+ function handleDisplay(searchString, key, displayElement, showFn, hideFn) {
+ if (display_panel_arr.includes(searchString)) {
+ setCookie(key, "True", 365);
+ if (showFn) showFn();
+ if (displayElement) displayElement.style.display = '';
+ } else {
+ setCookie(key, "False", 365);
+ if (hideFn) hideFn();
+ if (displayElement) displayElement.style.display = 'none';
+ }
+ }
+
+ // 主标题
+ const mainTitle = document.querySelector('.prose.svelte-1ybaih5 h1');
+ handleDisplay("主标题", "js_show_title", mainTitle, null, null);
+
+ // 副标题
+ const subTitle = document.querySelector('.prose.svelte-1ybaih5 h2');
+ handleDisplay("副标题", "js_show_subtitle", subTitle, null, null);
+
+ // 显示logo
+ handleDisplay("显示logo", "js_show_footer", null, () => footer_show_hide(true), () => footer_show_hide(false));
+ }, 50);
+}
\ No newline at end of file
diff --git a/themes/theme.py b/themes/theme.py
index 4ad83e8d..fb217d47 100644
--- a/themes/theme.py
+++ b/themes/theme.py
@@ -141,23 +141,3 @@ setTimeout(() => {
}
"""
-
-
-js_code_show_or_hide_group2 = """
-(display_panel_arr)=>{
-setTimeout(() => {
- display_panel_arr = get_checkbox_selected_items("cbsc");
-
- let searchString = "添加Live2D形象";
- let ele = "none";
- if (display_panel_arr.includes(searchString)) {
- setCookie("js_live2d_show_cookie", "True", 365);
- loadLive2D();
- } else {
- setCookie("js_live2d_show_cookie", "False", 365);
- $('.waifu').hide();
- }
-
-}, 50);
-}
-"""