perf: 优化聊天会话管理

This commit is contained in:
Soulter
2023-09-27 16:42:39 +08:00
parent 2f4e0bb4f2
commit e40c9de610
6 changed files with 62 additions and 22 deletions
+5 -3
View File
@@ -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:
+6 -2
View File
@@ -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:
+1 -1
View File
@@ -9,5 +9,5 @@ class Provider:
pass
@abc.abstractmethod
def forget(self) -> bool:
def forget(self, session_id = None) -> bool:
pass
+47 -13
View File
@@ -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查看详情。')
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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