perf: 优化聊天会话管理
This commit is contained in:
+5
-3
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -9,5 +9,5 @@ class Provider:
|
||||
pass
|
||||
|
||||
@abc.abstractmethod
|
||||
def forget(self) -> bool:
|
||||
def forget(self, session_id = None) -> bool:
|
||||
pass
|
||||
@@ -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查看详情。')
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user