From c38a532658c4ba4a806dca5340811ec9377e20a9 Mon Sep 17 00:00:00 2001 From: w_xiaolizu Date: Mon, 26 Jun 2023 22:19:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=B7=9D=E8=99=8EUI=20?= =?UTF-8?q?=E7=BB=86=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __main__.py | 53 +- crazy_functional.py | 3 +- docs/assets/custom.css | 40 +- docs/assets/custom.js | 518 ++++++++++++++ docs/assets/custom_2.css | 810 ++++++++++++++++++++++ docs/assets/external-scripts.js | 2 + docs/assets/favicon.ico | Bin 0 -> 78769 bytes docs/assets/html/appearance_switcher.html | 11 + docs/assets/html/billing_info.html | 9 + docs/assets/html/footer.html | 1 + theme.py | 132 ++-- toolbox.py | 3 +- 12 files changed, 1468 insertions(+), 114 deletions(-) create mode 100644 docs/assets/custom.js create mode 100644 docs/assets/custom_2.css create mode 100644 docs/assets/external-scripts.js create mode 100644 docs/assets/favicon.ico create mode 100644 docs/assets/html/appearance_switcher.html create mode 100644 docs/assets/html/billing_info.html create mode 100644 docs/assets/html/footer.html diff --git a/__main__.py b/__main__.py index cecd9f6..f034a9f 100644 --- a/__main__.py +++ b/__main__.py @@ -75,13 +75,14 @@ class ChatBot(ChatBotFrame): self.chatbot = gr.Chatbot(elem_id='main_chatbot', label=f"当前模型:{LLM_MODEL}") self.chatbot.style() self.history = gr.State([]) - temp_draw = [gr.HTML() for i in range(4)] + temp_draw = [gr.HTML() for i in range(2)] with gr.Row(): self.txt = gr.Textbox(show_label=False, placeholder="Input question here.", elem_id='chat_txt').style(container=False) self.input_copy = gr.State('') - self.submitBtn = gr.Button("提交", variant="primary", visible=False).style(full_width=False) - with gr.Row(elem_id='debug_mes'): - self.status = gr.Markdown(f"Tip: 按Enter提交, 按Shift+Enter换行。当前模型: {LLM_MODEL} \n {proxy_info}") + self.submitBtn = gr.Button("", variant="primary", elem_classes='submit_btn').style(full_width=False) + with gr.Row(): + self.status = gr.Markdown(f"Tip: 按Enter提交, 按Shift+Enter换行\n {proxy_info}", elem_id='debug_mes') + def draw_examples(self): with gr.Column(elem_id='examples_col') as self.examples_column: @@ -119,7 +120,7 @@ class ChatBot(ChatBotFrame): self.area_crazy_fn]) def __clear_input(self, inputs): - return '', inputs + return '', inputs, self.examples_column.update(visible=False) def draw_prompt(self): with gr.Row(): @@ -137,7 +138,7 @@ class ChatBot(ChatBotFrame): with gr.Row(): with gr.Column(scale=100): self.pro_results = gr.Chatbot(label='Prompt and result', elem_id='prompt_result').style() - with gr.Column(scale=11): + with gr.Column(scale=16): Tips = "用 BORF 分析法设计chat GPT prompt:\n" \ "1、阐述背景 B(Background): 说明背景,为chatGPT提供充足的信息\n" \ "2、定义目标 O(Objectives):“我们希望实现什么”\n" \ @@ -182,16 +183,12 @@ class ChatBot(ChatBotFrame): self.pro_reuse_btn.click( fn=func_box.reuse_chat, inputs=[self.pro_results, self.chatbot, self.history, self.pro_name_txt], - outputs=[self.chatbot, self.history, self.txt, self.tabs_chatbot, self.pro_name_txt] + outputs=[self.chatbot, self.history, self.txt, self.tabs_chatbot, self.pro_name_txt, self.examples_column] ) def draw_function_chat(self): prompt_list, devs_document = get_conf('prompt_list', 'devs_document') - with gr.Row(): - # self.cpopyBtn = gr.Button("复制回答", variant="secondary").style(size="sm") - self.resetBtn = gr.Button("新建对话", variant="secondary", elem_id='empty_btn').style(size="sm") - self.stopBtn = gr.Button("中止对话", variant="stop").style(size="sm") - with gr.Tab('Function'): + with gr.TabItem('Function', id='func_tab'): with gr.Accordion("基础功能区", open=False) as self.area_basic_fn: with gr.Row(): for k in functional: @@ -224,7 +221,7 @@ class ChatBot(ChatBotFrame): self.prompt_tab.select(fn=lambda: 1, inputs=None, outputs=self.tabs_code) def draw_public_chat(self): - with gr.Tab('Plugins'): + with gr.TabItem('Plugins', id='plug_tab'): with gr.Accordion("上传本地文件可供高亮函数插件调用", open=False) as self.area_file_up: self.file_upload = gr.Files(label="任何文件, 但推荐上传压缩文件(zip, tar)", file_count="multiple") @@ -255,7 +252,7 @@ class ChatBot(ChatBotFrame): def draw_setting_chat(self): switch_model = get_conf('switch_model')[0] - with gr.Tab('Settings'): + with gr.TabItem('Settings', id='sett_tab'): self.top_p = gr.Slider(minimum=-0, maximum=1.0, value=1.0, step=0.01, interactive=True, label="Top-p (nucleus sampling)", ).style(container=False) self.temperature = gr.Slider(minimum=-0, maximum=2.0, value=1.0, step=0.01, interactive=True, @@ -305,7 +302,8 @@ class ChatBot(ChatBotFrame): self.system_prompt, self.models_box, self.plugin_advanced_arg] self.output_combo = [self.cookies, self.chatbot, self.history, self.status] self.predict_args = dict(fn=ArgsGeneralWrapper(predict), inputs=self.input_combo, outputs=self.output_combo) - self.clear_agrs = dict(fn=self.__clear_input, inputs=[self.txt], outputs=[self.txt, self.input_copy]) + self.clear_agrs = dict(fn=self.__clear_input, inputs=[self.txt], outputs=[self.txt, self.input_copy, + self.examples_column]) # 提交按钮、重置按钮 self.cancel_handles.append(self.txt.submit(**self.clear_agrs).then(**self.predict_args)) self.cancel_handles.append(self.submitBtn.click(**self.clear_agrs).then(**self.predict_args)) @@ -340,7 +338,7 @@ class ChatBot(ChatBotFrame): def on_dropdown_changed(k): # 按钮颜色随变 variant = crazy_fns[k]["Color"] if "Color" in crazy_fns[k] else "secondary" - ret = {self.switchy_bt: gr.update(value=k, variant=variant)} + ret = {self.switchy_bt: self.switchy_bt.update(value=k, variant=variant)} # 参数取随变 fns_value = func_box.txt_converter_json(str(crazy_fns[k].get('Parameters', ''))) fns_lable = f"插件[{k}]的高级参数说明:\n" + crazy_fns[k].get("ArgsReminder", f"没有提供高级参数功能说明") @@ -375,13 +373,12 @@ class ChatBot(ChatBotFrame): self.md_dropdown.select(on_md_dropdown_changed, [self.md_dropdown], [self.chatbot]) def signals_auto_input(self): - from autogpt.cli import agent_main self.auto_input_combo = [self.ai_name, self.ai_role, self.ai_goal_list, self.ai_budget, self.cookies, self.chatbot, self.history, self.agent_obj] self.auto_output_combo = [self.cookies, self.chatbot, self.history, self.status, self.agent_obj, self.submit_start, self.submit_next, self.text_continue] - self.submit_start.click(fn=agent_main, inputs=self.auto_input_combo, outputs=self.auto_output_combo) + # gradio的inbrowser触发不太稳定,回滚代码到原始的浏览器打开函数 def auto_opentab_delay(self, is_open=False): @@ -408,13 +405,19 @@ class ChatBot(ChatBotFrame): # 绘制一个ROW,row会让底下的元素自动排成一行 with gr.Row().style(justify='between'): # 绘制列1 - with gr.Column(scale=46): + with gr.Column(scale=44): with gr.Tabs() as self.tabs_copilot: # 绘制对话模组 with gr.TabItem('Chat-Copilot'): - self.draw_function_chat() - self.draw_public_chat() - self.draw_setting_chat() + with gr.Row(): + # self.cpopyBtn = gr.Button("复制回答", variant="secondary").style(size="sm") + self.resetBtn = gr.Button("新建对话", variant="secondary", elem_id='empty_btn').style( + size="sm") + self.stopBtn = gr.Button("中止对话", variant="stop").style(size="sm") + with gr.Tabs() as self.tabs_inputs: + self.draw_function_chat() + self.draw_public_chat() + self.draw_setting_chat() # 绘制autogpt模组 with gr.TabItem('Auto-GPT'): @@ -431,6 +434,7 @@ class ChatBot(ChatBotFrame): with self.chat_tab: # 使用 gr.State()对组件进行拷贝时,如果之前绘制了Markdown格式,会导致启动崩溃,所以将 markdown相关绘制放在最后 self.draw_chatbot() + self.draw_examples() with self.prompt_tab: self.draw_temp_edit() # 函数注册,需要在Blocks下进行 @@ -440,7 +444,10 @@ class ChatBot(ChatBotFrame): self.signals_public() self.signals_prompt_edit() # self.signals_auto_input() - self.demo.load(fn=func_box.refresh_load_data, postprocess=False, inputs=[self.chatbot, self.history, self.pro_fp_state], outputs=[self.pro_func_prompt, self.pro_fp_state, self.chatbot, self.history, ]) + adv_plugins = gr.State([i for i in crazy_fns]) + self.demo.load(fn=func_box.refresh_load_data, postprocess=False, + inputs=[self.chatbot, self.history, self.pro_fp_state, adv_plugins], + outputs=[self.pro_func_prompt, self.pro_fp_state, self.chatbot, self.history, self.guidance_plugins, self.guidance_plugins_state]) # Start self.auto_opentab_delay() diff --git a/crazy_functional.py b/crazy_functional.py index 7812e53..7fe51ba 100644 --- a/crazy_functional.py +++ b/crazy_functional.py @@ -25,7 +25,6 @@ def get_crazy_functions(): from crazy_functions.对话历史存档 import 对话历史存档 from crazy_functions.对话历史存档 import 载入对话历史存档 from crazy_functions.对话历史存档 import 删除所有本地对话历史记录 - from crazy_functions.批量Markdown翻译 import Markdown英译中 function_plugins = { "猜你想问": { @@ -36,6 +35,7 @@ def get_crazy_functions(): "AsButton": False, "Function": HotReload(解析一个Python项目) }, + "保存当前的对话": { "AsButton": True, "Function": HotReload(对话历史存档) @@ -49,6 +49,7 @@ def get_crazy_functions(): "AsButton":False, "Function": HotReload(删除所有本地对话历史记录) }, + "[测试功能] 解析Jupyter Notebook文件": { "Color": "stop", "AsButton": False, diff --git a/docs/assets/custom.css b/docs/assets/custom.css index d02134b..390ae84 100644 --- a/docs/assets/custom.css +++ b/docs/assets/custom.css @@ -32,12 +32,12 @@ mspace { } #examples_col { - z-index: 3; + z-index: 2; position: absolute; bottom: 0; left: 0; width: 100%; - margin-bottom: 30% !important; + margin-bottom: 20% !important; } #hide_examples { z-index: 0; @@ -48,7 +48,6 @@ mspace { display: flex; bottom: 0; left: 0; - width: 100%; z-index: 1; /* 设置更高的 z-index 值 */ margin-bottom: -4px !important; } @@ -148,10 +147,25 @@ footer { background: var(--color-accent); padding: var(--block-label-padding); font-size: var(--block-label-text-size); line-height: var(--line-sm); - width: auto; min-height: 30px!important; + width: auto; min-height: 30px !important; opacity: 1; transition: opacity 0.3s ease-in-out; } +textarea.svelte-1pie7s6 { + background: #e7e6e6 !important; +} + +.dark textarea.svelte-1pie7s6 { + background: var(--input-background-fill) !important; +} + +.dark input[type=number].svelte-1cl284s { + background: #393939 !important; + border: var(--input-border-width) solid var(--input-border-color) !important; +} +.dark input[type="range"] { + background: #393939 !important; +} #user_info .wrap { opacity: 0; } @@ -167,31 +181,29 @@ footer { gap: 7px !important; border-radius: var(--radius-xl) !important } -/* status_display */ -#status_display { - display: flex; +/* debug_mes */ +#debug_mes { min-height: 2em; align-items: flex-end; justify-content: flex-end; } -#status_display p { +#debug_mes p { font-size: .85em; font-family: ui-monospace, "SF Mono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "Microsoft Yahei UI", "Microsoft Yahei", monospace; /* Windows下中文的monospace会fallback为新宋体,实在太丑,这里折中使用微软雅黑 */ - color: var(--body-text-color-subdued); + color: #000000; +} +.dark #debug_mes p { + color: #ee65ed; } -#status_display { +#debug_mes { transition: all 0.6s; } #main_chatbot { transition: height 0.3s ease; } -span.svelte-1gfkn6j { - background: unset !important; -} - .wrap.svelte-18telvq.svelte-18telvq { padding: var(--block-padding) !important; height: 100% !important; diff --git a/docs/assets/custom.js b/docs/assets/custom.js new file mode 100644 index 0000000..84e0068 --- /dev/null +++ b/docs/assets/custom.js @@ -0,0 +1,518 @@ + +// custom javascript here + +const MAX_HISTORY_LENGTH = 32; + +var key_down_history = []; +var currentIndex = -1; +var user_input_ta; + +var gradioContainer = null; +var user_input_ta = null; +var chat_txt = null; +var userInfoDiv = null; +var appTitleDiv = null; +var chatbot = null; +var chatbotWrap = null; +var apSwitch = null; +var messageBotDivs = null; +var loginUserForm = null; +var logginUser = null; + +var userLogged = false; +var usernameGotten = false; +var historyLoaded = false; + +var ga = document.getElementsByTagName("gradio-app"); +var targetNode = ga[0]; +var isInIframe = (window.self !== window.top); +var language = navigator.language.slice(0,2); + +var forView_i18n = { + 'zh': "仅供查看", + 'en': "For viewing only", + 'ja': "閲覧専用", + 'fr': "Pour consultation seulement", + 'es': "Solo para visualización", +}; + +var deleteConfirm_i18n_pref = { + 'zh': "你真的要删除 ", + 'en': "Are you sure you want to delete ", + 'ja': "本当に ", +}; +var deleteConfirm_i18n_suff = { + 'zh': " 吗?", + 'en': " ?", + 'ja': " を削除してもよろしいですか?", +}; +var deleteConfirm_msg_pref = "Are you sure you want to delete "; +var deleteConfirm_msg_suff = " ?"; + +// gradio 页面加载好了么??? 我能动你的元素了么?? +function gradioLoaded(mutations) { + for (var i = 0; i < mutations.length; i++) { + if (mutations[i].addedNodes.length) { + loginUserForm = document.querySelector(".gradio-container > .main > .wrap > .panel > .form") + gradioContainer = document.querySelector(".gradio-container"); + chat_txt = document.getElementById('chat_txt'); + userInfoDiv = document.getElementById("user_info"); + appTitleDiv = document.getElementById("app_title"); + chatbot = document.querySelector('#main_chatbot'); + chatbotWrap = document.querySelector('#main_chatbot > .wrap'); + apSwitch = document.querySelector('.apSwitch input[type="checkbox"]'); + + if (loginUserForm) { + localStorage.setItem("userLogged", true); + userLogged = true; + } + + if (gradioContainer && apSwitch) { // gradioCainter 加载出来了没? + adjustDarkMode(); + } + if (chat_txt) { // chat_txt 加载出来了没? + selectHistory(); + } + if (userInfoDiv && appTitleDiv) { // userInfoDiv 和 appTitleDiv 加载出来了没? + if (!usernameGotten) { + getUserInfo(); + } + setTimeout(showOrHideUserInfo(), 2000); + } + if (chatbot) { // chatbot 加载出来了没? + setChatbotHeight(); + } + if (chatbotWrap) { + if (!historyLoaded) { + loadHistoryHtml(); + } + setChatbotScroll(); + } + } + } +} + +function webLocale() { + // console.log("webLocale", language); + if (forView_i18n.hasOwnProperty(language)) { + var forView = forView_i18n[language]; + var forViewStyle = document.createElement('style'); + forViewStyle.innerHTML = '.wrap>.history-message>:last-child::after { content: "' + forView + '"!important; }'; + document.head.appendChild(forViewStyle); + } + if (deleteConfirm_i18n_pref.hasOwnProperty(language)) { + deleteConfirm_msg_pref = deleteConfirm_i18n_pref[language]; + deleteConfirm_msg_suff = deleteConfirm_i18n_suff[language]; + } +} + +function showConfirmationDialog(a, file, c) { + if (file != "") { + var result = confirm(deleteConfirm_msg_pref + file + deleteConfirm_msg_suff); + if (result) { + return [a, file, c]; + } + } + return [a, "CANCELED", c]; +} + +function selectHistory() { + user_input_ta = chat_txt.querySelector("textarea"); + if (user_input_ta) { + observer.disconnect(); // 停止监听 + // 在 textarea 上监听 keydown 事件 + user_input_ta.addEventListener("keydown", function (event) { + var value = user_input_ta.value.trim(); + // 判断按下的是否为方向键 + if (event.code === 'ArrowUp' || event.code === 'ArrowDown') { + // 如果按下的是方向键,且输入框中有内容,且历史记录中没有该内容,则不执行操作 + if (value && key_down_history.indexOf(value) === -1) + return; + // 对于需要响应的动作,阻止默认行为。 + event.preventDefault(); + var length = key_down_history.length; + if (length === 0) { + currentIndex = -1; // 如果历史记录为空,直接将当前选中的记录重置 + return; + } + if (currentIndex === -1) { + currentIndex = length; + } + if (event.code === 'ArrowUp' && currentIndex > 0) { + currentIndex--; + user_input_ta.value = key_down_history[currentIndex]; + } else if (event.code === 'ArrowDown' && currentIndex < length - 1) { + currentIndex++; + user_input_ta.value = key_down_history[currentIndex]; + } + user_input_ta.selectionStart = user_input_ta.value.length; + user_input_ta.selectionEnd = user_input_ta.value.length; + const input_event = new InputEvent("input", { bubbles: true, cancelable: true }); + user_input_ta.dispatchEvent(input_event); + } else if (event.code === "Enter") { + if (value) { + currentIndex = -1; + if (key_down_history.indexOf(value) === -1) { + key_down_history.push(value); + if (key_down_history.length > MAX_HISTORY_LENGTH) { + key_down_history.shift(); + } + } + } + } + }); + } +} + +var username = null; +function getUserInfo() { + if (usernameGotten) { + return; + } + userLogged = localStorage.getItem('userLogged'); + if (userLogged) { + username = userInfoDiv.innerText; + if (username) { + if (username.includes("getting user info…")) { + setTimeout(getUserInfo, 500); + return; + } else if (username === " ") { + localStorage.removeItem("username"); + localStorage.removeItem("userLogged") + userLogged = false; + usernameGotten = true; + return; + } else { + username = username.match(/User:\s*(.*)/)[1] || username; + localStorage.setItem("username", username); + usernameGotten = true; + clearHistoryHtml(); + } + } + } +} + +function toggleUserInfoVisibility(shouldHide) { + if (userInfoDiv) { + if (shouldHide) { + userInfoDiv.classList.add("hideK"); + } else { + userInfoDiv.classList.remove("hideK"); + } + } +} +function showOrHideUserInfo() { + var sendBtn = document.getElementById("submit_btn"); + + // Bind mouse/touch events to show/hide user info + appTitleDiv.addEventListener("mouseenter", function () { + toggleUserInfoVisibility(false); + }); + userInfoDiv.addEventListener("mouseenter", function () { + toggleUserInfoVisibility(false); + }); + sendBtn.addEventListener("mouseenter", function () { + toggleUserInfoVisibility(false); + }); + + appTitleDiv.addEventListener("mouseleave", function () { + toggleUserInfoVisibility(true); + }); + userInfoDiv.addEventListener("mouseleave", function () { + toggleUserInfoVisibility(true); + }); + sendBtn.addEventListener("mouseleave", function () { + toggleUserInfoVisibility(true); + }); + + appTitleDiv.ontouchstart = function () { + toggleUserInfoVisibility(false); + }; + userInfoDiv.ontouchstart = function () { + toggleUserInfoVisibility(false); + }; + sendBtn.ontouchstart = function () { + toggleUserInfoVisibility(false); + }; + + appTitleDiv.ontouchend = function () { + setTimeout(function () { + toggleUserInfoVisibility(true); + }, 3000); + }; + userInfoDiv.ontouchend = function () { + setTimeout(function () { + toggleUserInfoVisibility(true); + }, 3000); + }; + sendBtn.ontouchend = function () { + setTimeout(function () { + toggleUserInfoVisibility(true); + }, 3000); // Delay 1 second to hide user info + }; + + // Hide user info after 2 second + setTimeout(function () { + toggleUserInfoVisibility(true); + }, 2000); +} + +function toggleDarkMode(isEnabled) { + if (isEnabled) { + document.body.classList.add("dark"); + document.body.style.setProperty("background-color", "var(--neutral-950)", "important"); + } else { + document.body.classList.remove("dark"); + document.body.style.backgroundColor = ""; + } +} +function adjustDarkMode() { + const darkModeQuery = window.matchMedia("(prefers-color-scheme: dark)"); + + // 根据当前颜色模式设置初始状态 + apSwitch.checked = darkModeQuery.matches; + toggleDarkMode(darkModeQuery.matches); + // 监听颜色模式变化 + darkModeQuery.addEventListener("change", (e) => { + apSwitch.checked = e.matches; + toggleDarkMode(e.matches); + }); + // apSwitch = document.querySelector('.apSwitch input[type="checkbox"]'); + apSwitch.addEventListener("change", (e) => { + toggleDarkMode(e.target.checked); + }); +} + +function setChatbotHeight() { + const screenWidth = window.innerWidth; + const statusDisplay = document.querySelector('#status_display'); + const statusDisplayHeight = statusDisplay ? statusDisplay.offsetHeight : 0; + const wrap = chatbot.querySelector('.wrap'); + const vh = window.innerHeight * 0.01; + document.documentElement.style.setProperty('--vh', `${vh}px`); + if (isInIframe) { + chatbot.style.height = `700px`; + wrap.style.maxHeight = `calc(700px - var(--line-sm) * 1rem - 2 * var(--block-label-margin))` + } else { + if (screenWidth <= 320) { + chatbot.style.height = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 150}px)`; + wrap.style.maxHeight = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 150}px - var(--line-sm) * 1rem - 2 * var(--block-label-margin))`; + } else if (screenWidth <= 499) { + chatbot.style.height = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 100}px)`; + wrap.style.maxHeight = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 100}px - var(--line-sm) * 1rem - 2 * var(--block-label-margin))`; + } else { + chatbot.style.height = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 160}px)`; + wrap.style.maxHeight = `calc(var(--vh, 1vh) * 100 - ${statusDisplayHeight + 160}px - var(--line-sm) * 1rem - 2 * var(--block-label-margin))`; + } + } +} +function setChatbotScroll() { + var scrollHeight = chatbotWrap.scrollHeight; + chatbotWrap.scrollTo(0,scrollHeight) +} +var rangeInputs = null; +var numberInputs = null; +function setSlider() { + rangeInputs = document.querySelectorAll('input[type="range"]'); + numberInputs = document.querySelectorAll('input[type="number"]') + setSliderRange(); + rangeInputs.forEach(rangeInput => { + rangeInput.addEventListener('input', setSliderRange); + }); + numberInputs.forEach(numberInput => { + numberInput.addEventListener('input', setSliderRange); + }) +} +function setSliderRange() { + var range = document.querySelectorAll('input[type="range"]'); + range.forEach(range => { + range.style.backgroundSize = (range.value - range.min) / (range.max - range.min) * 100 + '% 100%'; + }); +} + +function addChuanhuButton(botElement) { + var rawMessage = null; + var mdMessage = null; + rawMessage = botElement.querySelector('.raw-message'); + mdMessage = botElement.querySelector('.md-message'); + if (!rawMessage) { + var buttons = botElement.querySelectorAll('button.chuanhu-btn'); + for (var i = 0; i < buttons.length; i++) { + buttons[i].parentNode.removeChild(buttons[i]); + } + return; + } + var copyButton = null; + var toggleButton = null; + copyButton = botElement.querySelector('button.copy-bot-btn'); + toggleButton = botElement.querySelector('button.toggle-md-btn'); + if (copyButton) copyButton.remove(); + if (toggleButton) toggleButton.remove(); + + // Copy bot button + var copyButton = document.createElement('button'); + copyButton.classList.add('chuanhu-btn'); + copyButton.classList.add('copy-bot-btn'); + copyButton.setAttribute('aria-label', 'Copy'); + copyButton.innerHTML = copyIcon; + copyButton.addEventListener('click', () => { + const textToCopy = rawMessage.innerText; + navigator.clipboard + .writeText(textToCopy) + .then(() => { + copyButton.innerHTML = copiedIcon; + setTimeout(() => { + copyButton.innerHTML = copyIcon; + }, 1500); + }) + .catch(() => { + console.error("copy failed"); + }); + }); + botElement.appendChild(copyButton); + + // Toggle button + var toggleButton = document.createElement('button'); + toggleButton.classList.add('chuanhu-btn'); + toggleButton.classList.add('toggle-md-btn'); + toggleButton.setAttribute('aria-label', 'Toggle'); + var renderMarkdown = mdMessage.classList.contains('hideM'); + toggleButton.innerHTML = renderMarkdown ? mdIcon : rawIcon; + toggleButton.addEventListener('click', () => { + renderMarkdown = mdMessage.classList.contains('hideM'); + if (renderMarkdown){ + renderMarkdownText(botElement); + toggleButton.innerHTML=rawIcon; + } else { + removeMarkdownText(botElement); + toggleButton.innerHTML=mdIcon; + } + }); + botElement.insertBefore(toggleButton, copyButton); +} + +function renderMarkdownText(message) { + var mdDiv = message.querySelector('.md-message'); + if (mdDiv) mdDiv.classList.remove('hideM'); + var rawDiv = message.querySelector('.raw-message'); + if (rawDiv) rawDiv.classList.add('hideM'); +} +function removeMarkdownText(message) { + var rawDiv = message.querySelector('.raw-message'); + if (rawDiv) rawDiv.classList.remove('hideM'); + var mdDiv = message.querySelector('.md-message'); + if (mdDiv) mdDiv.classList.add('hideM'); +} + +let timeoutId; +let isThrottled = false; +var mmutation +// 监听所有元素中 bot message 的变化,为 bot 消息添加复制按钮。 +var mObserver = new MutationObserver(function (mutationsList) { + for (mmutation of mutationsList) { + if (mmutation.type === 'childList') { + for (var node of mmutation.addedNodes) { + if (node.nodeType === 1 && node.classList.contains('message') && node.getAttribute('data-testid') === 'bot') { + saveHistoryHtml(); + document.querySelectorAll('#main_chatbot>.wrap>.message-wrap .message.bot').forEach(addChuanhuButton); + } + if (node.tagName === 'INPUT' && node.getAttribute('type') === 'range') { + setSlider(); + } + } + for (var node of mmutation.removedNodes) { + if (node.nodeType === 1 && node.classList.contains('message') && node.getAttribute('data-testid') === 'bot') { + saveHistoryHtml(); + document.querySelectorAll('#main_chatbot>.wrap>.message-wrap .message.bot').forEach(addChuanhuButton); + } + } + } else if (mmutation.type === 'attributes') { + if (mmutation.target.nodeType === 1 && mmutation.target.classList.contains('message') && mmutation.target.getAttribute('data-testid') === 'bot') { + if (isThrottled) break; // 为了防止重复不断疯狂渲染,加上等待_(:з」∠)_ + isThrottled = true; + clearTimeout(timeoutId); + timeoutId = setTimeout(() => { + isThrottled = false; + document.querySelectorAll('#main_chatbot>.wrap>.message-wrap .message.bot').forEach(addChuanhuButton); + saveHistoryHtml(); + }, 500); + } + } + } +}); +mObserver.observe(document.documentElement, { attributes: true, childList: true, subtree: true }); + +var loadhistorytime = 0; // for debugging +function saveHistoryHtml() { + var historyHtml = document.querySelector('#main_chatbot > .wrap'); + localStorage.setItem('chatHistory', historyHtml.innerHTML); + // console.log("History Saved") + historyLoaded = false; +} +function loadHistoryHtml() { + var historyHtml = localStorage.getItem('chatHistory'); + if (!historyHtml) { + historyLoaded = true; + return; // no history, do nothing + } + userLogged = localStorage.getItem('userLogged'); + if (userLogged){ + historyLoaded = true; + return; // logged in, do nothing + } + if (!historyLoaded) { + var tempDiv = document.createElement('div'); + tempDiv.innerHTML = historyHtml; + var buttons = tempDiv.querySelectorAll('button.chuanhu-btn'); + var gradioCopyButtons = tempDiv.querySelectorAll('button.copy_code_button'); + for (var i = 0; i < buttons.length; i++) { + buttons[i].parentNode.removeChild(buttons[i]); + } + for (var i = 0; i < gradioCopyButtons.length; i++) { + gradioCopyButtons[i].parentNode.removeChild(gradioCopyButtons[i]); + } + var fakeHistory = document.createElement('div'); + fakeHistory.classList.add('history-message'); + fakeHistory.innerHTML = tempDiv.innerHTML; + webLocale(); + chatbotWrap.insertBefore(fakeHistory, chatbotWrap.firstChild); + // var fakeHistory = document.createElement('div'); + // fakeHistory.classList.add('history-message'); + // fakeHistory.innerHTML = historyHtml; + // chatbotWrap.insertBefore(fakeHistory, chatbotWrap.firstChild); + historyLoaded = true; + console.log("History Loaded"); + loadhistorytime += 1; // for debugging + } else { + historyLoaded = false; + } +} +function clearHistoryHtml() { + localStorage.removeItem("chatHistory"); + historyMessages = chatbotWrap.querySelector('.history-message'); + if (historyMessages) { + chatbotWrap.removeChild(historyMessages); + console.log("History Cleared"); + } +} + +// 监视页面内部 DOM 变动 +var observer = new MutationObserver(function (mutations) { + gradioLoaded(mutations); +}); +observer.observe(targetNode, { childList: true, subtree: true }); + +// 监视页面变化 +window.addEventListener("DOMContentLoaded", function () { + isInIframe = (window.self !== window.top); + historyLoaded = false; +}); +window.addEventListener('resize', setChatbotHeight); +window.addEventListener('scroll', setChatbotHeight); +window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", adjustDarkMode); + +// button svg code +const copyIcon = ''; +const copiedIcon = ''; +const mdIcon = ''; +const rawIcon = ''; diff --git a/docs/assets/custom_2.css b/docs/assets/custom_2.css new file mode 100644 index 0000000..2ebe6a8 --- /dev/null +++ b/docs/assets/custom_2.css @@ -0,0 +1,810 @@ +:root { + --chatbot-color-light: #000000; + --chatbot-color-dark: #FFFFFF; + --chatbot-background-color-light: #F3F3F3; + --chatbot-background-color-dark: #121111; + --message-user-background-color-light: #95EC69; + --message-user-background-color-dark: #26B561; + --message-bot-background-color-light: #FFFFFF; + --message-bot-background-color-dark: #2C2C2C; +} +mspace { + display: block; +} + +@keyframes highlight { + 0%, 100% { + border: 2px solid transparent; + } + 50% { + border-color: yellow; + } +} + +#highlight_update { + animation-name: highlight; + animation-duration: 0.75s; + animation-iteration-count: 3; +} + +.table-wrap.svelte-13hsdno.svelte-13hsdno.svelte-13hsdno { + border: 0px solid var(--border-color-primary) !important; +} + +#examples_col { + z-index: 3; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + margin-bottom: 30% !important; +} +#hide_examples { + z-index: 0; +} + +#debug_mes { + position: absolute; + display: flex; + bottom: 0; + left: 0; + width: 100%; + z-index: 1; /* 设置更高的 z-index 值 */ + margin-bottom: -4px !important; +} +#chat_txt { + display: flex; + flex-direction: column-reverse; + overflow-y: auto !important; + z-index: 3; + flex-grow: 1; /* 自动填充剩余空间 */ + position: absolute; + bottom: 0; + left: 0; + width: 100%; + margin-bottom: 20px !important; +} + +.submit_btn { + display: flex; + flex-direction: column-reverse; + overflow-y: auto !important; + z-index: 3; + flex-grow: 1; /* 自动填充剩余空间 */ + position: absolute; + bottom: 0; + right: 0; + width: 100%; + margin-bottom: 20px !important; + min-width: min(50px,100%) !important; +} + + +#sm_btn { + display: flex; + flex-wrap: unset !important; + gap: 5px !important; + width: var(--size-full); +} +textarea { + resize: none; + height: 100%; /* 填充父元素的高度 */ +} +#main_chatbot { + height: 75vh !important; + max-height: 75vh !important; + /* overflow: auto !important; */ + z-index: 2; + transform: translateZ(0) !important; + backface-visibility: hidden !important; + will-change: transform !important; +} +#prompt_result{ + height: 60vh !important; + max-height: 60vh !important; +} + +#app_title { + font-weight: var(--prose-header-text-weight); + font-size: var(--text-xxl); + line-height: 1.3; + text-align: left; + margin-top: 6px; + white-space: nowrap; +} +#description { + text-align: center; + margin: 32px 0 4px 0; +} + +/* gradio的页脚信息 */ +footer { + /* display: none !important; */ + margin-top: .2em !important; + font-size: 85%; +} +#footer { + text-align: center; +} +#footer div { + display: inline-block; +} +#footer .versions{ + font-size: 85%; + opacity: 0.60; +} + +#float_display { + position: absolute; + max-height: 30px; +} +/* user_info */ +#user_info { + white-space: nowrap; + position: absolute; left: 8em; top: .2em; + z-index: var(--layer-2); + box-shadow: var(--block-shadow); + border: none; border-radius: var(--block-label-radius); + background: var(--color-accent); + padding: var(--block-label-padding); + font-size: var(--block-label-text-size); line-height: var(--line-sm); + width: auto; min-height: 30px!important; + opacity: 1; + transition: opacity 0.3s ease-in-out; +} +#user_info .wrap { + opacity: 0; +} +#user_info p { + color: white; + font-weight: var(--block-label-text-weight); +} +#user_info.hideK { + opacity: 0; + transition: opacity 1s ease-in-out; +} +[class *= "message"] { + gap: 7px !important; + border-radius: var(--radius-xl) !important +} +/* status_display */ +#status_display { + display: flex; + min-height: 2em; + align-items: flex-end; + justify-content: flex-end; +} +#status_display p { + font-size: .85em; + font-family: ui-monospace, "SF Mono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "Microsoft Yahei UI", "Microsoft Yahei", monospace; + /* Windows下中文的monospace会fallback为新宋体,实在太丑,这里折中使用微软雅黑 */ + color: var(--body-text-color-subdued); +} + +#status_display { + transition: all 0.6s; +} +#main_chatbot { + transition: height 0.3s ease; +} + +span.svelte-1gfkn6j { + background: unset !important; +} + +.wrap.svelte-18telvq.svelte-18telvq { + padding: var(--block-padding) !important; + height: 100% !important; + max-height: 95% !important; + overflow-y: auto !important; +} +.app.svelte-1mya07g.svelte-1mya07g { + max-width: 100%; + position: relative; + /* margin: auto; */ + padding: var(--size-4); + width: 100%; + height: 100%; +} + +.gradio-container-3-32-2 h1 { + font-weight: 700 !important; + font-size: 28px !important; +} + + +.gradio-container-3-32-2 h2 { + font-weight: 600 !important; + font-size: 24px !important; +} +.gradio-container-3-32-2 h3 { + font-weight: 500 !important; + font-size: 20px !important; +} +.gradio-container-3-32-2 h4 { + font-weight: 400 !important; + font-size: 16px !important; +} +.gradio-container-3-32-2 h5 { + font-weight: 300 !important; + font-size: 14px !important; +} +.gradio-container-3-32-2 h6 { + font-weight: 200 !important; + font-size: 12px !important; +} + +/* usage_display */ +.insert_block { + position: relative; + margin: 0; + padding: .5em 1em; + box-shadow: var(--block-shadow); + border-width: var(--block-border-width); + border-color: var(--block-border-color); + border-radius: var(--block-radius); + background: var(--block-background-fill); + width: 100%; + line-height: var(--line-sm); + min-height: 2em; +} +#usage_display p, #usage_display span { + margin: 0; + font-size: .85em; + color: var(--body-text-color-subdued); +} +.progress-bar { + background-color: var(--input-background-fill);; + margin: .5em 0 !important; + height: 20px; + border-radius: 10px; + overflow: hidden; +} +.progress { + background-color: var(--block-title-background-fill); + height: 100%; + border-radius: 10px; + text-align: right; + transition: width 0.5s ease-in-out; +} +.progress-text { + /* color: white; */ + color: var(--color-accent) !important; + font-size: 1em !important; + font-weight: bold; + padding-right: 10px; + line-height: 20px; +} + +.apSwitch { + top: 2px; + display: inline-block; + height: 24px; + position: relative; + width: 48px; + border-radius: 12px; +} +.apSwitch input { + display: none !important; +} +.apSlider { + background-color: var(--neutral-200); + bottom: 0; + cursor: pointer; + left: 0; + position: absolute; + right: 0; + top: 0; + transition: .4s; + font-size: 18px; + border-radius: 12px; +} +.apSlider::before { + bottom: -1.5px; + left: 1px; + position: absolute; + transition: .4s; + content: "🌞"; +} +input:checked + .apSlider { + background-color: var(--primary-600); +} +input:checked + .apSlider::before { + transform: translateX(23px); + content:"🌚"; +} + +/* Override Slider Styles (for webkit browsers like Safari and Chrome) + * 好希望这份提案能早日实现 https://github.com/w3c/csswg-drafts/issues/4410 + * 进度滑块在各个平台还是太不统一了 + */ +input[type="range"] { + -webkit-appearance: none; + height: 4px; + background: var(--input-background-fill); + border-radius: 5px; + background-image: linear-gradient(var(--primary-500),var(--primary-500)); + background-size: 0% 100%; + background-repeat: no-repeat; +} +input[type="range"]::-webkit-slider-thumb { + -webkit-appearance: none; + height: 20px; + width: 20px; + border-radius: 50%; + border: solid 0.5px #ddd; + background-color: white; + cursor: ew-resize; + box-shadow: var(--input-shadow); + transition: background-color .1s ease; +} +input[type="range"]::-webkit-slider-thumb:hover { + background: var(--neutral-50); +} +input[type=range]::-webkit-slider-runnable-track { + -webkit-appearance: none; + box-shadow: none; + border: none; + background: transparent; +} + +hr.append-display { + margin: 8px 0; + border: none; + height: 1px; + border-top-width: 0; + background-image: linear-gradient(to right, rgba(50,50,50, 0.1), rgba(150, 150, 150, 0.8), rgba(50,50,50, 0.1)); +} +.source-a { + font-size: 0.8em; + max-width: 100%; + margin: 0; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + /* background-color: #dddddd88; */ + border-radius: 1.5rem; + padding: 0.2em; +} +.source-a a { + display: inline-block; + background-color: #aaaaaa50; + border-radius: 1rem; + padding: 0.5em; + text-align: center; + text-overflow: ellipsis; + overflow: hidden; + min-width: 20%; + white-space: nowrap; + margin: 0.2rem 0.1rem; + text-decoration: none !important; + flex: 1; + transition: flex 0.5s; +} +.source-a a:hover { + background-color: #aaaaaa20; + flex: 2; +} + +.submit_btn, #cancel_btn { + height: 42px !important; +} +.submit_btn::before { + content: url("data:image/svg+xml, %3Csvg width='21px' height='20px' viewBox='0 0 21 20' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E %3Cg id='page' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E %3Cg id='send' transform='translate(0.435849, 0.088463)' fill='%23FFFFFF' fill-rule='nonzero'%3E %3Cpath d='M0.579148261,0.0428666046 C0.301105539,-0.0961547561 -0.036517765,0.122307382 0.0032026237,0.420210298 L1.4927172,18.1553639 C1.5125774,18.4334066 1.79062012,18.5922882 2.04880264,18.4929872 L8.24518329,15.8913017 L11.6412765,19.7441794 C11.8597387,19.9825018 12.2370824,19.8832008 12.3165231,19.5852979 L13.9450591,13.4882182 L19.7839562,11.0255541 C20.0619989,10.8865327 20.0818591,10.4694687 19.7839562,10.3105871 L0.579148261,0.0428666046 Z M11.6138902,17.0883151 L9.85385903,14.7195502 L0.718169621,0.618812241 L12.69945,12.9346347 L11.6138902,17.0883151 Z' id='shape'%3E%3C/path%3E %3C/g%3E %3C/g%3E %3C/svg%3E"); + height: 21px; +} +#cancel_btn::before { + content: url("data:image/svg+xml,%3Csvg width='21px' height='21px' viewBox='0 0 21 21' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E %3Cg id='pg' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E %3Cpath d='M10.2072007,20.088463 C11.5727865,20.088463 12.8594566,19.8259823 14.067211,19.3010209 C15.2749653,18.7760595 16.3386126,18.0538087 17.2581528,17.1342685 C18.177693,16.2147282 18.8982283,15.1527965 19.4197586,13.9484733 C19.9412889,12.7441501 20.202054,11.4557644 20.202054,10.0833163 C20.202054,8.71773046 19.9395733,7.43106036 19.4146119,6.22330603 C18.8896505,5.01555169 18.1673997,3.95018885 17.2478595,3.0272175 C16.3283192,2.10424615 15.2646719,1.3837109 14.0569176,0.865611739 C12.8491633,0.34751258 11.5624932,0.088463 10.1969073,0.088463 C8.83132146,0.088463 7.54636692,0.34751258 6.34204371,0.865611739 C5.1377205,1.3837109 4.07407321,2.10424615 3.15110186,3.0272175 C2.22813051,3.95018885 1.5058797,5.01555169 0.984349419,6.22330603 C0.46281914,7.43106036 0.202054,8.71773046 0.202054,10.0833163 C0.202054,11.4557644 0.4645347,12.7441501 0.9894961,13.9484733 C1.5144575,15.1527965 2.23670831,16.2147282 3.15624854,17.1342685 C4.07578877,18.0538087 5.1377205,18.7760595 6.34204371,19.3010209 C7.54636692,19.8259823 8.83475258,20.088463 10.2072007,20.088463 Z M10.2072007,18.2562448 C9.07493099,18.2562448 8.01471483,18.0452309 7.0265522,17.6232031 C6.03838956,17.2011753 5.17031614,16.6161693 4.42233192,15.8681851 C3.6743477,15.1202009 3.09105726,14.2521274 2.67246059,13.2639648 C2.25386392,12.2758022 2.04456558,11.215586 2.04456558,10.0833163 C2.04456558,8.95104663 2.25386392,7.89083047 2.67246059,6.90266784 C3.09105726,5.9145052 3.6743477,5.04643178 4.42233192,4.29844756 C5.17031614,3.55046334 6.036674,2.9671729 7.02140552,2.54857623 C8.00613703,2.12997956 9.06463763,1.92068122 10.1969073,1.92068122 C11.329177,1.92068122 12.3911087,2.12997956 13.3827025,2.54857623 C14.3742962,2.9671729 15.2440852,3.55046334 15.9920694,4.29844756 C16.7400537,5.04643178 17.3233441,5.9145052 17.7419408,6.90266784 C18.1605374,7.89083047 18.3698358,8.95104663 18.3698358,10.0833163 C18.3698358,11.215586 18.1605374,12.2758022 17.7419408,13.2639648 C17.3233441,14.2521274 16.7400537,15.1202009 15.9920694,15.8681851 C15.2440852,16.6161693 14.3760118,17.2011753 13.3878492,17.6232031 C12.3996865,18.0452309 11.3394704,18.2562448 10.2072007,18.2562448 Z M7.65444721,13.6242324 L12.7496608,13.6242324 C13.0584616,13.6242324 13.3003556,13.5384544 13.4753427,13.3668984 C13.6503299,13.1953424 13.7378234,12.9585951 13.7378234,12.6566565 L13.7378234,7.49968276 C13.7378234,7.19774418 13.6503299,6.96099688 13.4753427,6.78944087 C13.3003556,6.61788486 13.0584616,6.53210685 12.7496608,6.53210685 L7.65444721,6.53210685 C7.33878414,6.53210685 7.09345904,6.61788486 6.91847191,6.78944087 C6.74348478,6.96099688 6.65599121,7.19774418 6.65599121,7.49968276 L6.65599121,12.6566565 C6.65599121,12.9585951 6.74348478,13.1953424 6.91847191,13.3668984 C7.09345904,13.5384544 7.33878414,13.6242324 7.65444721,13.6242324 Z' id='shape' fill='%23FF3B30' fill-rule='nonzero'%3E%3C/path%3E %3C/g%3E %3C/svg%3E"); + height: 21px; +} +/* list */ +ol:not(.options), ul:not(.options) { + padding-inline-start: 2em !important; +} + +/* 亮色(默认) */ +#main_chatbot { + background-color: var(--chatbot-background-color-light) !important; + color: var(--chatbot-color-light) !important; +} +[data-testid = "bot"] { + background-color: var(--message-bot-background-color-light) !important; +} +[data-testid = "user"] { + background-color: var(--message-user-background-color-light) !important; +} +/* 暗色 */ +.dark #main_chatbot { + background-color: var(--chatbot-background-color-dark) !important; + color: var(--chatbot-color-dark) !important; +} +.dark [data-testid = "bot"] { + background-color: var(--message-bot-background-color-dark) !important; +} +.dark [data-testid = "user"] { + background-color: var(--message-user-background-color-dark) !important; +} + +/* 屏幕宽度大于等于500px的设备 */ +/* update on 2023.4.8: 高度的细致调整已写入JavaScript */ +@media screen and (min-width: 500px) { + #main_chatbot { + height: calc(100vh - 200px); + } + #main_chatbot .wrap { + max-height: calc(100vh - 200px - var(--line-sm)*1rem - 2*var(--block-label-margin) ); + } +} +/* 屏幕宽度小于500px的设备 */ +@media screen and (max-width: 499px) { + #main_chatbot { + height: calc(100vh - 140px); + } + #main_chatbot .wrap { + max-height: calc(100vh - 140px - var(--line-sm)*1rem - 2*var(--block-label-margin) ); + } + [data-testid = "bot"] { + max-width: 95% !important; + } + #app_title h1{ + letter-spacing: -1px; font-size: 22px; + } +} +#main_chatbot .wrap { + overflow-x: hidden; +} +/* 对话气泡 */ +.message { + border-radius: var(--radius-xl) !important; + border: none; + padding: var(--spacing-xl) !important; + font-size: var(--text-md) !important; + line-height: var(--line-md) !important; + min-height: calc(var(--text-md)*var(--line-md) + 2*var(--spacing-xl)); + min-width: calc(var(--text-md)*var(--line-md) + 2*var(--spacing-xl)); +} +[data-testid = "bot"] { + max-width: 85%; + border-bottom-left-radius: 0 !important; +} +[data-testid = "user"] { + max-width: 85%; + width: auto !important; + border-bottom-right-radius: 0 !important; +} + +.message.user p { + white-space: pre-wrap; +} +.message .user-message { + display: block; + padding: 0 !important; + white-space: pre-wrap; +} + +.message .md-message p { + margin-top: 0.6em !important; + margin-bottom: 0.6em !important; +} +.message .md-message p:first-child { margin-top: 0 !important; } +.message .md-message p:last-of-type { margin-bottom: 0 !important; } + +.message .md-message { + display: block; + padding: 0 !important; +} +.message .raw-message p { + margin:0 !important; +} +.message .raw-message { + display: block; + padding: 0 !important; + white-space: pre-wrap; +} +.raw-message.hideM, .md-message.hideM { + display: none; +} + +/* custom buttons */ +.chuanhu-btn { + border-radius: 5px; + /* background-color: #E6E6E6 !important; */ + color: rgba(120, 120, 120, 0.64) !important; + padding: 4px !important; + position: absolute; + right: -22px; + cursor: pointer !important; + transition: color .2s ease, background-color .2s ease; +} +.chuanhu-btn:hover { + background-color: rgba(167, 167, 167, 0.25) !important; + color: unset !important; +} +.chuanhu-btn:active { + background-color: rgba(167, 167, 167, 0.5) !important; +} +.chuanhu-btn:focus { + outline: none; +} +.copy-bot-btn { + /* top: 18px; */ + bottom: 0; +} +.toggle-md-btn { + /* top: 0; */ + bottom: 20px; +} +.copy-code-btn { + position: relative; + float: right; + font-size: 1em; + cursor: pointer; +} + +.message-wrap>div img{ + border-radius: 10px !important; +} + +/* history message */ +.wrap>.history-message { + padding: 10px !important; +} +.history-message { + /* padding: 0 !important; */ + opacity: 80%; + display: flex; + flex-direction: column; +} +.history-message>.history-message { + padding: 0 !important; +} +.history-message>.message-wrap { + padding: 0 !important; + margin-bottom: 16px; +} +.history-message>.message { + margin-bottom: 16px; +} +.wrap>.history-message::after { + content: ""; + display: block; + height: 2px; + background-color: var(--body-text-color-subdued); + margin-bottom: 10px; + margin-top: -10px; + clear: both; +} +.wrap>.history-message>:last-child::after { + content: "仅供查看"; + display: block; + text-align: center; + color: var(--body-text-color-subdued); + font-size: 0.8em; +} + +/* 表格 */ +table { + margin: 1em 0; + border-collapse: collapse; + empty-cells: show; +} +td,th { + border: 1.2px solid var(--border-color-primary) !important; + padding: 0.2em; +} +thead { + background-color: rgba(175,184,193,0.2); +} +thead th { + padding: .5em .2em; +} +/* 行内代码 */ +.message :not(pre) code { + display: inline; + white-space: break-spaces; + font-family: var(--font-mono); + border-radius: 6px; + margin: 0 2px 0 2px; + padding: .2em .4em .1em .4em; + background-color: rgba(175,184,193,0.2); +} +/* 代码块 */ +.message pre, +.message pre[class*=language-] { + color: #fff; + overflow-x: auto; + overflow-y: hidden; + margin: .8em 1em 1em 0em !important; + padding: var(--spacing-xl) 1.2em !important; + border-radius: var(--radius-lg) !important; +} +.message pre code, +.message pre code[class*=language-] { + color: #fff; + padding: 0; + margin: 0; + background-color: unset; + text-shadow: none; + font-family: var(--font-mono); +} +/* 覆盖 gradio 丑陋的复制按钮样式 */ +pre button[title="copy"] { + border-radius: 5px; + transition: background-color .2s ease; +} +pre button[title="copy"]:hover { + background-color: #333232; +} +pre button .check { + color: #fff !important; + background: var(--neutral-950) !important; +} + +/* 覆盖prism.css */ +.language-css .token.string, +.style .token.string, +.token.entity, +.token.operator, +.token.url { + background: none !important; +} + +/* 代码高亮样式 */ +.codehilite .hll { background-color: #6e7681 } +.codehilite .c { color: #8b949e; font-style: italic } /* Comment */ +.codehilite .err { color: #f85149 } /* Error */ +.codehilite .esc { color: #c9d1d9 } /* Escape */ +.codehilite .g { color: #c9d1d9 } /* Generic */ +.codehilite .k { color: #ff7b72 } /* Keyword */ +.codehilite .l { color: #a5d6ff } /* Literal */ +.codehilite .n { color: #c9d1d9 } /* Name */ +.codehilite .o { color: #ff7b72; font-weight: bold } /* Operator */ +.codehilite .x { color: #c9d1d9 } /* Other */ +.codehilite .p { color: #c9d1d9 } /* Punctuation */ +.codehilite .ch { color: #8b949e; font-style: italic } /* Comment.Hashbang */ +.codehilite .cm { color: #8b949e; font-style: italic } /* Comment.Multiline */ +.codehilite .cp { color: #8b949e; font-weight: bold; font-style: italic } /* Comment.Preproc */ +.codehilite .cpf { color: #8b949e; font-style: italic } /* Comment.PreprocFile */ +.codehilite .c1 { color: #8b949e; font-style: italic } /* Comment.Single */ +.codehilite .cs { color: #8b949e; font-weight: bold; font-style: italic } /* Comment.Special */ +.codehilite .gd { color: #ffa198; background-color: #490202 } /* Generic.Deleted */ +.codehilite .ge { color: #c9d1d9; font-style: italic } /* Generic.Emph */ +.codehilite .gr { color: #ffa198 } /* Generic.Error */ +.codehilite .gh { color: #79c0ff; font-weight: bold } /* Generic.Heading */ +.codehilite .gi { color: #56d364; background-color: #0f5323 } /* Generic.Inserted */ +.codehilite .go { color: #8b949e } /* Generic.Output */ +.codehilite .gp { color: #8b949e } /* Generic.Prompt */ +.codehilite .gs { color: #c9d1d9; font-weight: bold } /* Generic.Strong */ +.codehilite .gu { color: #79c0ff } /* Generic.Subheading */ +.codehilite .gt { color: #ff7b72 } /* Generic.Traceback */ +.codehilite .g-Underline { color: #c9d1d9; text-decoration: underline } /* Generic.Underline */ +.codehilite .kc { color: #79c0ff } /* Keyword.Constant */ +.codehilite .kd { color: #ff7b72 } /* Keyword.Declaration */ +.codehilite .kn { color: #ff7b72 } /* Keyword.Namespace */ +.codehilite .kp { color: #79c0ff } /* Keyword.Pseudo */ +.codehilite .kr { color: #ff7b72 } /* Keyword.Reserved */ +.codehilite .kt { color: #ff7b72 } /* Keyword.Type */ +.codehilite .ld { color: #79c0ff } /* Literal.Date */ +.codehilite .m { color: #a5d6ff } /* Literal.Number */ +.codehilite .s { color: #a5d6ff } /* Literal.String */ +.codehilite .na { color: #c9d1d9 } /* Name.Attribute */ +.codehilite .nb { color: #c9d1d9 } /* Name.Builtin */ +.codehilite .nc { color: #f0883e; font-weight: bold } /* Name.Class */ +.codehilite .no { color: #79c0ff; font-weight: bold } /* Name.Constant */ +.codehilite .nd { color: #d2a8ff; font-weight: bold } /* Name.Decorator */ +.codehilite .ni { color: #ffa657 } /* Name.Entity */ +.codehilite .ne { color: #f0883e; font-weight: bold } /* Name.Exception */ +.codehilite .nf { color: #d2a8ff; font-weight: bold } /* Name.Function */ +.codehilite .nl { color: #79c0ff; font-weight: bold } /* Name.Label */ +.codehilite .nn { color: #ff7b72 } /* Name.Namespace */ +.codehilite .nx { color: #c9d1d9 } /* Name.Other */ +.codehilite .py { color: #79c0ff } /* Name.Property */ +.codehilite .nt { color: #7ee787 } /* Name.Tag */ +.codehilite .nv { color: #79c0ff } /* Name.Variable */ +.codehilite .ow { color: #ff7b72; font-weight: bold } /* Operator.Word */ +.codehilite .pm { color: #c9d1d9 } /* Punctuation.Marker */ +.codehilite .w { color: #6e7681 } /* Text.Whitespace */ +.codehilite .mb { color: #a5d6ff } /* Literal.Number.Bin */ +.codehilite .mf { color: #a5d6ff } /* Literal.Number.Float */ +.codehilite .mh { color: #a5d6ff } /* Literal.Number.Hex */ +.codehilite .mi { color: #a5d6ff } /* Literal.Number.Integer */ +.codehilite .mo { color: #a5d6ff } /* Literal.Number.Oct */ +.codehilite .sa { color: #79c0ff } /* Literal.String.Affix */ +.codehilite .sb { color: #a5d6ff } /* Literal.String.Backtick */ +.codehilite .sc { color: #a5d6ff } /* Literal.String.Char */ +.codehilite .dl { color: #79c0ff } /* Literal.String.Delimiter */ +.codehilite .sd { color: #a5d6ff } /* Literal.String.Doc */ +.codehilite .s2 { color: #a5d6ff } /* Literal.String.Double */ +.codehilite .se { color: #79c0ff } /* Literal.String.Escape */ +.codehilite .sh { color: #79c0ff } /* Literal.String.Heredoc */ +.codehilite .si { color: #a5d6ff } /* Literal.String.Interpol */ +.codehilite .sx { color: #a5d6ff } /* Literal.String.Other */ +.codehilite .sr { color: #79c0ff } /* Literal.String.Regex */ +.codehilite .s1 { color: #a5d6ff } /* Literal.String.Single */ +.codehilite .ss { color: #a5d6ff } /* Literal.String.Symbol */ +.codehilite .bp { color: #c9d1d9 } /* Name.Builtin.Pseudo */ +.codehilite .fm { color: #d2a8ff; font-weight: bold } /* Name.Function.Magic */ +.codehilite .vc { color: #79c0ff } /* Name.Variable.Class */ +.codehilite .vg { color: #79c0ff } /* Name.Variable.Global */ +.codehilite .vi { color: #79c0ff } /* Name.Variable.Instance */ +.codehilite .vm { color: #79c0ff } /* Name.Variable.Magic */ +.codehilite .il { color: #a5d6ff } /* Literal.Number.Integer.Long */ + +.dark .codehilite .hll { background-color: #2C3B41 } +.dark .codehilite .c { color: #79d618; font-style: italic } /* Comment */ +.dark .codehilite .err { color: #FF5370 } /* Error */ +.dark .codehilite .esc { color: #89DDFF } /* Escape */ +.dark .codehilite .g { color: #EEFFFF } /* Generic */ +.dark .codehilite .k { color: #BB80B3 } /* Keyword */ +.dark .codehilite .l { color: #C3E88D } /* Literal */ +.dark .codehilite .n { color: #EEFFFF } /* Name */ +.dark .codehilite .o { color: #89DDFF } /* Operator */ +.dark .codehilite .p { color: #89DDFF } /* Punctuation */ +.dark .codehilite .ch { color: #79d618; font-style: italic } /* Comment.Hashbang */ +.dark .codehilite .cm { color: #79d618; font-style: italic } /* Comment.Multiline */ +.dark .codehilite .cp { color: #79d618; font-style: italic } /* Comment.Preproc */ +.dark .codehilite .cpf { color: #79d618; font-style: italic } /* Comment.PreprocFile */ +.dark .codehilite .c1 { color: #79d618; font-style: italic } /* Comment.Single */ +.dark .codehilite .cs { color: #79d618; font-style: italic } /* Comment.Special */ +.dark .codehilite .gd { color: #FF5370 } /* Generic.Deleted */ +.dark .codehilite .ge { color: #89DDFF } /* Generic.Emph */ +.dark .codehilite .gr { color: #FF5370 } /* Generic.Error */ +.dark .codehilite .gh { color: #C3E88D } /* Generic.Heading */ +.dark .codehilite .gi { color: #C3E88D } /* Generic.Inserted */ +.dark .codehilite .go { color: #79d618 } /* Generic.Output */ +.dark .codehilite .gp { color: #FFCB6B } /* Generic.Prompt */ +.dark .codehilite .gs { color: #FF5370 } /* Generic.Strong */ +.dark .codehilite .gu { color: #89DDFF } /* Generic.Subheading */ +.dark .codehilite .gt { color: #FF5370 } /* Generic.Traceback */ +.dark .codehilite .kc { color: #89DDFF } /* Keyword.Constant */ +.dark .codehilite .kd { color: #BB80B3 } /* Keyword.Declaration */ +.dark .codehilite .kn { color: #89DDFF; font-style: italic } /* Keyword.Namespace */ +.dark .codehilite .kp { color: #89DDFF } /* Keyword.Pseudo */ +.dark .codehilite .kr { color: #BB80B3 } /* Keyword.Reserved */ +.dark .codehilite .kt { color: #BB80B3 } /* Keyword.Type */ +.dark .codehilite .ld { color: #C3E88D } /* Literal.Date */ +.dark .codehilite .m { color: #F78C6C } /* Literal.Number */ +.dark .codehilite .s { color: #C3E88D } /* Literal.String */ +.dark .codehilite .na { color: #BB80B3 } /* Name.Attribute */ +.dark .codehilite .nb { color: #82AAFF } /* Name.Builtin */ +.dark .codehilite .nc { color: #FFCB6B } /* Name.Class */ +.dark .codehilite .no { color: #EEFFFF } /* Name.Constant */ +.dark .codehilite .nd { color: #82AAFF } /* Name.Decorator */ +.dark .codehilite .ni { color: #89DDFF } /* Name.Entity */ +.dark .codehilite .ne { color: #FFCB6B } /* Name.Exception */ +.dark .codehilite .nf { color: #82AAFF } /* Name.Function */ +.dark .codehilite .nl { color: #82AAFF } /* Name.Label */ +.dark .codehilite .nn { color: #FFCB6B } /* Name.Namespace */ +.dark .codehilite .nx { color: #EEFFFF } /* Name.Other */ +.dark .codehilite .py { color: #FFCB6B } /* Name.Property */ +.dark .codehilite .nt { color: #FF5370 } /* Name.Tag */ +.dark .codehilite .nv { color: #89DDFF } /* Name.Variable */ +.dark .codehilite .ow { color: #89DDFF; font-style: italic } /* Operator.Word */ +.dark .codehilite .pm { color: #89DDFF } /* Punctuation.Marker */ +.dark .codehilite .w { color: #EEFFFF } /* Text.Whitespace */ +.dark .codehilite .mb { color: #F78C6C } /* Literal.Number.Bin */ +.dark .codehilite .mf { color: #F78C6C } /* Literal.Number.Float */ +.dark .codehilite .mh { color: #F78C6C } /* Literal.Number.Hex */ +.dark .codehilite .mi { color: #F78C6C } /* Literal.Number.Integer */ +.dark .codehilite .mo { color: #F78C6C } /* Literal.Number.Oct */ +.dark .codehilite .sa { color: #BB80B3 } /* Literal.String.Affix */ +.dark .codehilite .sb { color: #C3E88D } /* Literal.String.Backtick */ +.dark .codehilite .sc { color: #C3E88D } /* Literal.String.Char */ +.dark .codehilite .dl { color: #EEFFFF } /* Literal.String.Delimiter */ +.dark .codehilite .sd { color: #79d618; font-style: italic } /* Literal.String.Doc */ +.dark .codehilite .s2 { color: #C3E88D } /* Literal.String.Double */ +.dark .codehilite .se { color: #EEFFFF } /* Literal.String.Escape */ +.dark .codehilite .sh { color: #C3E88D } /* Literal.String.Heredoc */ +.dark .codehilite .si { color: #89DDFF } /* Literal.String.Interpol */ +.dark .codehilite .sx { color: #C3E88D } /* Literal.String.Other */ +.dark .codehilite .sr { color: #89DDFF } /* Literal.String.Regex */ +.dark .codehilite .s1 { color: #C3E88D } /* Literal.String.Single */ +.dark .codehilite .ss { color: #89DDFF } /* Literal.String.Symbol */ +.dark .codehilite .bp { color: #89DDFF } /* Name.Builtin.Pseudo */ +.dark .codehilite .fm { color: #82AAFF } /* Name.Function.Magic */ +.dark .codehilite .vc { color: #89DDFF } /* Name.Variable.Class */ +.dark .codehilite .vg { color: #89DDFF } /* Name.Variable.Global */ +.dark .codehilite .vi { color: #89DDFF } /* Name.Variable.Instance */ +.dark .codehilite .vm { color: #82AAFF } /* Name.Variable.Magic */ +.dark .codehilite .il { color: #F78C6C } /* Literal.Number.Integer.Long */ diff --git a/docs/assets/external-scripts.js b/docs/assets/external-scripts.js new file mode 100644 index 0000000..8d03526 --- /dev/null +++ b/docs/assets/external-scripts.js @@ -0,0 +1,2 @@ + +// external javascript here diff --git a/docs/assets/favicon.ico b/docs/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c5cb551b4dac7d7543d0b0dffe2fa8a527d55d48 GIT binary patch literal 78769 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 a;Qv1jLF-CEuhs_u0000 + + {label} + + + + + diff --git a/docs/assets/html/billing_info.html b/docs/assets/html/billing_info.html new file mode 100644 index 0000000..71abcc8 --- /dev/null +++ b/docs/assets/html/billing_info.html @@ -0,0 +1,9 @@ +{label} +
+
+ {usage_percent}% +
+
+
+ ${rounded_usage}${usage_limit} +
\ No newline at end of file diff --git a/docs/assets/html/footer.html b/docs/assets/html/footer.html new file mode 100644 index 0000000..bca27bb --- /dev/null +++ b/docs/assets/html/footer.html @@ -0,0 +1 @@ +
{versions}
diff --git a/theme.py b/theme.py index 30ef8d5..6436832 100644 --- a/theme.py +++ b/theme.py @@ -25,42 +25,61 @@ CODE_HIGHLIGHT, ADD_WAIFU = get_conf('CODE_HIGHLIGHT', 'ADD_WAIFU') # gr.themes.utils.colors.pink (粉红色) # gr.themes.utils.colors.rose (玫瑰色) -small_and_beautiful_theme = gr.themes.Soft( - ).set( - # button_primary_background_fill="*primary_500", - button_primary_background_fill_dark="*primary_600", - # button_primary_background_fill_hover="*primary_400", - # button_primary_border_color="*primary_500", - button_primary_border_color_dark="*primary_600", - button_primary_text_color="wihte", - button_primary_text_color_dark="white", - button_secondary_background_fill="*neutral_100", - button_secondary_background_fill_hover="*neutral_50", - button_secondary_background_fill_dark="*neutral_900", - button_secondary_text_color="*neutral_800", - button_secondary_text_color_dark="white", - # background_fill_primary="#F7F7F7", - # background_fill_primary_dark="#1F1F1F", - # block_title_text_color="*primary_500", - block_title_background_fill_dark="*primary_900", - block_label_background_fill_dark="*primary_900", - input_background_fill="#F6F6F6", - ) - def adjust_theme(): try: - color_er = gr.themes.utils.colors.fuchsia - set_theme = gr.themes.Default( - primary_hue=gr.themes.utils.colors.orange, - neutral_hue=gr.themes.utils.colors.gray, - font=["sans-serif", "PingFang SC", "ui-sans-serif", "system-ui", - "sans-serif", gr.themes.utils.fonts.GoogleFont("Source Sans Pro")], - font_mono=["ui-monospace", "Consolas", "monospace", gr.themes.utils.fonts.GoogleFont("IBM Plex Mono")]) - set_theme.set( - # Colors + set_theme = gr.themes.Soft( + primary_hue=gr.themes.Color( + c50="#EBFAF2", + c100="#CFF3E1", + c200="#A8EAC8", + c300="#77DEA9", + c400="#3FD086", + c500="#02C160", + c600="#06AE56", + c700="#05974E", + c800="#057F45", + c900="#04673D", + c950="#2E5541", + name="small_and_beautiful", + ), + secondary_hue=gr.themes.Color( + c50="#576b95", + c100="#576b95", + c200="#576b95", + c300="#576b95", + c400="#576b95", + c500="#576b95", + c600="#576b95", + c700="#576b95", + c800="#576b95", + c900="#576b95", + c950="#576b95", + ), + neutral_hue=gr.themes.Color( + name="gray", + c50="#f6f7f8", + # c100="#f3f4f6", + c100="#F2F2F2", + c200="#e5e7eb", + c300="#d1d5db", + c400="#B2B2B2", + c500="#808080", + c600="#636363", + c700="#515151", + c800="#393939", + # c900="#272727", + c900="#2B2B2B", + c950="#171717", + ), + + radius_size=gr.themes.sizes.radius_sm, + ).set( + button_primary_background_fill="*primary_500", button_primary_background_fill_dark="*primary_600", + button_primary_background_fill_hover="*primary_400", + button_primary_border_color="*primary_500", button_primary_border_color_dark="*primary_600", button_primary_text_color="wihte", button_primary_text_color_dark="white", @@ -69,51 +88,14 @@ def adjust_theme(): button_secondary_background_fill_dark="*neutral_900", button_secondary_text_color="*neutral_800", button_secondary_text_color_dark="white", - block_title_background_fill_dark="*neutral_900", - block_label_background_fill_dark="*neutral_900", + background_fill_primary="#F7F7F7", + background_fill_primary_dark="#1F1F1F", + block_title_text_color="*primary_500", + block_title_background_fill_dark="*primary_900", + block_label_background_fill_dark="*primary_900", input_background_fill="#F6F6F6", - input_background_fill_dark="*neutral_800", - # Transition - button_transition="none", - # Shadows - button_shadow="*shadow_drop", - button_shadow_hover="*shadow_drop_lg", - button_shadow_active="*shadow_inset", - input_shadow="0 0 0 *shadow_spread transparent, *shadow_inset", - input_shadow_focus="0 0 0 *shadow_spread *secondary_50, *shadow_inset", - input_shadow_focus_dark="0 0 0 *shadow_spread *neutral_700, *shadow_inset", - checkbox_label_shadow="*shadow_drop", - block_shadow="*shadow_drop", - form_gap_width="1px", - # Button borders - input_border_width="1px", - ##### input_background_fill="white", - # Gradients - stat_background_fill="linear-gradient(to right, *primary_400, *primary_200)", - stat_background_fill_dark="linear-gradient(to right, *primary_400, *primary_600)", - error_background_fill=f"linear-gradient(to right, {color_er.c100}, *background_fill_secondary)", - error_background_fill_dark="*background_fill_primary", - checkbox_label_background_fill="linear-gradient(to top, *neutral_50, white)", - checkbox_label_background_fill_dark="linear-gradient(to top, *neutral_900, *neutral_800)", - checkbox_label_background_fill_hover="linear-gradient(to top, *neutral_100, white)", - checkbox_label_background_fill_hover_dark="linear-gradient(to top, *neutral_900, *neutral_800)", - button_primary_background_fill="linear-gradient(to bottom right, *primary_100, *primary_300)", - ##### button_primary_background_fill_dark="linear-gradient(to bottom right, *primary_500, *primary_600)", - button_primary_background_fill_hover="linear-gradient(to bottom right, *primary_100, *primary_200)", - button_primary_background_fill_hover_dark="linear-gradient(to bottom right, *primary_500, *primary_500)", - ##### button_primary_border_color_dark="*primary_500", - ##### button_secondary_background_fill="linear-gradient(to bottom right, *neutral_100, *neutral_200)", - ##### button_secondary_background_fill_dark="linear-gradient(to bottom right, *neutral_600, *neutral_700)", - ##### button_secondary_background_fill_hover="linear-gradient(to bottom right, *neutral_100, *neutral_100)", - button_secondary_background_fill_hover_dark="linear-gradient(to bottom right, *neutral_600, *neutral_600)", - button_cancel_background_fill=f"linear-gradient(to bottom right, {color_er.c100}, {color_er.c200})", - button_cancel_background_fill_dark=f"linear-gradient(to bottom right, {color_er.c600}, {color_er.c700})", - button_cancel_background_fill_hover=f"linear-gradient(to bottom right, {color_er.c100}, {color_er.c100})", - button_cancel_background_fill_hover_dark=f"linear-gradient(to bottom right, {color_er.c600}, {color_er.c600})", - button_cancel_border_color=color_er.c200, - button_cancel_border_color_dark=color_er.c600, - button_cancel_text_color=color_er.c600, - button_cancel_text_color_dark="white", + chatbot_code_background_color="*neutral_950", + chatbot_code_background_color_dark="*neutral_950", ) # 添加一个萌萌的看板娘 if ADD_WAIFU: diff --git a/toolbox.py b/toolbox.py index 59cb962..2755da1 100644 --- a/toolbox.py +++ b/toolbox.py @@ -594,11 +594,12 @@ def is_api2d_key(key): return False def is_proxy_key(key): - if key.startswith('proxy-') and len(key) == 37: + if key.startswith('proxy-') and len(key) == 38: return True else: return False + def is_any_api_key(key): if ',' in key: keys = key.split(',')