feat: no quota hint and add group qrcodemaster
@@ -27,6 +27,12 @@ https://user-images.githubusercontent.com/26161723/233777277-e3b9928e-b88f-43e2- | |||||
Demo made by [Visionn](https://www.wangpc.cc/) | Demo made by [Visionn](https://www.wangpc.cc/) | ||||
# 体验 | |||||
了解项目更新和体验最新功能: | |||||
<img width="240" src="./docs/images/contact.jpg"> | |||||
# 更新日志 | # 更新日志 | ||||
>**2023.04.26:** 支持企业微信应用号部署,兼容插件,并支持语音图片交互,支持Railway部署,[使用文档](https://github.com/zhayujie/chatgpt-on-wechat/blob/master/channel/wechatcom/README.md)。(contributed by [@lanvent](https://github.com/lanvent) in [#944](https://github.com/zhayujie/chatgpt-on-wechat/pull/944)) | >**2023.04.26:** 支持企业微信应用号部署,兼容插件,并支持语音图片交互,支持Railway部署,[使用文档](https://github.com/zhayujie/chatgpt-on-wechat/blob/master/channel/wechatcom/README.md)。(contributed by [@lanvent](https://github.com/lanvent) in [#944](https://github.com/zhayujie/chatgpt-on-wechat/pull/944)) | ||||
@@ -205,6 +211,8 @@ FAQs: <https://github.com/zhayujie/chatgpt-on-wechat/wiki/FAQs> | |||||
## 联系 | ## 联系 | ||||
欢迎提交PR、Issues,以及Star支持一下。程序运行遇到问题优先查看 [常见问题列表](https://github.com/zhayujie/chatgpt-on-wechat/wiki/FAQs) ,其次前往 [Issues](https://github.com/zhayujie/chatgpt-on-wechat/issues) 中搜索。如果你想了解更多项目细节,并与开发者们交流更多关于AI技术的实践,欢迎加入星球: | |||||
欢迎提交PR、Issues,以及Star支持一下。程序运行遇到问题可以查看 [常见问题列表](https://github.com/zhayujie/chatgpt-on-wechat/wiki/FAQs) ,其次前往 [Issues](https://github.com/zhayujie/chatgpt-on-wechat/issues) 中搜索。 | |||||
如果你想了解更多项目细节,与开发者们交流更多关于AI技术的实践,欢迎加入星球: | |||||
<a href="https://public.zsxq.com/groups/88885848842852.html"><img width="360" src="./docs/images/planet.jpg"></a> | <a href="https://public.zsxq.com/groups/88885848842852.html"><img width="360" src="./docs/images/planet.jpg"></a> |
@@ -1,5 +1,7 @@ | |||||
# access LinkAI knowledge base platform | |||||
# docs: https://link-ai.tech/platform/link-app/wechat | |||||
from bot.bot import Bot | from bot.bot import Bot | ||||
from bridge.context import ContextType | |||||
from bridge.reply import Reply, ReplyType | from bridge.reply import Reply, ReplyType | ||||
from common.log import logger | from common.log import logger | ||||
from bridge.context import Context | from bridge.context import Context | ||||
@@ -13,6 +15,7 @@ class LinkAIBot(Bot): | |||||
# authentication failed | # authentication failed | ||||
AUTH_FAILED_CODE = 401 | AUTH_FAILED_CODE = 401 | ||||
NO_QUOTA_CODE = 406 | |||||
def __init__(self): | def __init__(self): | ||||
self.base_url = "https://api.link-ai.chat/v1" | self.base_url = "https://api.link-ai.chat/v1" | ||||
@@ -51,19 +54,27 @@ class LinkAIBot(Bot): | |||||
res = requests.post(url=self.base_url + "/chat/completion", json=body, headers=headers).json() | res = requests.post(url=self.base_url + "/chat/completion", json=body, headers=headers).json() | ||||
if not res or not res["success"]: | if not res or not res["success"]: | ||||
if res.get("code") == self.AUTH_FAILED_CODE: | if res.get("code") == self.AUTH_FAILED_CODE: | ||||
logger.exception(f"[LINKAI] please check your linkai_api_key, res={res}") | logger.exception(f"[LINKAI] please check your linkai_api_key, res={res}") | ||||
return Reply(ReplyType.ERROR, "请再问我一次吧") | return Reply(ReplyType.ERROR, "请再问我一次吧") | ||||
elif res.get("code") == self.NO_QUOTA_CODE: | |||||
logger.exception(f"[LINKAI] please check your account quota, https://link-ai.chat/console/account") | |||||
return Reply(ReplyType.ERROR, "提问太快啦,请休息一下再问我吧") | |||||
else: | else: | ||||
# retry | # retry | ||||
time.sleep(2) | time.sleep(2) | ||||
logger.warn(f"[LINKAI] do retry, times={retry_count}") | logger.warn(f"[LINKAI] do retry, times={retry_count}") | ||||
return self._chat(query, context, retry_count + 1) | return self._chat(query, context, retry_count + 1) | ||||
# execute success | # execute success | ||||
reply_content = res["data"]["content"] | reply_content = res["data"]["content"] | ||||
logger.info(f"[LINKAI] reply={reply_content}") | logger.info(f"[LINKAI] reply={reply_content}") | ||||
self.sessions.session_reply(reply_content, session_id) | self.sessions.session_reply(reply_content, session_id) | ||||
return Reply(ReplyType.TEXT, reply_content) | return Reply(ReplyType.TEXT, reply_content) | ||||
except Exception as e: | except Exception as e: | ||||
logger.exception(e) | logger.exception(e) | ||||
# retry | # retry | ||||
@@ -1,6 +1,8 @@ | |||||
{ | { | ||||
"open_ai_api_key": "YOUR API KEY", | "open_ai_api_key": "YOUR API KEY", | ||||
"model": "gpt-3.5-turbo", | "model": "gpt-3.5-turbo", | ||||
"linkai_api_key": "YOUR API KEY", | |||||
"linkai_app_code": "", | |||||
"proxy": "", | "proxy": "", | ||||
"single_chat_prefix": [ | "single_chat_prefix": [ | ||||
"bot", | "bot", | ||||
@@ -297,7 +297,7 @@ class Godcmd(Plugin): | |||||
except Exception as e: | except Exception as e: | ||||
ok, result = False, "你没有设置私有GPT模型" | ok, result = False, "你没有设置私有GPT模型" | ||||
elif cmd == "reset": | elif cmd == "reset": | ||||
if bottype in [const.OPEN_AI, const.CHATGPT, const.CHATGPTONAZURE]: | |||||
if bottype in [const.OPEN_AI, const.CHATGPT, const.CHATGPTONAZURE, const.LINKAI]: | |||||
bot.sessions.clear_session(session_id) | bot.sessions.clear_session(session_id) | ||||
channel.cancel_session(session_id) | channel.cancel_session(session_id) | ||||
ok, result = True, "会话已重置" | ok, result = True, "会话已重置" | ||||