|
|
@@ -29,18 +29,24 @@ class LinkAIBot(Bot, OpenAIImage):
|
|
|
if context.type == ContextType.TEXT:
|
|
|
return self._chat(query, context)
|
|
|
elif context.type == ContextType.IMAGE_CREATE:
|
|
|
- ok, retstring = self.create_img(query, 0)
|
|
|
- reply = None
|
|
|
+ ok, res = self.create_img(query, 0)
|
|
|
if ok:
|
|
|
- reply = Reply(ReplyType.IMAGE_URL, retstring)
|
|
|
+ reply = Reply(ReplyType.IMAGE_URL, res)
|
|
|
else:
|
|
|
- reply = Reply(ReplyType.ERROR, retstring)
|
|
|
+ reply = Reply(ReplyType.ERROR, res)
|
|
|
return reply
|
|
|
else:
|
|
|
reply = Reply(ReplyType.ERROR, "Bot不支持处理{}类型的消息".format(context.type))
|
|
|
return reply
|
|
|
|
|
|
- def _chat(self, query, context, retry_count=0):
|
|
|
+ def _chat(self, query, context, retry_count=0) -> Reply:
|
|
|
+ """
|
|
|
+ 发起对话请求
|
|
|
+ :param query: 请求提示词
|
|
|
+ :param context: 对话上下文
|
|
|
+ :param retry_count: 当前递归重试次数
|
|
|
+ :return: 回复
|
|
|
+ """
|
|
|
if retry_count >= 2:
|
|
|
# exit from retry 2 times
|
|
|
logger.warn("[LINKAI] failed after maximum number of retry times")
|
|
|
@@ -63,10 +69,8 @@ class LinkAIBot(Bot, OpenAIImage):
|
|
|
if app_code and session.messages[0].get("role") == "system":
|
|
|
session.messages.pop(0)
|
|
|
|
|
|
- logger.info(f"[LINKAI] query={query}, app_code={app_code}")
|
|
|
-
|
|
|
body = {
|
|
|
- "appCode": app_code,
|
|
|
+ "app_code": app_code,
|
|
|
"messages": session.messages,
|
|
|
"model": conf().get("model") or "gpt-3.5-turbo", # 对话模型的名称
|
|
|
"temperature": conf().get("temperature"),
|
|
|
@@ -74,31 +78,34 @@ class LinkAIBot(Bot, OpenAIImage):
|
|
|
"frequency_penalty": conf().get("frequency_penalty", 0.0), # [-2,2]之间,该值越大则更倾向于产生不同的内容
|
|
|
"presence_penalty": conf().get("presence_penalty", 0.0), # [-2,2]之间,该值越大则更倾向于产生不同的内容
|
|
|
}
|
|
|
+ logger.info(f"[LINKAI] query={query}, app_code={app_code}, mode={body.get('model')}")
|
|
|
headers = {"Authorization": "Bearer " + linkai_api_key}
|
|
|
|
|
|
# do http request
|
|
|
- res = requests.post(url=self.base_url + "/chat/completion", json=body, headers=headers).json()
|
|
|
-
|
|
|
- if not res or not res["success"]:
|
|
|
- if res.get("code") == self.AUTH_FAILED_CODE:
|
|
|
- logger.exception(f"[LINKAI] please check your linkai_api_key, res={res}")
|
|
|
- return Reply(ReplyType.ERROR, "请再问我一次吧")
|
|
|
+ res = requests.post(url=self.base_url + "/chat/completions", json=body, headers=headers,
|
|
|
+ timeout=conf().get("request_timeout", 180))
|
|
|
+ if res.status_code == 200:
|
|
|
+ # execute success
|
|
|
+ response = res.json()
|
|
|
+ reply_content = response["choices"][0]["message"]["content"]
|
|
|
+ total_tokens = response["usage"]["total_tokens"]
|
|
|
+ logger.info(f"[LINKAI] reply={reply_content}, total_tokens={total_tokens}")
|
|
|
+ self.sessions.session_reply(reply_content, session_id, total_tokens)
|
|
|
+ return Reply(ReplyType.TEXT, reply_content)
|
|
|
|
|
|
- elif res.get("code") == self.NO_QUOTA_CODE:
|
|
|
- logger.exception(f"[LINKAI] please check your account quota, https://chat.link-ai.tech/console/account")
|
|
|
- return Reply(ReplyType.ERROR, "提问太快啦,请休息一下再问我吧")
|
|
|
+ else:
|
|
|
+ response = res.json()
|
|
|
+ error = response.get("error")
|
|
|
+ logger.error(f"[LINKAI] chat failed, status_code={res.status_code}, "
|
|
|
+ f"msg={error.get('message')}, type={error.get('type')}")
|
|
|
|
|
|
- else:
|
|
|
- # retry
|
|
|
+ if res.status_code >= 500:
|
|
|
+ # server error, need retry
|
|
|
time.sleep(2)
|
|
|
logger.warn(f"[LINKAI] do retry, times={retry_count}")
|
|
|
return self._chat(query, context, retry_count + 1)
|
|
|
|
|
|
- # execute success
|
|
|
- reply_content = res["data"]["content"]
|
|
|
- logger.info(f"[LINKAI] reply={reply_content}")
|
|
|
- self.sessions.session_reply(reply_content, session_id)
|
|
|
- return Reply(ReplyType.TEXT, reply_content)
|
|
|
+ return Reply(ReplyType.ERROR, "提问太快啦,请休息一下再问我吧")
|
|
|
|
|
|
except Exception as e:
|
|
|
logger.exception(e)
|