diff --git a/cores/qqbot/core.py b/cores/qqbot/core.py index 4d492954b..92dadb09b 100644 --- a/cores/qqbot/core.py +++ b/cores/qqbot/core.py @@ -475,7 +475,7 @@ def oper_msg(message, group: 群聊模式, message: 频道是频道的消息对象, QQ是nakuru-gocq的消息对象 """ - global provider, session_dict + global provider, session_dict, uniqueSession qq_msg = '' session_id = '' user_id = '' @@ -533,7 +533,6 @@ def oper_msg(message, session_id = message.group_id else: with_tag = True - # qq_msg = message.message[0].text session_id = message.user_id role = "member" @@ -547,6 +546,9 @@ def oper_msg(message, sender_id == cc.get("gocq_qqchan_admin", ""): # gu.log("检测到管理员身份", gu.LEVEL_INFO, tag="GOCQ") role = "admin" + if uniqueSession: + # 独立会话时,一个用户一个session + session_id = sender_id if platform == PLATFORM_QQCHAN: with_tag = True @@ -645,7 +647,7 @@ def oper_msg(message, try: if chosen_provider == REV_CHATGPT or chosen_provider == OPENAI_OFFICIAL: if _global_object != None and "web_search" in _global_object and _global_object["web_search"]: - chatgpt_res = gplugin.web_search(qq_msg, llm_instance[chosen_provider]) + chatgpt_res = gplugin.web_search(qq_msg, llm_instance[chosen_provider], session_id) else: chatgpt_res = str(llm_instance[chosen_provider].text_chat(qq_msg, session_id)) elif chosen_provider == REV_EDGEGPT: diff --git a/model/command/command_rev_chatgpt.py b/model/command/command_rev_chatgpt.py index d1cb7e748..2222e8b56 100644 --- a/model/command/command_rev_chatgpt.py +++ b/model/command/command_rev_chatgpt.py @@ -106,8 +106,12 @@ class CommandRevChatGPT(Command): for revstat in rev_chatgpt: index += 1 ret += f"[{index}]. {revstat['id']}\n" - if session_id in revstat['user']: - curr_ = revstat['id'] + # if session_id in revstat['user']: + # curr_ = revstat['id'] + for user in revstat['user']: + if session_id == user['id']: + curr_ = revstat['id'] + break if curr_ is None: ret += "当前您未选择账号。输入/switch <账号序号>切换账号。" else: diff --git a/model/provider/provider.py b/model/provider/provider.py index 5ddd7c749..ec9c7a06a 100644 --- a/model/provider/provider.py +++ b/model/provider/provider.py @@ -9,5 +9,5 @@ class Provider: pass @abc.abstractmethod - def forget(self) -> bool: + def forget(self, session_id = None) -> bool: pass \ No newline at end of file diff --git a/model/provider/provider_rev_chatgpt.py b/model/provider/provider_rev_chatgpt.py index 080f5d37e..362a86f28 100644 --- a/model/provider/provider_rev_chatgpt.py +++ b/model/provider/provider_rev_chatgpt.py @@ -30,7 +30,7 @@ class ProviderRevChatGPT(Provider): rev_account_config['unverified_plugin_domains'] = self.cc.get("rev_chatgpt_unverified_plugin_domains") cb = Chatbot(config=rev_account_config) # cb.captcha_solver = self.__captcha_solver - # 后八位 + # 后八位c g_id = rev_account_config['access_token'][-8:] revstat = { 'id': g_id, @@ -44,13 +44,14 @@ class ProviderRevChatGPT(Provider): def forget(self, session_id = None) -> bool: for i in self.rev_chatgpt: - if session_id is None or session_id in i['user']: - try: - i['obj'].reset_chat() - return True - except BaseException as e: - gu.log(f"重置RevChatGPT失败。原因: {str(e)}", level=gu.LEVEL_ERROR, tag="RevChatGPT") - return False + for user in i['user']: + if session_id == user['id']: + try: + i['obj'].reset_chat() + return True + except BaseException as e: + gu.log(f"重置RevChatGPT失败。原因: {str(e)}", level=gu.LEVEL_ERROR, tag="RevChatGPT") + return False return False def get_revchatgpt(self) -> list: @@ -104,19 +105,34 @@ class ProviderRevChatGPT(Provider): selected_revstat = None min_revstat = None min_ = None + new_user = False + conversation_id = '' + parent_id = '' for revstat in self.rev_chatgpt: + for user in revstat['user']: + if session_id == user['id']: + selected_revstat = revstat + conversation_id = user['conversation_id'] + parent_id = user['parent_id'] + break if min_ is None: min_ = len(revstat['user']) min_revstat = revstat elif len(revstat['user']) < min_: min_ = len(revstat['user']) min_revstat = revstat - if session_id in revstat['user']: - selected_revstat = revstat - break + # if session_id in revstat['user']: + # selected_revstat = revstat + # break + if selected_revstat is None: selected_revstat = min_revstat - selected_revstat['user'].append(session_id) + selected_revstat['user'].append({ + 'id': session_id, + 'conversation_id': '', + 'parent_id': '' + }) + new_user = True gu.log(f"选择账号{str(selected_revstat)}", tag="RevChatGPT", level=gu.LEVEL_DEBUG) @@ -124,6 +140,15 @@ class ProviderRevChatGPT(Provider): gu.log(f"账号忙碌,等待中...", tag="RevChatGPT", level=gu.LEVEL_DEBUG) time.sleep(1) selected_revstat['busy'] = True + + if not new_user: + # 非新用户,则使用其专用的会话 + selected_revstat['obj'].conversation_id = conversation_id + selected_revstat['obj'].parent_id = parent_id + else: + # 新用户,则使用新的会话 + selected_revstat['obj'].reset_chat() + res = '' err_msg = '' err_cnt = 0 @@ -131,6 +156,15 @@ class ProviderRevChatGPT(Provider): try: res = self.request_text(prompt, selected_revstat['obj']) selected_revstat['busy'] = False + # 记录新用户的会话 + if new_user: + i = 0 + for user in selected_revstat['user']: + if user['id'] == session_id: + selected_revstat['user'][i]['conversation_id'] = selected_revstat['obj'].conversation_id + selected_revstat['user'][i]['parent_id'] = selected_revstat['obj'].parent_id + break + i += 1 return res.strip() except BaseException as e: if "Your authentication token has expired. Please try signing in again." in str(e): @@ -141,7 +175,7 @@ class ProviderRevChatGPT(Provider): raise Exception("触发RevChatGPT请求频率限制。请1小时后再试,或者切换账号。") gu.log(f"请求异常: {str(e)}", level=gu.LEVEL_WARNING, tag="RevChatGPT") err_cnt += 1 - selected_revstat['busy'] = False + raise Exception(f'回复失败。原因:{err_msg}。如果您设置了多个账号,可以使用/switch指令切换账号。输入/switch查看详情。') diff --git a/model/provider/provider_rev_edgegpt.py b/model/provider/provider_rev_edgegpt.py index f6bf77a74..6352f83ee 100644 --- a/model/provider/provider_rev_edgegpt.py +++ b/model/provider/provider_rev_edgegpt.py @@ -21,7 +21,7 @@ class ProviderRevEdgeGPT(Provider): def is_busy(self): return self.busy - async def forget(self): + async def forget(self, session_id = None): try: await self.bot.reset() return True diff --git a/util/gplugin.py b/util/gplugin.py index ec3ccb80c..907629e73 100644 --- a/util/gplugin.py +++ b/util/gplugin.py @@ -114,7 +114,7 @@ def fetch_website_content(url): f.write(res) return res -def web_search(question, provider): +def web_search(question, provider, session_id): new_func_call = FuncCall(provider) @@ -137,7 +137,7 @@ def web_search(question, provider): has_func = True if has_func: - provider.forget() + provider.forget(session_id) question3 = f"""请你回答`{question}`问题。\n以下是相关材料,请直接拿此材料针对问题进行总结回答,再给出参考链接。不要提到任何函数调用的信息。```\n{res1}\n```\n""" print(question3) _c = 0