feat: 回复消息引用 #28

perf: 完善逆向库中RateLimit的切换机制
perf: 其他优化
This commit is contained in:
Soulter
2023-03-06 23:23:44 +08:00
parent c0e4d0595b
commit 09cfd18f6f
2 changed files with 65 additions and 24 deletions
+27 -7
View File
@@ -1,4 +1,4 @@
from revChatGPT.V1 import Chatbot
from revChatGPT.V1 import Chatbot, Error
class revChatGPT:
def __init__(self, config):
@@ -10,6 +10,20 @@ class revChatGPT:
def chat(self, prompt):
resp = ''
"""
Base class for exceptions in this module.
Error codes:
-1: User error
0: Unknown error
1: Server error
2: Rate limit error
3: Invalid request error
4: Expired access token error
5: Invalid access token error
6: Prohibited concurrent query error
"""
err_count = 0
retry_count = 5
@@ -18,12 +32,18 @@ class revChatGPT:
for data in self.chatbot.ask(prompt):
resp = data["message"]
break
except BaseException as e:
print(e)
print("[RevChatGPT] 请求出现了一些问题, 正在重试。次数"+str(err_count))
err_count += 1
if err_count == retry_count:
raise e
except Error as e:
try:
if e.code == 2:
print("[RevChatGPT] 频率限制")
raise e
else:
print("[RevChatGPT] 请求出现了一些问题, 正在重试。次数"+str(err_count))
err_count += 1
if err_count >= retry_count:
raise e
except BaseException:
err_count += 1
print("[RevChatGPT] "+str(resp))
return resp
+38 -17
View File
@@ -1,5 +1,6 @@
import botpy
from botpy.message import Message
from botpy.types.message import Reference
import yaml
import re
from util.errors.errors import PromptExceededError
@@ -80,8 +81,9 @@ class botClient(botpy.Client):
# 收到At消息
async def on_at_message_create(self, message: Message):
toggle_count(at=True, message=message)
message_reference = Reference(message_id=message.id, ignore_get_message_error=False)
# executor.submit(oper_msg, message, True)
new_sub_thread(oper_msg, (message, True))
new_sub_thread(oper_msg, (message, True, message_reference))
# await oper_msg(message=message, at=True)
# 收到私聊消息
@@ -335,14 +337,26 @@ def get_rev_ChatGPT_response(prompts_str):
print("[Debug] "+str(rev_chatgpt))
for revstat in rev_chatgpt:
if not revstat['busy']:
revstat['busy'] = True
print("[Debug] 使用逆向ChatGPT回复ing", end='')
res = revstat['obj'].chat(prompts_str)
print("OK")
revstat['busy'] = False
# 处理结果文本
chatgpt_res = res.strip()
return res
try:
revstat['busy'] = True
print("[Debug] 使用逆向ChatGPT回复ing", end='', flush=True)
res = revstat['obj'].chat(prompts_str)
print("OK")
revstat['busy'] = False
# 处理结果文本
chatgpt_res = res.strip()
return res
except Exception as e:
print("[System-Error] 逆向ChatGPT回复失败" + str(e))
try:
if e.code == 2:
print("[System-Error] 频率限制,正在切换账号。"+ str(e))
continue
else:
res = '所有的非忙碌OpenAI账号经过测试都暂时出现问题,请稍后再试或者联系管理员~'
return res
except BaseException:
continue
res = '所有的OpenAI账号都有负载, 请稍后再试~'
return res
@@ -350,10 +364,13 @@ def get_rev_ChatGPT_response(prompts_str):
'''
回复QQ消息
'''
def send_qq_msg(message, res, image_mode=False):
def send_qq_msg(message, res, image_mode=False, msg_ref = None):
if not image_mode:
try:
res = asyncio.run_coroutine_threadsafe(message.reply(content=res), client.loop)
if msg_ref is not None:
res = asyncio.run_coroutine_threadsafe(message.reply(content=res, message_reference = msg_ref), client.loop)
else:
res = asyncio.run_coroutine_threadsafe(message.reply(content=res), client.loop)
res.result()
except BaseException as e:
print("[System-Error] 回复QQ消息失败")
@@ -414,7 +431,7 @@ def check_frequency(id) -> bool:
'''
处理消息
'''
def oper_msg(message, at=False, loop=None):
def oper_msg(message, at=False, msg_ref = None):
global session_dict, provider
print("[QQBOT] 接收到消息:"+ str(message.content))
qq_msg = ''
@@ -469,7 +486,7 @@ def oper_msg(message, at=False, loop=None):
# 这里是预设,你可以按需更改
if qq_msg.strip() == 'hello' or qq_msg.strip() == '你好' or qq_msg.strip() == '':
send_qq_msg(message, f"你好呀~")
send_qq_msg(message, f"你好呀~", msg_ref=msg_ref)
return
# if qq_msg.strip() == '傻逼' or qq_msg.strip() == 'sb':
# send_qq_msg(message, f"好好好")
@@ -482,7 +499,7 @@ def oper_msg(message, at=False, loop=None):
# 关键词拦截器
for i in uw.unfit_words_q:
if i in qq_msg.strip():
send_qq_msg(message, f"你的提问中有不太合适的内容😭\n请更换措辞~")
send_qq_msg(message, f"你的提问中有不太合适的内容😭\n请更换措辞~", msg_ref=msg_ref)
return
# 会话机制
@@ -504,6 +521,10 @@ def oper_msg(message, at=False, loop=None):
f.close()
chatgpt_res = "[Error] 占位符"
send_qq_msg(message, f"正在思考!\n(此机器人供测试,稳定性无法保证。加入[GPT机器人]了解更多)", msg_ref=msg_ref)
if provider == OPENAI_OFFICIAL:
# 获取缓存
@@ -620,20 +641,20 @@ def oper_msg(message, at=False, loop=None):
if i in gap_chatgpt_res:
gap_chatgpt_res = gap_chatgpt_res.replace(i, "***")
# 发送信息
send_qq_msg(message, ''+gap_chatgpt_res)
send_qq_msg(message, ''+gap_chatgpt_res, msg_ref=msg_ref)
except BaseException as e:
print("QQ频道API错误: \n"+str(e))
f_res = ""
for t in chatgpt_res:
f_res += t + ' '
try:
send_qq_msg(message, ''+f_res)
send_qq_msg(message, ''+f_res, msg_ref=msg_ref)
# send(message, f"QQ频道API错误:{str(e)}\n下面是格式化后的回答:\n{f_res}")
except BaseException as e:
# 如果还是不行则过滤url
f_res = re.sub(r'(https|http)?:\/\/(\w|\.|\/|\?|\=|\&|\%)*\b', '[被隐藏的链接]', str(e), flags=re.MULTILINE)
f_res = f_res.replace(".", "·")
send_qq_msg(message, ''+f_res)
send_qq_msg(message, ''+f_res, msg_ref=msg_ref)
# send(message, f"QQ频道API错误:{str(e)}\n下面是格式化后的回答:\n{f_res}")
# 记录日志