From bcbcfdc52c48581e5a6eeec6cd106fb79aa8e172 Mon Sep 17 00:00:00 2001 From: 505030475 Date: Thu, 6 Jul 2023 23:56:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E8=AF=95=E5=A4=9A=E6=AC=A1=E4=BA=A4?= =?UTF-8?q?=E4=BA=92=E6=8E=A5=E5=8F=A3=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crazy_functional.py | 12 ++++++ crazy_functions/交互功能函数模板.py | 63 +++++++++++++++++++++++++++++ toolbox.py | 29 +++++++++++-- 3 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 crazy_functions/交互功能函数模板.py diff --git a/crazy_functional.py b/crazy_functional.py index 03aaaf5..6c3d536 100644 --- a/crazy_functional.py +++ b/crazy_functional.py @@ -352,6 +352,18 @@ def get_crazy_functions(): }) except: print('Load function plugin failed') + + try: + from crazy_functions.交互功能函数模板 import 交互功能模板函数 + function_plugins.update({ + "交互功能模板函数": { + "Color": "stop", + # "AsButton": False, + "Function": HotReload(交互功能模板函数) + } + }) + except: + print('Load function plugin failed') try: from crazy_functions.Latex输出PDF结果 import Latex英文纠错加PDF对比 diff --git a/crazy_functions/交互功能函数模板.py b/crazy_functions/交互功能函数模板.py new file mode 100644 index 0000000..d57fc2b --- /dev/null +++ b/crazy_functions/交互功能函数模板.py @@ -0,0 +1,63 @@ +from toolbox import CatchException, update_ui +from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive + + +@CatchException +def 交互功能模板函数(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port): + """ + txt 输入栏用户输入的文本,例如需要翻译的一段话,再例如一个包含了待处理文件的路径 + llm_kwargs gpt模型参数, 如温度和top_p等, 一般原样传递下去就行 + plugin_kwargs 插件模型的参数, 如温度和top_p等, 一般原样传递下去就行 + chatbot 聊天显示框的句柄,用于显示给用户 + history 聊天历史,前情提要 + system_prompt 给gpt的静默提醒 + web_port 当前软件运行的端口号 + """ + history = [] # 清空历史,以免输入溢出 + chatbot.append(("这是什么功能?", "交互功能函数模板。在执行完成之后, 可以将自身的状态存储到cookie中, 等待用户的再次调用。")) + yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 + + state = chatbot._cookies.get('plugin_state_0001', None) # 初始化插件状态 + + if state is None: + chatbot._cookies['lock_plugin'] = 'crazy_functions.交互功能函数模板->交互功能模板函数' # 赋予插件锁定 锁定插件回调路径,当下一次用户提交时,会直接转到该函数 + chatbot._cookies['plugin_state_0001'] = 'wait_user_keyword' # 赋予插件状态 + + chatbot.append(("第一次调用:", "请输入关键词, 我将为您查找相关壁纸, 建议使用英文单词, 插件锁定中,请直接提交即可。")) + yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 + return + + if state == 'wait_user_keyword': + chatbot._cookies['lock_plugin'] = None # 解除插件锁定,避免遗忘导致死锁 + chatbot._cookies['plugin_state_0001'] = None # 解除插件状态,避免遗忘导致死锁 + + # 解除插件锁定 + chatbot.append((f"获取关键词:{txt}", "")) + yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 + page_return = get_image_page_by_keyword(txt) + inputs=inputs_show_user=f"Extract all image urls in this html page, pick the first 5 images and show them with markdown format: \n\n {page_return}" + gpt_say = yield from request_gpt_model_in_new_thread_with_ui_alive( + inputs=inputs, inputs_show_user=inputs_show_user, + llm_kwargs=llm_kwargs, chatbot=chatbot, history=[], + sys_prompt="When you want to show an image, use markdown format. e.g. ![image_description](image_url). If there are no image url provided, answer 'no image url provided'" + ) + chatbot[-1] = [chatbot[-1][0], gpt_say] + yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 + return + + + +# --------------------------------------------------------------------------------- + +def get_image_page_by_keyword(keyword): + import requests + from bs4 import BeautifulSoup + response = requests.get(f'https://wallhaven.cc/search?q={keyword}', timeout=2) + res = "image urls: \n" + for image_element in BeautifulSoup(response.content, 'html.parser').findAll("img"): + try: + res += image_element["data-src"] + res += "\n" + except: + pass + return res diff --git a/toolbox.py b/toolbox.py index 256d99c..36c4e8c 100644 --- a/toolbox.py +++ b/toolbox.py @@ -4,6 +4,7 @@ import time import inspect import re import os +import gradio from latex2mathml.converter import convert as tex2mathml from functools import wraps, lru_cache pj = os.path.join @@ -46,6 +47,7 @@ def ArgsGeneralWrapper(f): # 引入一个有cookie的chatbot cookies.update({ 'top_p':top_p, + 'llm_model': llm_model, 'temperature':temperature, }) llm_kwargs = { @@ -60,7 +62,14 @@ def ArgsGeneralWrapper(f): } chatbot_with_cookie = ChatBotWithCookies(cookies) chatbot_with_cookie.write_list(chatbot) - yield from f(txt_passon, llm_kwargs, plugin_kwargs, chatbot_with_cookie, history, system_prompt, *args) + if cookies.get('lock_plugin', None) is None: + # 正常状态 + yield from f(txt_passon, llm_kwargs, plugin_kwargs, chatbot_with_cookie, history, system_prompt, *args) + else: + # 处理个别特殊插件的锁定状态 + module, fn_name = cookies['lock_plugin'].split('->') + f_hot_reload = getattr(importlib.import_module(module, fn_name), fn_name) + yield from f_hot_reload(txt_passon, llm_kwargs, plugin_kwargs, chatbot_with_cookie, history, system_prompt, *args) return decorated @@ -68,8 +77,22 @@ def update_ui(chatbot, history, msg='正常', **kwargs): # 刷新界面 """ 刷新用户界面 """ - assert isinstance(chatbot, ChatBotWithCookies), "在传递chatbot的过程中不要将其丢弃。必要时,可用clear将其清空,然后用for+append循环重新赋值。" - yield chatbot.get_cookies(), chatbot, history, msg + assert isinstance(chatbot, ChatBotWithCookies), "在传递chatbot的过程中不要将其丢弃。必要时, 可用clear将其清空, 然后用for+append循环重新赋值。" + + cookies = chatbot.get_cookies() + + # 解决插件锁定时的界面显示问题 + if cookies.get('lock_plugin', None): + label = cookies.get('llm_model', "") + " | " + "正在锁定插件" + cookies.get('lock_plugin', None) + chatbot_gr = gradio.update(value=chatbot, label=label) + if cookies.get('label', "") != label: cookies['label'] = label # 记住当前的label + elif cookies.get('label', None): + chatbot_gr = gradio.update(value=chatbot, label=cookies.get('llm_model', "")) + cookies['label'] = None # 清空label + else: + chatbot_gr = chatbot + + yield cookies, chatbot_gr, history, msg def update_ui_lastest_msg(lastmsg, chatbot, history, delay=1): # 刷新界面 """