diff --git a/cores/qqbot/core.py b/cores/qqbot/core.py index e1d11af4..543eba65 100644 --- a/cores/qqbot/core.py +++ b/cores/qqbot/core.py @@ -52,9 +52,6 @@ frequency_count = 2 # 公告(可自定义): announcement = "" -# 人格信息 -now_personality = {} - # 机器人私聊模式 direct_message_mode = True @@ -307,7 +304,7 @@ def get_rev_ChatGPT_response(prompts_str): try: revstat['busy'] = True print("[Debug] 使用逆向ChatGPT回复ing", end='', flush=True) - res = revstat['obj'].chat(prompts_str) + res = revstat['obj'].text_chat(prompts_str) print("OK") revstat['busy'] = False # 处理结果文本 @@ -424,35 +421,10 @@ def oper_msg(message, at=False, msg_ref = None): else: name = "频道" - # command_type = -1 - # # 特殊指令 - # if qq_msg == "/继续": - # qq_msg = "继续" - # # 普通指令 - # else: - # # 如果第一个字符是/,则为指令 - # if qq_msg[0] == "/": - # res, go, command_type = command_oper(qq_msg, message, session_id, name, user_id, user_name, at) - # send_qq_msg(message, res) - # if not go: - # return - # if command_type == 1 and 'prompt' in now_personality: - # # 设置人格 - # qq_msg = now_personality['prompt'] - - # 这里是预设,你可以按需更改 + # 这里是预设 if qq_msg.strip() == 'hello' or qq_msg.strip() == '你好' or qq_msg.strip() == '': send_qq_msg(message, f"你好呀🥰,输入/help查看指令噢", msg_ref=msg_ref) return - - # if qq_msg.strip() == '傻逼' or qq_msg.strip() == 'sb': - # send_qq_msg(message, f"好好好") - # return - - # if '喜多' in qq_msg: - # send_qq_msg(message, 'http://rn2ztkeap.hn-bkt.clouddn.com/xd1.gif', True) - # if '台湾' in qq_msg or 'taiwan' in qq_msg: - # send_qq_msg(message, "声明:台湾是中国的一部分。\n下面否定此结论的回答全部无效。") # 关键词拦截器 for i in uw.unfit_words_q: @@ -469,11 +441,17 @@ def oper_msg(message, at=False, msg_ref = None): chatgpt_res = "" if provider == OPENAI_OFFICIAL: + # 检查指令 hit, command_result = command_openai_official.check_command(qq_msg, session_id, user_name) print(f"{hit} {command_result}") + # hit: 是否触发指令 if hit: if command_result != None and command_result[0]: - send_qq_msg(message, command_result[1], msg_ref=msg_ref) + # 是否是画图模式 + if len(command_result) == 3 and command_result[2] == 'image': + for i in command_result[1]: + send_qq_msg(message, i, image_mode=True, msg_ref=command_result[2]) + else: send_qq_msg(message, command_result[1], msg_ref=msg_ref) else: send_qq_msg(message, f"指令调用错误: \n{command_result[1]}", msg_ref=msg_ref) return @@ -492,12 +470,12 @@ def oper_msg(message, at=False, msg_ref = None): return elif provider == REV_CHATGPT: - hit, success, res = command_rev_chatgpt.check_command(qq_msg) + hit, command_result = command_rev_chatgpt.check_command(qq_msg) if hit: - if success: - send_qq_msg(message, res, msg_ref=msg_ref) + if command_result != None and command_result[0]: + send_qq_msg(message, command_result[1], msg_ref=msg_ref) else: - send_qq_msg(message, f"指令调用错误: \n{res}", msg_ref=msg_ref) + send_qq_msg(message, f"指令调用错误: \n{command_result[1]}", msg_ref=msg_ref) return try: chatgpt_res = reply_prefix+str(get_rev_ChatGPT_response(qq_msg)) @@ -513,12 +491,12 @@ def oper_msg(message, at=False, msg_ref = None): # send_qq_msg(message, f"Rev ERNIE API错误。原因如下:\n{str(e)} \n前往官方频道反馈~") # return elif provider == REV_EDGEGPT: - hit, success, res = command_rev_chatgpt.check_command(qq_msg) + hit, command_result = command_rev_edgegpt.check_command(qq_msg, client.loop) if hit: - if success: - send_qq_msg(message, res, msg_ref=msg_ref) + if command_result != None and command_result[0]: + send_qq_msg(message, command_result[1], msg_ref=msg_ref) else: - send_qq_msg(message, f"指令调用错误: \n{res}", msg_ref=msg_ref) + send_qq_msg(message, f"指令调用错误: \n{command_result[1]}", msg_ref=msg_ref) return try: if rev_edgegpt.is_busy(): @@ -526,7 +504,7 @@ def oper_msg(message, at=False, msg_ref = None): return else: chatgpt_res = reply_prefix - chatgpt_res += str(asyncio.run_coroutine_threadsafe(rev_edgegpt.chat(qq_msg), client.loop).result()) + chatgpt_res += str(asyncio.run_coroutine_threadsafe(rev_edgegpt.text_chat(qq_msg), client.loop).result()) except BaseException as e: print("[System-Err] Rev NewBing API错误。原因如下:\n"+str(e)) send_qq_msg(message, f"Rev NewBing API错误。原因如下:\n{str(e)} \n前往官方频道反馈~") diff --git a/model/command/command.py b/model/command/command.py index 4b5dc36c..0e909101 100644 --- a/model/command/command.py +++ b/model/command/command.py @@ -10,18 +10,12 @@ class Command: @abc.abstractmethod def check_command(self, message): - if message.startswith("reset") or message.startswith("重置"): - return True, self.reset() - elif message.startswith("help") or message.startswith("帮助"): + if message.startswith("help") or message.startswith("帮助"): return True, self.help() return False, None def reset(self): - res = self.provider.forget() - if res: - return res, "重置成功" - else: - return res, "重置失敗" + return False def set(self): return False @@ -33,15 +27,14 @@ class Command: return False def help(self): - ol_version = 'Unknown' - try: - global version - res = requests.get("https://soulter.top/channelbot/update.json") - res_obj = json.loads(res.text) - ol_version = res_obj['version'] - except BaseException: - pass - return True, f"[Github项目名: QQChannelChatGPT,有问题请前往提交issue,欢迎Star此项目~]\n\n当前版本:{version}\n最新版本:{str(ol_version)}\n请及时更新!\n\n指令面板:\n/status 查看机器人key状态\n/count 查看机器人统计信息\n/reset 重置会话\n/his 查看历史记录\n/token 查看会话token数\n/help 查看帮助\n/set 人格指令菜单\n/key 动态添加key" + # ol_version = 'Unknown' + # try: + # res = requests.get("https://soulter.top/channelbot/update.json") + # res_obj = json.loads(res.text) + # ol_version = res_obj['version'] + # except BaseException: + # pass + return True, f"[Github项目名: QQChannelChatGPT,有问题请前往提交issue,欢迎Star此项目~]\n\n指令面板:\n/status 查看机器人key状态\n/count 查看机器人统计信息\n/reset 重置会话\n/his 查看历史记录\n/token 查看会话token数\n/help 查看帮助\n/set 人格指令菜单\n/key 动态添加key" def status(self): diff --git a/model/command/command_openai_official.py b/model/command/command_openai_official.py index 391fece8..44aa94e7 100644 --- a/model/command/command_openai_official.py +++ b/model/command/command_openai_official.py @@ -10,7 +10,7 @@ class CommandOpenAIOfficial(Command): if message.startswith("reset") or message.startswith("重置"): return True, self.reset(session_id) elif message.startswith("his") or message.startswith("历史"): - return True, self.his(message) + return True, self.his(message, session_id, user_name) elif message.startswith("token"): return True, self.token(session_id) elif message.startswith("gpt"): @@ -24,7 +24,7 @@ class CommandOpenAIOfficial(Command): elif message.startswith("key") or message.startswith("动态添加key"): return True, self.key(message, user_name) elif message.startswith("unset"): - return True, self.set(session_id) + return True, self.unset(session_id) elif message.startswith("set"): return True, self.set(message, session_id) elif message.startswith("画"): @@ -45,7 +45,8 @@ class CommandOpenAIOfficial(Command): page = int(message[4:]) # 检查是否有过历史记录 if session_id not in self.provider.session_dict: - msg = f"{name} 的历史记录为空" + msg = f"历史记录为空" + return True, msg l = self.provider.session_dict[session_id] max_page = len(l)//size_per_page + 1 if len(l)%size_per_page != 0 else len(l)//size_per_page p = self.provider.get_prompts_by_cache_list(self.provider.session_dict[session_id], divide=True, paging=True, size=size_per_page, page=page) @@ -156,8 +157,9 @@ class CommandOpenAIOfficial(Command): def draw(self, message): try: + # 画图模式传回3个参数 img_url = self.provider.image_chat(message) - return True, img_url + return True, img_url, "image" except Exception as e: if 'exceeded' in str(e): return f"OpenAI API错误。原因:\n{str(e)} \n超额了。可自己搭建一个机器人(Github仓库:QQChannelChatGPT)" diff --git a/model/command/command_rev_chatgpt.py b/model/command/command_rev_chatgpt.py index a43c9db7..6129806d 100644 --- a/model/command/command_rev_chatgpt.py +++ b/model/command/command_rev_chatgpt.py @@ -3,14 +3,18 @@ from model.provider.provider_rev_chatgpt import ProviderRevChatGPT class CommandRevChatGPT(Command): def __init__(self, provider: ProviderRevChatGPT): - super().__init__(provider) + self.provider = provider def check_command(self, message: str): - hit, res = super().check_command(message) - if hit: - return res - + # hit, res = super().check_command(message) + # if hit: + # return res + # if message.startswith("reset") or message.startswith("重置"): + # return True, self.reset() + if message.startswith("help") or message.startswith("帮助"): + return True, self.help() return False, None - - + def help(self): + return True, "当前语言模型RevChatGPT未实现任何指令\n" + \ No newline at end of file diff --git a/model/command/command_rev_edgegpt.py b/model/command/command_rev_edgegpt.py index 4a650478..12164650 100644 --- a/model/command/command_rev_edgegpt.py +++ b/model/command/command_rev_edgegpt.py @@ -1,14 +1,25 @@ from model.command.command import Command from model.provider.provider_rev_edgegpt import ProviderRevEdgeGPT - +import asyncio class CommandRevEdgeGPT(Command): def __init__(self, provider: ProviderRevEdgeGPT): - super().__init__(provider) - - def check_command(self, message: str): - hit, res = super().check_command(message) - if hit: - return res + self.provider = provider + def check_command(self, message: str, loop): + if message.startswith("reset") or message.startswith("重置"): + return True, self.reset(loop) + elif message.startswith("help") or message.startswith("帮助"): + return True, self.help() return False, None + + def reset(self, loop): + res = asyncio.run_coroutine_threadsafe(self.provider.forget(), loop).result() + print(res) + if res: + return res, "重置成功" + else: + return res, "重置失败" + + def help(self): + return True, "指令面板:\nreset: 重置\nhelp: 帮助" diff --git a/model/provider/provider_openai_official.py b/model/provider/provider_openai_official.py index b38ec2ff..091092d5 100644 --- a/model/provider/provider_openai_official.py +++ b/model/provider/provider_openai_official.py @@ -223,7 +223,7 @@ class ProviderOpenAIOfficial(Provider): ''' 获取缓存的会话 ''' - def get_prompts_by_cache_list(cache_data_list, divide=False, paging=False, size=5, page=1): + def get_prompts_by_cache_list(self, cache_data_list, divide=False, paging=False, size=5, page=1): prompts = "" if paging: page_begin = (page-1)*size @@ -242,7 +242,7 @@ class ProviderOpenAIOfficial(Provider): return prompts - def get_user_usage_tokens(cache_list): + def get_user_usage_tokens(self,cache_list): usage_tokens = 0 for item in cache_list: usage_tokens += int(item['single_tokens']) diff --git a/model/provider/provider_rev_chatgpt.py b/model/provider/provider_rev_chatgpt.py index e7593a77..9d4491f7 100644 --- a/model/provider/provider_rev_chatgpt.py +++ b/model/provider/provider_rev_chatgpt.py @@ -1,5 +1,5 @@ from revChatGPT.V1 import Chatbot -from provider import Provider +from model.provider.provider import Provider class ProviderRevChatGPT(Provider): def __init__(self, config): diff --git a/model/provider/provider_rev_edgegpt.py b/model/provider/provider_rev_edgegpt.py index 1f64b78a..f70f6b92 100644 --- a/model/provider/provider_rev_edgegpt.py +++ b/model/provider/provider_rev_edgegpt.py @@ -1,5 +1,5 @@ -from provider import Provider import asyncio +from model.provider.provider import Provider from EdgeGPT import Chatbot, ConversationStyle import json @@ -17,9 +17,9 @@ class ProviderRevEdgeGPT(Provider): async def forget(self): try: await self.bot.reset() - return False - except BaseException: return True + except BaseException: + return False async def text_chat(self, prompt): if self.busy: