From ab61418410db5bb7d12f21f05a70d200197e64a7 Mon Sep 17 00:00:00 2001 From: binary-husky <505030475@qq.com> Date: Sun, 23 Apr 2023 18:13:30 +0800 Subject: [PATCH] better traceback --- crazy_functions/crazy_utils.py | 11 +++++------ request_llm/bridge_all.py | 7 ++----- request_llm/bridge_chatgpt.py | 4 ++-- toolbox.py | 32 +++++++++++++++++++++++++++----- 4 files changed, 36 insertions(+), 18 deletions(-) diff --git a/crazy_functions/crazy_utils.py b/crazy_functions/crazy_utils.py index 4e0eba4..3412aa3 100644 --- a/crazy_functions/crazy_utils.py +++ b/crazy_functions/crazy_utils.py @@ -1,5 +1,4 @@ -import traceback -from toolbox import update_ui, get_conf +from toolbox import update_ui, get_conf, trimmed_format_exc def input_clipping(inputs, history, max_token_limit): import numpy as np @@ -94,12 +93,12 @@ def request_gpt_model_in_new_thread_with_ui_alive( continue # 返回重试 else: # 【选择放弃】 - tb_str = '```\n' + traceback.format_exc() + '```' + tb_str = '```\n' + trimmed_format_exc() + '```' mutable[0] += f"[Local Message] 警告,在执行过程中遭遇问题, Traceback:\n\n{tb_str}\n\n" return mutable[0] # 放弃 except: # 【第三种情况】:其他错误:重试几次 - tb_str = '```\n' + traceback.format_exc() + '```' + tb_str = '```\n' + trimmed_format_exc() + '```' print(tb_str) mutable[0] += f"[Local Message] 警告,在执行过程中遭遇问题, Traceback:\n\n{tb_str}\n\n" if retry_op > 0: @@ -220,14 +219,14 @@ def request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency( continue # 返回重试 else: # 【选择放弃】 - tb_str = '```\n' + traceback.format_exc() + '```' + tb_str = '```\n' + trimmed_format_exc() + '```' gpt_say += f"[Local Message] 警告,线程{index}在执行过程中遭遇问题, Traceback:\n\n{tb_str}\n\n" if len(mutable[index][0]) > 0: gpt_say += "此线程失败前收到的回答:\n\n" + mutable[index][0] mutable[index][2] = "输入过长已放弃" return gpt_say # 放弃 except: # 【第三种情况】:其他错误 - tb_str = '```\n' + traceback.format_exc() + '```' + tb_str = '```\n' + trimmed_format_exc() + '```' print(tb_str) gpt_say += f"[Local Message] 警告,线程{index}在执行过程中遭遇问题, Traceback:\n\n{tb_str}\n\n" if len(mutable[index][0]) > 0: gpt_say += "此线程失败前收到的回答:\n\n" + mutable[index][0] diff --git a/request_llm/bridge_all.py b/request_llm/bridge_all.py index 311dc6f..4fd88bf 100644 --- a/request_llm/bridge_all.py +++ b/request_llm/bridge_all.py @@ -11,7 +11,7 @@ import tiktoken from functools import lru_cache from concurrent.futures import ThreadPoolExecutor -from toolbox import get_conf +from toolbox import get_conf, trimmed_format_exc from .bridge_chatgpt import predict_no_ui_long_connection as chatgpt_noui from .bridge_chatgpt import predict as chatgpt_ui @@ -128,10 +128,7 @@ def LLM_CATCH_EXCEPTION(f): try: return f(inputs, llm_kwargs, history, sys_prompt, observe_window, console_slience) except Exception as e: - from toolbox import get_conf - import traceback - proxies, = get_conf('proxies') - tb_str = '\n```\n' + traceback.format_exc() + '\n```\n' + tb_str = '\n```\n' + trimmed_format_exc() + '\n```\n' observe_window[0] = tb_str return tb_str return decorated diff --git a/request_llm/bridge_chatgpt.py b/request_llm/bridge_chatgpt.py index 5e32f45..48eaba0 100644 --- a/request_llm/bridge_chatgpt.py +++ b/request_llm/bridge_chatgpt.py @@ -21,7 +21,7 @@ import importlib # config_private.py放自己的秘密如API和代理网址 # 读取时首先看是否存在私密的config_private配置文件(不受git管控),如果有,则覆盖原config文件 -from toolbox import get_conf, update_ui, is_any_api_key, select_api_key, what_keys, clip_history +from toolbox import get_conf, update_ui, is_any_api_key, select_api_key, what_keys, clip_history, trimmed_format_exc proxies, API_KEY, TIMEOUT_SECONDS, MAX_RETRY = \ get_conf('proxies', 'API_KEY', 'TIMEOUT_SECONDS', 'MAX_RETRY') @@ -215,7 +215,7 @@ def predict(inputs, llm_kwargs, plugin_kwargs, chatbot, history=[], system_promp chatbot[-1] = (chatbot[-1][0], "[Local Message] Not enough point. API2D账户点数不足.") else: from toolbox import regular_txt_to_markdown - tb_str = '```\n' + traceback.format_exc() + '```' + tb_str = '```\n' + trimmed_format_exc() + '```' chatbot[-1] = (chatbot[-1][0], f"[Local Message] 异常 \n\n{tb_str} \n\n{regular_txt_to_markdown(chunk_decoded[4:])}") yield from update_ui(chatbot=chatbot, history=history, msg="Json异常" + error_msg) # 刷新界面 return diff --git a/toolbox.py b/toolbox.py index c9dc207..5236f5f 100644 --- a/toolbox.py +++ b/toolbox.py @@ -5,7 +5,17 @@ import inspect import re from latex2mathml.converter import convert as tex2mathml from functools import wraps, lru_cache -############################### 插件输入输出接驳区 ####################################### + +""" +======================================================================== +函数插件输入输出接驳区 + - ChatBotWithCookies: 带Cookies的Chatbot类,为实现更多强大的功能做基础 + - ArgsGeneralWrapper: 装饰器函数,用于重组输入参数,改变输入参数的顺序与结构 + - update_ui: 刷新界面用 yield from update_ui(chatbot, history) + - CatchException: 将插件中出的所有问题显示在界面上 +======================================================================== +""" + class ChatBotWithCookies(list): def __init__(self, cookie): self._cookies = cookie @@ -20,6 +30,7 @@ class ChatBotWithCookies(list): def get_cookies(self): return self._cookies + def ArgsGeneralWrapper(f): """ 装饰器函数,用于重组输入参数,改变输入参数的顺序与结构。 @@ -47,6 +58,7 @@ def ArgsGeneralWrapper(f): yield from f(txt_passon, llm_kwargs, plugin_kwargs, chatbot_with_cookie, history, system_prompt, *args) return decorated + def update_ui(chatbot, history, msg='正常', **kwargs): # 刷新界面 """ 刷新用户界面 @@ -54,10 +66,18 @@ def update_ui(chatbot, history, msg='正常', **kwargs): # 刷新界面 assert isinstance(chatbot, ChatBotWithCookies), "在传递chatbot的过程中不要将其丢弃。必要时,可用clear将其清空,然后用for+append循环重新赋值。" yield chatbot.get_cookies(), chatbot, history, msg +def trimmed_format_exc(): + import os, traceback + str = traceback.format_exc() + current_path = os.getcwd() + replace_path = "." + return str.replace(current_path, replace_path) + def CatchException(f): """ 装饰器函数,捕捉函数f中的异常并封装到一个生成器中返回,并显示到聊天当中。 """ + @wraps(f) def decorated(txt, top_p, temperature, chatbot, history, systemPromptTxt, WEB_PORT): try: @@ -66,7 +86,7 @@ def CatchException(f): from check_proxy import check_proxy from toolbox import get_conf proxies, = get_conf('proxies') - tb_str = '```\n' + traceback.format_exc() + '```' + tb_str = '```\n' + trimmed_format_exc() + '```' if chatbot is None or len(chatbot) == 0: chatbot = [["插件调度异常", "异常原因"]] chatbot[-1] = (chatbot[-1][0], @@ -92,8 +112,11 @@ def HotReload(f): yield from f_hot_reload(*args, **kwargs) return decorated - -####################################### 其他小工具 ##################################### +""" +======================================================================== +其他小工具 +======================================================================== +""" def get_reduce_token_percent(text): """ @@ -113,7 +136,6 @@ def get_reduce_token_percent(text): return 0.5, '不详' - def write_results_to_file(history, file_name=None): """ 将对话记录history以Markdown格式写入文件中。如果没有指定文件名,则使用当前时间生成文件名。