diff --git a/pkg/qqbot/manager.py b/pkg/qqbot/manager.py index c117ea26..af58babf 100644 --- a/pkg/qqbot/manager.py +++ b/pkg/qqbot/manager.py @@ -136,9 +136,9 @@ class QQBotManager: if failed == self.retry: pkg.openai.session.get_session('person_{}'.format(event.sender.id)).release_response_lock() self.notify_admin("{} 请求超时".format("person_{}".format(event.sender.id))) - reply = "[bot]err:请求超时" + reply = ["[bot]err:请求超时"] - if reply != '': + if reply: return self.send(event, reply) # 群消息处理 @@ -164,7 +164,7 @@ class QQBotManager: if failed == self.retry: self.notify_admin("{} 请求超时".format("group_{}".format(event.sender.id))) - replys = "[bot]err:请求超时" + replys = ["[bot]err:请求超时"] return replys @@ -179,7 +179,7 @@ class QQBotManager: # 直接调用 reply = process() - if reply != '': + if reply: return self.send(event, reply) # 通知系统管理员 diff --git a/pkg/qqbot/process.py b/pkg/qqbot/process.py index 82cf0f5c..a646dc99 100644 --- a/pkg/qqbot/process.py +++ b/pkg/qqbot/process.py @@ -15,12 +15,12 @@ processing = [] @func_set_timeout(config.process_message_timeout) -def process_message(launcher_type: str, launcher_id: int, text_message: str) -> str: +def process_message(launcher_type: str, launcher_id: int, text_message: str) -> []: global processing - mgr = pkg.openai.manager.get_inst() + mgr = pkg.qqbot.manager.get_inst() - reply = '' + reply = [] session_name = "{}_{}".format(launcher_type, launcher_id) pkg.openai.session.get_session(session_name).acquire_response_lock() @@ -28,7 +28,7 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str) -> try: if session_name in processing: pkg.openai.session.get_session(session_name).release_response_lock() - return "[bot]err:正在处理中,请稍后再试" + return ["[bot]err:正在处理中,请稍后再试"] processing.append(session_name) @@ -44,36 +44,36 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str) -> params = text_message[1:].strip().split(' ')[1:] if cmd == 'help': - reply = "[bot]" + config.help_message + reply = ["[bot]" + config.help_message] elif cmd == 'reset': pkg.openai.session.get_session(session_name).reset(explicit=True) - reply = "[bot]会话已重置" + reply = ["[bot]会话已重置"] elif cmd == 'last': result = pkg.openai.session.get_session(session_name).last_session() if result is None: - reply = "[bot]没有前一次的对话" + reply = ["[bot]没有前一次的对话"] else: datetime_str = datetime.datetime.fromtimestamp(result.create_timestamp).strftime( '%Y-%m-%d %H:%M:%S') - reply = "[bot]已切换到前一次的对话:\n创建时间:{}\n".format( + reply = ["[bot]已切换到前一次的对话:\n创建时间:{}\n".format( datetime_str) + result.prompt[ :min(100, len(result.prompt))] + \ - ("..." if len(result.prompt) > 100 else "#END#") + ("..." if len(result.prompt) > 100 else "#END#")] elif cmd == 'next': result = pkg.openai.session.get_session(session_name).next_session() if result is None: - reply = "[bot]没有后一次的对话" + reply = ["[bot]没有后一次的对话"] else: datetime_str = datetime.datetime.fromtimestamp(result.create_timestamp).strftime( '%Y-%m-%d %H:%M:%S') - reply = "[bot]已切换到后一次的对话:\n创建时间:{}\n".format( + reply = ["[bot]已切换到后一次的对话:\n创建时间:{}\n".format( datetime_str) + result.prompt[ :min(100, len(result.prompt))] + \ - ("..." if len(result.prompt) > 100 else "#END#") + ("..." if len(result.prompt) > 100 else "#END#")] elif cmd == 'prompt': - reply = "[bot]当前对话所有内容:\n" + pkg.openai.session.get_session(session_name).prompt + reply = ["[bot]当前对话所有内容:\n" + pkg.openai.session.get_session(session_name).prompt] elif cmd == 'list': pkg.openai.session.get_session(session_name).persistence() page = 0 @@ -86,48 +86,52 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str) -> results = pkg.openai.session.get_session(session_name).list_history(page=page) if len(results) == 0: - reply = "[bot]第{}页没有历史会话".format(page) + reply = ["[bot]第{}页没有历史会话".format(page)] else: - reply = "[bot]历史会话 第{}页:\n".format(page) + reply_str = "[bot]历史会话 第{}页:\n".format(page) current = -1 for i in range(len(results)): # 时间(使用create_timestamp转换) 序号 部分内容 datetime_obj = datetime.datetime.fromtimestamp(results[i]['create_timestamp']) - reply += "#{} 创建:{} {}\n".format(i + page * 10, - datetime_obj.strftime("%Y-%m-%d %H:%M:%S"), - results[i]['prompt'][ - :min(20, len(results[i]['prompt']))]) + reply_str += "#{} 创建:{} {}\n".format(i + page * 10, + datetime_obj.strftime("%Y-%m-%d %H:%M:%S"), + results[i]['prompt'][ + :min(20, len(results[i]['prompt']))]) if results[i]['create_timestamp'] == pkg.openai.session.get_session( session_name).create_timestamp: current = i + page * 10 - reply += "\n以上信息倒序排列" + reply_str += "\n以上信息倒序排列" if current != -1: - reply += ",当前会话是 #{}\n".format(current) + reply_str += ",当前会话是 #{}\n".format(current) else: - reply += ",当前处于全新会话或不在此页" + reply_str += ",当前处于全新会话或不在此页" + + reply = [reply_str] elif cmd == 'usage': api_keys = pkg.openai.manager.get_inst().key_mgr.api_key - reply = "[bot]api-key使用情况:(阈值:{})\n\n".format( + reply_str = "[bot]api-key使用情况:(阈值:{})\n\n".format( pkg.openai.manager.get_inst().key_mgr.api_key_usage_threshold) using_key_name = "" for api_key in api_keys: - reply += "{}:\n - {}字 {}%\n".format(api_key, - pkg.openai.manager.get_inst().key_mgr.get_usage( - api_keys[api_key]), - round( + reply_str += "{}:\n - {}字 {}%\n".format(api_key, pkg.openai.manager.get_inst().key_mgr.get_usage( - api_keys[ - api_key]) / pkg.openai.manager.get_inst().key_mgr.api_key_usage_threshold * 100, - 3)) + api_keys[api_key]), + round( + pkg.openai.manager.get_inst().key_mgr.get_usage( + api_keys[ + api_key]) / pkg.openai.manager.get_inst().key_mgr.api_key_usage_threshold * 100, + 3)) if api_keys[api_key] == pkg.openai.manager.get_inst().key_mgr.using_key: using_key_name = api_key - reply += "\n当前使用:{}".format(using_key_name) + reply_str += "\n当前使用:{}".format(using_key_name) + + reply = [reply_str] except Exception as e: mgr.notify_admin("{}指令执行失败:{}".format(session_name, e)) logging.exception(e) - reply = "[bot]err:{}".format(e) + reply = ["[bot]err:{}".format(e)] else: # 消息 logging.info("[{}]发送消息:{}".format(session_name, text_message[:min(20, len(text_message))] + ( "..." if len(text_message) > 20 else ""))) @@ -135,10 +139,10 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str) -> session = pkg.openai.session.get_session(session_name) try: prefix = "[GPT]" if hasattr(config, "show_prefix") and config.show_prefix else "" - reply = prefix + session.append(text_message) + reply = [prefix + session.append(text_message)] except openai.error.APIConnectionError as e: mgr.notify_admin("{}会话调用API失败:{}".format(session_name, e)) - reply = "[bot]err:调用API失败,请重试或联系作者,或等待修复" + reply = ["[bot]err:调用API失败,请重试或联系作者,或等待修复"] except openai.error.RateLimitError as e: # 尝试切换api-key current_tokens_amt = pkg.openai.manager.get_inst().key_mgr.get_usage( @@ -149,24 +153,25 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str) -> if not switched: mgr.notify_admin("API调用额度超限({}),请向OpenAI账户充值或在config.py中更换api_key".format( current_tokens_amt)) - reply = "[bot]err:API调用额度超额,请联系作者,或等待修复" + reply = ["[bot]err:API调用额度超额,请联系作者,或等待修复"] else: openai.api_key = pkg.openai.manager.get_inst().key_mgr.get_using_key() mgr.notify_admin("API调用额度超限({}),已切换到{}".format(current_tokens_amt, name)) - reply = "[bot]err:API调用额度超额,已自动切换,请重新发送消息" + reply = ["[bot]err:API调用额度超额,已自动切换,请重新发送消息"] except openai.error.InvalidRequestError as e: mgr.notify_admin("{}API调用参数错误:{}\n\n这可能是由于config.py中的prompt_submit_length参数或" "completion_api_params中的max_tokens参数数值过大导致的,请尝试将其降低".format( session_name, e)) - reply = "[bot]err:API调用参数错误,请联系作者,或等待修复" + reply = ["[bot]err:API调用参数错误,请联系作者,或等待修复"] except Exception as e: logging.exception(e) - reply = "[bot]err:{}".format(e) + reply = ["[bot]err:{}".format(e)] - logging.info( - "回复[{}]消息:{}".format(session_name, - reply[:min(100, len(reply))] + ("..." if len(reply) > 100 else ""))) - reply = mgr.reply_filter.process(reply) + if reply is not None and type(reply[0]) == str: + logging.info( + "回复[{}]文字消息:{}".format(session_name, + reply[0][:min(100, len(reply[0]))] + ("..." if len(reply[0]) > 100 else ""))) + reply = [mgr.reply_filter.process(reply[0])] finally: processing.remove(session_name)