From aba9d945b57df8c02cf9cf29ffaf650d24dd55b4 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Sat, 1 Apr 2023 09:59:33 +0800
Subject: [PATCH 01/46] =?UTF-8?q?doc:=20=E6=94=B6=E8=B5=B7=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD=E6=A6=82=E8=BF=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/README.md b/README.md
index ef97069e..699146a6 100644
--- a/README.md
+++ b/README.md
@@ -47,6 +47,9 @@
## ✅功能
+
+点击此处展开概述
+
✅支持敏感词过滤,避免账号风险
@@ -124,6 +127,7 @@
- 目前已支持正向代理访问接口
- 详细请查看config.py中的`openai_config`的说明
+
详情请查看[Wiki功能使用页](https://github.com/RockChinQ/QChatGPT/wiki/%E5%8A%9F%E8%83%BD%E4%BD%BF%E7%94%A8#%E5%8A%9F%E8%83%BD%E7%82%B9%E5%88%97%E4%B8%BE)
From 70386abadd8e7adaa509cf49399a383d113e68f3 Mon Sep 17 00:00:00 2001
From: zyckk4 <2240486388@qq.com>
Date: Sun, 2 Apr 2023 14:43:34 +0800
Subject: [PATCH 02/46] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E8=A1=8C=E5=B0=BE?=
=?UTF-8?q?=E7=A9=BA=E6=A0=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
config-template.py | 12 ++++++------
pkg/openai/manager.py | 4 ++--
pkg/qqbot/command.py | 2 +-
pkg/qqbot/filter.py | 4 ++--
4 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/config-template.py b/config-template.py
index 7ff08d26..23caf4b2 100644
--- a/config-template.py
+++ b/config-template.py
@@ -33,9 +33,9 @@ mirai_http_api_config = {
# },
# "http_proxy": "http://127.0.0.1:12345"
# }
-#
+#
# 现已支持反向代理,可以添加reverse_proxy字段以使用反向代理
-# 使用反向代理可以在国内使用OpenAI的API,反向代理的配置请参考
+# 使用反向代理可以在国内使用OpenAI的API,反向代理的配置请参考
# https://github.com/Ice-Hazymoon/openai-scf-proxy
#
# 反向代理填写示例:
@@ -63,7 +63,7 @@ admin_qq = 0
# 情景预设(机器人人格)
# 每个会话的预设信息,影响所有会话,无视指令重置
# 可以通过这个字段指定某些情况的回复,可直接用自然语言描述指令
-# 例如:
+# 例如:
# default_prompt = "如果我之后想获取帮助,请你说“输入!help获取帮助”"
# 这样用户在不知所措的时候机器人就会提示其输入!help获取帮助
# 可参考 https://github.com/PlexPt/awesome-chatgpt-prompts-zh
@@ -81,14 +81,14 @@ admin_qq = 0
# 例如:
# !reset linux-terminal
# 若不指定名称,则使用默认情景预设
-#
+#
# 也可以使用指令:
# !default <名称>
# 将指定的情景预设设置为默认情景预设
# 例如:
# !default linux-terminal
# 之后的会话重置时若不指定名称,则使用linux-terminal情景预设
-#
+#
# 还可以加载文件中的预设文字,使用方法请查看:https://github.com/RockChinQ/QChatGPT/wiki/%E5%8A%9F%E8%83%BD%E4%BD%BF%E7%94%A8#%E9%A2%84%E8%AE%BE%E6%96%87%E5%AD%97
default_prompt = {
"default": "如果我之后想获取帮助,请你说“输入!help获取帮助”",
@@ -160,7 +160,7 @@ prompt_submit_length = 2048
# OpenAI补全API的参数
# 请在下方填写模型,程序自动选择接口
# 现已支持的模型有:
-#
+#
# 'gpt-4'
# 'gpt-4-0314'
# 'gpt-4-32k'
diff --git a/pkg/openai/manager.py b/pkg/openai/manager.py
index 2d64e9a3..1032e3dd 100644
--- a/pkg/openai/manager.py
+++ b/pkg/openai/manager.py
@@ -48,8 +48,8 @@ class OpenAIInteract:
# 根据模型选择使用的接口
ai: ModelRequest = create_openai_model_request(
- config.completion_api_params['model'],
- 'user',
+ config.completion_api_params['model'],
+ 'user',
config.openai_config["http_proxy"] if "http_proxy" in config.openai_config else None
)
ai.request(
diff --git a/pkg/qqbot/command.py b/pkg/qqbot/command.py
index 3527c5a8..9081e58e 100644
--- a/pkg/qqbot/command.py
+++ b/pkg/qqbot/command.py
@@ -32,7 +32,7 @@ def process_command(session_name: str, text_message: str, mgr, config,
params = text_message[1:].strip().split(' ')[1:]
- # 把!~开头的转换成!cfg
+ # 把!~开头的转换成!cfg
if cmd.startswith('~'):
params = [cmd[1:]] + params
cmd = 'cfg'
diff --git a/pkg/qqbot/filter.py b/pkg/qqbot/filter.py
index f0efeda9..fa052a07 100644
--- a/pkg/qqbot/filter.py
+++ b/pkg/qqbot/filter.py
@@ -50,8 +50,8 @@ class ReplyFilter:
# 百度云审核URL
baidu_url = "https://aip.baidubce.com/rest/2.0/solution/v1/text_censor/v2/user_defined?access_token=" + \
- str(requests.post("https://aip.baidubce.com/oauth/2.0/token",
- params={"grant_type": "client_credentials",
+ str(requests.post("https://aip.baidubce.com/oauth/2.0/token",
+ params={"grant_type": "client_credentials",
"client_id": self.baidu_api_key,
"client_secret": self.baidu_secret_key}).json().get("access_token"))
From f079d7b9fa636eb0b01644165cf523dc612c37a4 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Sun, 2 Apr 2023 16:24:30 +0800
Subject: [PATCH 03/46] =?UTF-8?q?fix:=20Windows=E4=B8=8A=E6=97=A0=E6=B3=95?=
=?UTF-8?q?=E8=AF=BB=E5=8F=96=E5=92=8C=E5=BA=94=E7=94=A8=E5=91=BD=E4=BB=A4?=
=?UTF-8?q?=E6=9D=83=E9=99=90=E9=85=8D=E7=BD=AE=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/qqbot/cmds/mgr.py | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/pkg/qqbot/cmds/mgr.py b/pkg/qqbot/cmds/mgr.py
index da45d160..65066ce7 100644
--- a/pkg/qqbot/cmds/mgr.py
+++ b/pkg/qqbot/cmds/mgr.py
@@ -315,12 +315,16 @@ def register_all():
def apply_privileges():
"""读取cmdpriv.json并应用指令权限"""
- with open('cmdpriv.json', 'r') as f:
- data = json.load(f)
- for path, priv in data.items():
- if path == 'comment':
- continue
- if __command_list__[path]['privilege'] != priv:
- logging.debug('应用权限: {} -> {}(default: {})'.format(path, priv, __command_list__[path]['privilege']))
+ # 读取内容
+ json_str = ""
+ with open('cmdpriv.json', 'r', encoding="utf-8") as f:
+ json_str = f.read()
- __command_list__[path]['privilege'] = priv
+ data = json.loads(json_str)
+ for path, priv in data.items():
+ if path == 'comment':
+ continue
+ if __command_list__[path]['privilege'] != priv:
+ logging.debug('应用权限: {} -> {}(default: {})'.format(path, priv, __command_list__[path]['privilege']))
+
+ __command_list__[path]['privilege'] = priv
From 9617be0ca486db0c8ee5fa6c5d2bd39075d5d2b4 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Sun, 2 Apr 2023 16:30:42 +0800
Subject: [PATCH 04/46] =?UTF-8?q?fix:=20=E6=9C=AA=E6=8C=87=E5=AE=9Autf-8?=
=?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=B7=B2=E8=BE=93=E5=87=BA=E7=9A=84=E5=85=AC?=
=?UTF-8?q?=E5=91=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/utils/announcement.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/pkg/utils/announcement.py b/pkg/utils/announcement.py
index bec74bad..c348d36a 100644
--- a/pkg/utils/announcement.py
+++ b/pkg/utils/announcement.py
@@ -22,10 +22,10 @@ def read_saved() -> str:
# 已保存的在res/announcement_saved
# 检查是否存在
if not os.path.exists("res/announcement_saved"):
- with open("res/announcement_saved", "w") as f:
+ with open("res/announcement_saved", "w", encoding="utf-8") as f:
f.write("")
- with open("res/announcement_saved", "r") as f:
+ with open("res/announcement_saved", "r", encoding="utf-8") as f:
content = f.read()
return content
@@ -33,7 +33,7 @@ def read_saved() -> str:
def write_saved(content: str):
# 已保存的在res/announcement_saved
- with open("res/announcement_saved", "w") as f:
+ with open("res/announcement_saved", "w", encoding="utf-8") as f:
f.write(content)
From 8164f4b5069649085c965e59d7826aa181a4e35b Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Sun, 2 Apr 2023 16:32:52 +0800
Subject: [PATCH 05/46] Release v2.3.1
---
pkg/utils/constants.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pkg/utils/constants.py b/pkg/utils/constants.py
index 27594ab2..f7d36a35 100644
--- a/pkg/utils/constants.py
+++ b/pkg/utils/constants.py
@@ -2,4 +2,4 @@ alipay_qr_b64 = """/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAA
wechat_qr_b64 = """iVBORw0KGgoAAAANSUhEUgAAASwAAAFSCAYAAABIVeLEAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAB5iUlEQVR4Xu2dB2Ac1dHH5/qdumTJvVdsMJjimI7BQAi99wChl5jQe/sIhN4CgdAChB56gNB7sTE2uIAx2Ma4SrZ61/Vv/rO70up0p2LLts6eH6xv9+3u273T7f9m5s17zxFnSFEUJQ1wmq+Koig9HhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUspduorq6mc889l958802zpGNef/11uuCCC6i8vNwsUZTU6MzPSrdx9NFH00svvSTr0WiUnM6Ofw8dDoe8HnPMMfTCCy/IuqKkQi0sJSXLli2jSy65hIqLi82S9olEIuaacW5HrFq1ylwj6uzvJs656qqraPny5WaJsjmhgqWkZL/99qO77rqLJk+ebJa0T//+/c016pSLV1paaq4RFRUVmWvtM378eLrlllvk3pTNDxUsJSXbbbedvE6aNEleO2K33XYz14jq6urMtdRUVVWZa0Tbb7+9uZaalStXUkVFhax7vV55VTYvNIaltAusoM5aP2DPPfek3r1704svvmiWtM+BBx5IsViM3nrrrQ5jXk8//TSddNJJsn7llVfS3/72N1lXNh9UsDYzlixZQsOGDTO30guIFUQLzJo1q9kC7IilS5fSkCFDzC0lnVGXcDPizjvvpOHDh9PQoUPNkvTC3orYWbEaMGCAvN/77rvPLFHSGRWszQhYVwAWx/oEsabuBq2C4XBY1u2xso6wWiKt966kNypYmxGwsO6//36aN2+eWdL9HHLIITRw4EDJq+pOamtrzTWiE044wVzrGLzXf/zjH3TrrbeaJUo6ozEspVvJzs6WFkKPx0OhUMgs7R4QaK+pqREBUjZPVLCUbgV5Uj/88IOsI5HU5XLJejK+++47mj59Op1zzjnNGe+K0h7qEirdij15dM2aNeZacpB7dd5559Ff//pXs0RR2kcFK80pKysT6wStYVZQemOC/oQgLy+P+vXrJ+upyMjIkNfBgwfL68YG9wyLsLNdkZQNjwpWmvPFF1/IK1rDFi5cKOud5eWXX6apU6e26gO4rpx22mliWVVWVpolqamvr5fE1FNOOcUsWXcQN7vooouaO2F3ll9//VVGm0AS65dffmmWKj0NjWFtAlx88cViYeFB7SwIXufm5sr6qaeeSo8//rispzvHHXdcc75WV7/ayJyHiN58881midLTUMHajAkEAtTU1CTrsC5ycnJkPRW/+93v5IGeOXOmnLshQDrDTjvtJO7jjBkzzNLkoHUSrZQW+tXe9FCXcBMDD/UHH3xgbrXPvffea64RXXHFFeZacr755hv69ttvaf78+fT555+bpck5//zzxeL78ccfzZK154EHHpB6cO0PP/zQLE0OBg+0eOihh8y19nn//fc7FEKlBwELS9k0WLZsGUwKWVi0zNL2sY7HEolEzNLkHHvssfGDDjooHg6HzZK2xGKx5vrOPvtss3TtGT9+fHN9JSUlZmlyJk2aJMc5nU6zpH2uu+665rpXrlxplio9GRWsTYiqqqrmB3Du3Llmaftcc801zefgAe4O2MKKjxo1qsN7wP12hHVvffr0MUtSA9E555xz4rNmzTJLUrNgwYLmurGw62nuUXoyKlibGNXV1R1aIonYH9wNxa233irXO/roo82Strz77rvN9/WXv/zFLO0eIIBW3TfccINZqvR0NOieRqDJ/dFHH5UMcazn5+fTEUcc0ekB9lJx5plnSr0AMSMkc6YCOUoPP/ywnGNPEu0qW221VXOMK9VX8OSTT6Z///vfsv7OO+902yijSOXA+wRjx46VuJwdDF3z/PPPS0sq8rK22WYbYvfW3KtsVCBYSs/nyiuvbLYIEpdhw4bFf/31V/PIFp544on4vvvuG//pp5/MkuRUVlY215WdnW2WJodFSo7bfvvtzZK1o1evXlJPe64ei0nzfTU0NJilbZk8ebIcM3v2bLMkNdOnT2+uE0tZWZm5Jx5fuHBhfMiQIa3225fucpmVtUcFKw2A6FgPjdfrje+6665xtjYkTmR/oL7//nvzDAOrHOd3BALq1vEQulSwRSfHnH766WZJ1wkGg83XGjdunFnaFraw5JjDDjvMLGkLhMyq68YbbzRLU+PxeJqP//vf/26W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"""
-semantic_version = "v2.3.0"
+semantic_version = "v2.3.1"
From ae72cf228348f368e8cfc03ce6a024a8a5aeabaf Mon Sep 17 00:00:00 2001
From: zyckk4 <2240486388@qq.com>
Date: Mon, 3 Apr 2023 00:19:28 +0800
Subject: [PATCH 06/46] =?UTF-8?q?chore:=20=E7=BB=9F=E4=B8=80docstring?=
=?UTF-8?q?=E6=A0=BC=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/openai/__init__.py | 3 +--
pkg/openai/keymgr.py | 6 ++----
pkg/plugin/host.py | 33 ++++++++++++++++-----------------
pkg/plugin/switch.py | 6 +++---
pkg/utils/threadctl.py | 9 +++------
5 files changed, 25 insertions(+), 32 deletions(-)
diff --git a/pkg/openai/__init__.py b/pkg/openai/__init__.py
index e6a669c8..44bfa1eb 100644
--- a/pkg/openai/__init__.py
+++ b/pkg/openai/__init__.py
@@ -1,2 +1 @@
-"""OpenAI 接口处理及会话管理相关
-"""
+"""OpenAI 接口处理及会话管理相关"""
diff --git a/pkg/openai/keymgr.py b/pkg/openai/keymgr.py
index 4bb82038..7142cdb1 100644
--- a/pkg/openai/keymgr.py
+++ b/pkg/openai/keymgr.py
@@ -11,8 +11,7 @@ class KeysManager:
"""所有api-key"""
using_key = ""
- """当前使用的api-key
- """
+ """当前使用的api-key"""
alerted = []
"""已提示过超额的key
@@ -79,8 +78,7 @@ class KeysManager:
self.api_key[key_name] = key
def set_current_exceeded(self):
- """设置当前使用的api-key使用量超限
- """
+ """设置当前使用的api-key使用量超限"""
self.exceeded.append(self.using_key)
def get_key_name(self, api_key):
diff --git a/pkg/plugin/host.py b/pkg/plugin/host.py
index ae3aee63..ffd0c78f 100644
--- a/pkg/plugin/host.py
+++ b/pkg/plugin/host.py
@@ -15,8 +15,7 @@ import pkg.plugin.settings as settings
from mirai import Mirai
__plugins__ = {}
-"""
-插件列表
+"""插件列表
示例:
{
@@ -35,14 +34,15 @@ __plugins__ = {}
},
"instance": None
}
-}"""
+}
+"""
__plugins_order__ = []
"""插件顺序"""
def generate_plugin_order():
- """ 根据__plugin__生成插件初始顺序,无视是否启用 """
+ """根据__plugin__生成插件初始顺序,无视是否启用"""
global __plugins_order__
__plugins_order__ = []
for plugin_name in __plugins__:
@@ -50,13 +50,13 @@ def generate_plugin_order():
def iter_plugins():
- """ 按照顺序迭代插件 """
+ """按照顺序迭代插件"""
for plugin_name in __plugins_order__:
yield __plugins__[plugin_name]
def iter_plugins_name():
- """ 迭代插件名 """
+ """迭代插件名"""
for plugin_name in __plugins_order__:
yield plugin_name
@@ -85,7 +85,7 @@ def walk_plugin_path(module, prefix='', path_prefix=''):
def load_plugins():
- """ 加载插件 """
+ """加载插件"""
logging.info("加载插件")
PluginHost()
walk_plugin_path(__import__('plugins'))
@@ -102,7 +102,7 @@ def load_plugins():
def initialize_plugins():
- """ 初始化插件 """
+ """初始化插件"""
logging.info("初始化插件")
import pkg.plugin.models as models
for plugin in iter_plugins():
@@ -117,8 +117,7 @@ def initialize_plugins():
def unload_plugins():
- """ 卸载插件
- """
+ """卸载插件"""
# 不再显式卸载插件,因为当程序结束时,插件的析构函数会被系统执行
# for plugin in __plugins__.values():
# if plugin['enabled'] and plugin['instance'] is not None:
@@ -134,7 +133,7 @@ def unload_plugins():
def install_plugin(repo_url: str):
- """ 安装插件,从git储存库获取并解决依赖 """
+ """安装插件,从git储存库获取并解决依赖"""
try:
import pkg.utils.pkgmgr
pkg.utils.pkgmgr.ensure_dulwich()
@@ -162,7 +161,7 @@ def install_plugin(repo_url: str):
def uninstall_plugin(plugin_name: str) -> str:
- """ 卸载插件 """
+ """卸载插件"""
if plugin_name not in __plugins__:
raise Exception("插件不存在")
@@ -178,17 +177,17 @@ def uninstall_plugin(plugin_name: str) -> str:
class EventContext:
- """ 事件上下文 """
+ """事件上下文"""
eid = 0
"""事件编号"""
name = ""
__prevent_default__ = False
- """ 是否阻止默认行为 """
+ """是否阻止默认行为"""
__prevent_postorder__ = False
- """ 是否阻止后续插件的执行 """
+ """是否阻止后续插件的执行"""
__return_value__ = {}
""" 返回值
@@ -251,7 +250,7 @@ class EventContext:
def emit(event_name: str, **kwargs) -> EventContext:
- """ 触发事件 """
+ """触发事件"""
import pkg.utils.context as context
if context.get_plugin_host() is None:
return None
@@ -290,7 +289,7 @@ class PluginHost:
context.get_qqbot_manager().notify_admin(message)
def emit(self, event_name: str, **kwargs) -> EventContext:
- """ 触发事件 """
+ """触发事件"""
import json
event_context = EventContext(event_name)
diff --git a/pkg/plugin/switch.py b/pkg/plugin/switch.py
index 8a280a20..1b15a112 100644
--- a/pkg/plugin/switch.py
+++ b/pkg/plugin/switch.py
@@ -7,7 +7,7 @@ import pkg.plugin.host as host
def wrapper_dict_from_plugin_list() -> dict:
- """ 将插件列表转换为开关json """
+ """将插件列表转换为开关json"""
switch = {}
for plugin_name in host.__plugins__:
@@ -30,7 +30,7 @@ def apply_switch(switch: dict):
def dump_switch():
- """ 保存开关数据 """
+ """保存开关数据"""
logging.debug("保存开关数据")
# 将开关数据写入plugins/switch.json
@@ -41,7 +41,7 @@ def dump_switch():
def load_switch():
- """ 加载开关数据 """
+ """加载开关数据"""
logging.debug("加载开关数据")
# 读取plugins/switch.json
diff --git a/pkg/utils/threadctl.py b/pkg/utils/threadctl.py
index 4cf35a9a..ab764cc3 100644
--- a/pkg/utils/threadctl.py
+++ b/pkg/utils/threadctl.py
@@ -4,9 +4,7 @@ from concurrent.futures import ThreadPoolExecutor
class Pool:
- '''
- 线程池结构
- '''
+ """线程池结构"""
pool_num:int = None
ctl:ThreadPoolExecutor = None
task_list:list = None
@@ -33,12 +31,11 @@ class Pool:
class ThreadCtl:
def __init__(self, sys_pool_num, admin_pool_num, user_pool_num):
- '''
- 线程池控制类
+ """线程池控制类
sys_pool_num:分配系统使用的线程池数量(>=8)
admin_pool_num:用于处理管理员消息的线程池数量(>=1)
user_pool_num:分配用于处理用户消息的线程池的数量(>=1)
- '''
+ """
if sys_pool_num < 5:
raise Exception("Too few system threads(sys_pool_num needs >= 8, but received {})".format(sys_pool_num))
if admin_pool_num < 1:
From ae831a26548a6b81e4922a134238b3e67420bba5 Mon Sep 17 00:00:00 2001
From: zyckk4 <2240486388@qq.com>
Date: Mon, 3 Apr 2023 10:13:20 +0800
Subject: [PATCH 07/46] =?UTF-8?q?[Fix]=20=E4=BF=AE=E5=A4=8D=E4=B8=80?=
=?UTF-8?q?=E5=A4=84=E7=B1=BB=E5=9E=8B=E6=B3=A8=E8=A7=A3=E7=9A=84=E9=94=99?=
=?UTF-8?q?=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/openai/keymgr.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pkg/openai/keymgr.py b/pkg/openai/keymgr.py
index 4bb82038..0e7817ec 100644
--- a/pkg/openai/keymgr.py
+++ b/pkg/openai/keymgr.py
@@ -48,7 +48,7 @@ class KeysManager:
self.auto_switch()
- def auto_switch(self) -> (bool, str):
+ def auto_switch(self) -> tuple[bool, str]:
"""尝试切换api-key
Returns:
From ac815972368b6827c35fe1fefaa6c61905bd5349 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Mon, 3 Apr 2023 14:09:30 +0000
Subject: [PATCH 08/46] =?UTF-8?q?feat:=20=E6=8F=92=E4=BB=B6=E6=9B=B4?=
=?UTF-8?q?=E6=96=B0=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/qqbot/cmds/plugin/plugin.py | 43 ++++++++++++++++++---------------
1 file changed, 24 insertions(+), 19 deletions(-)
diff --git a/pkg/qqbot/cmds/plugin/plugin.py b/pkg/qqbot/cmds/plugin/plugin.py
index e97253da..0ca1c7c2 100644
--- a/pkg/qqbot/cmds/plugin/plugin.py
+++ b/pkg/qqbot/cmds/plugin/plugin.py
@@ -98,28 +98,33 @@ class PluginUpdateCommand(AbstractCommandNode):
reply = []
def closure():
- import pkg.utils.context
- updated = []
- for key in plugin_list:
- plugin = plugin_list[key]
- if updater.is_repo("/".join(plugin['path'].split('/')[:-1])):
- success = updater.pull_latest("/".join(plugin['path'].split('/')[:-1]))
- if success:
- updated.append(plugin['name'])
+ try:
+ import pkg.utils.context
+ updated = []
+ for key in plugin_list:
+ plugin = plugin_list[key]
+ if updater.is_repo("/".join(plugin['path'].split('/')[:-1])):
+ success = updater.pull_latest("/".join(plugin['path'].split('/')[:-1]))
+ if success:
+ updated.append(plugin['name'])
- # 检查是否有requirements.txt
- pkg.utils.context.get_qqbot_manager().notify_admin("正在安装依赖...")
- for key in plugin_list:
- plugin = plugin_list[key]
- if os.path.exists("/".join(plugin['path'].split('/')[:-1])+"/requirements.txt"):
- logging.info("{}检测到requirements.txt,安装依赖".format(plugin['name']))
- import pkg.utils.pkgmgr
- pkg.utils.pkgmgr.install_requirements("/".join(plugin['path'].split('/')[:-1])+"/requirements.txt")
+ # 检查是否有requirements.txt
+ pkg.utils.context.get_qqbot_manager().notify_admin("正在安装依赖...")
+ for key in plugin_list:
+ plugin = plugin_list[key]
+ if os.path.exists("/".join(plugin['path'].split('/')[:-1])+"/requirements.txt"):
+ logging.info("{}检测到requirements.txt,安装依赖".format(plugin['name']))
+ import pkg.utils.pkgmgr
+ pkg.utils.pkgmgr.install_requirements("/".join(plugin['path'].split('/')[:-1])+"/requirements.txt")
- import main
- main.reset_logging()
+ import main
+ main.reset_logging()
+
+ pkg.utils.context.get_qqbot_manager().notify_admin("已更新插件: {}".format(", ".join(updated)))
+ except Exception as e:
+ logging.error("插件更新失败:{}".format(e))
+ pkg.utils.context.get_qqbot_manager().notify_admin("插件更新失败:{} 请尝试手动更新插件".format(e))
- pkg.utils.context.get_qqbot_manager().notify_admin("已更新插件: {}".format(", ".join(updated)))
threading.Thread(target=closure).start()
reply = ["[bot]正在更新所有插件,请勿重复发起..."]
From e5485cddd019e115ecd4758b2a7dbff963538eb1 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Mon, 3 Apr 2023 14:40:27 +0000
Subject: [PATCH 09/46] =?UTF-8?q?feat:=20=E6=9B=B4=E6=94=B9=E4=BD=BF?=
=?UTF-8?q?=E7=94=A8!cmd=E6=8C=87=E4=BB=A4=E6=9F=A5=E7=9C=8B=E6=8C=87?=
=?UTF-8?q?=E4=BB=A4=E5=88=97=E8=A1=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/qqbot/cmds/system/cmd.py | 39 +++++++++++++++++++++++++++++++++++
pkg/qqbot/cmds/system/cmds.py | 39 +++++++++++++++++++++++++++++++++++
pkg/qqbot/cmds/system/help.py | 33 +++++++----------------------
3 files changed, 85 insertions(+), 26 deletions(-)
create mode 100644 pkg/qqbot/cmds/system/cmd.py
create mode 100644 pkg/qqbot/cmds/system/cmds.py
diff --git a/pkg/qqbot/cmds/system/cmd.py b/pkg/qqbot/cmds/system/cmd.py
new file mode 100644
index 00000000..431d8628
--- /dev/null
+++ b/pkg/qqbot/cmds/system/cmd.py
@@ -0,0 +1,39 @@
+from ..mgr import AbstractCommandNode, Context, __command_list__
+
+
+@AbstractCommandNode.register(
+ parent=None,
+ name="cmd",
+ description="显示指令列表",
+ usage="!cmd\n!cmd <指令名称>",
+ aliases=[],
+ privilege=1
+)
+class CmdCommand(AbstractCommandNode):
+ @classmethod
+ def process(cls, ctx: Context) -> tuple[bool, list]:
+ command_list = __command_list__
+
+ reply = []
+
+ if len(ctx.params) == 0:
+ reply_str = "[bot]当前所有指令:\n\n"
+
+ # 遍历顶级指令
+ for key in command_list:
+ command = command_list[key]
+ if command['parent'] is None:
+ reply_str += "!{} - {}\n".format(key, command['description'])
+
+ reply_str += "\n请使用 !cmd <指令名称> 来查看指令的详细信息"
+
+ reply = [reply_str]
+ else:
+ command_name = ctx.params[0]
+ if command_name in command_list:
+ reply = [command_list[command_name]['cls'].help()]
+ else:
+ reply = ["[bot]指令 {} 不存在".format(command_name)]
+
+ return True, reply
+
\ No newline at end of file
diff --git a/pkg/qqbot/cmds/system/cmds.py b/pkg/qqbot/cmds/system/cmds.py
new file mode 100644
index 00000000..96da5631
--- /dev/null
+++ b/pkg/qqbot/cmds/system/cmds.py
@@ -0,0 +1,39 @@
+from ..mgr import AbstractCommandNode, Context, __command_list__
+
+
+@AbstractCommandNode.register(
+ parent=None,
+ name="cmd",
+ description="显示指令列表",
+ usage="!help\n!help <指令名称>",
+ aliases=[],
+ privilege=1
+)
+class CmdCommand(AbstractCommandNode):
+ @classmethod
+ def process(cls, ctx: Context) -> tuple[bool, list]:
+ command_list = __command_list__
+
+ reply = []
+
+ if len(ctx.params) == 0:
+ reply_str = "[bot]当前所有指令:\n\n"
+
+ # 遍历顶级指令
+ for key in command_list:
+ command = command_list[key]
+ if command['parent'] is None:
+ reply_str += "!{} - {}\n".format(key, command['description'])
+
+ reply_str += "\n请使用 !cmd <指令名称> 来查看指令的详细信息"
+
+ reply = [reply_str]
+ else:
+ command_name = ctx.params[0]
+ if command_name in command_list:
+ reply = [command_list[command_name]['cls'].help()]
+ else:
+ reply = ["[bot]指令 {} 不存在".format(command_name)]
+
+ return True, reply
+
\ No newline at end of file
diff --git a/pkg/qqbot/cmds/system/help.py b/pkg/qqbot/cmds/system/help.py
index 08c50b88..427a5537 100644
--- a/pkg/qqbot/cmds/system/help.py
+++ b/pkg/qqbot/cmds/system/help.py
@@ -1,38 +1,19 @@
-from ..mgr import AbstractCommandNode, Context, __command_list__
+from ..mgr import AbstractCommandNode, Context
@AbstractCommandNode.register(
parent=None,
name="help",
- description="显示帮助信息",
- usage="!help\n!help <指令名称>",
+ description="显示自定义的帮助信息",
+ usage="!help",
aliases=[],
privilege=1
)
class HelpCommand(AbstractCommandNode):
@classmethod
def process(cls, ctx: Context) -> tuple[bool, list]:
- command_list = __command_list__
+ import config
+ reply = [(config.help_message if hasattr(config, 'help_message') else "") + "\n请输入 !cmds 查看指令列表"]
- reply = []
-
- if len(ctx.params) == 0:
- reply_str = "[bot]当前所有指令:\n\n"
-
- # 遍历顶级指令
- for key in command_list:
- command = command_list[key]
- if command['parent'] is None:
- reply_str += "!{} - {}\n".format(key, command['description'])
-
- reply_str += "\n请使用 !help <指令名称> 来查看指令的详细信息"
-
- reply = [reply_str]
- else:
- command_name = ctx.params[0]
- if command_name in command_list:
- reply = [command_list[command_name]['cls'].help()]
- else:
- reply = ["[bot]指令 {} 不存在".format(command_name)]
-
- return True, reply
\ No newline at end of file
+ return True, reply
+
\ No newline at end of file
From b6ee3939be0eba8adf1dea01353b7c6349e07dae Mon Sep 17 00:00:00 2001
From: GitHub Actions Bot
Date: Mon, 3 Apr 2023 14:41:25 +0000
Subject: [PATCH 10/46] Update cmdpriv-template.json
---
cmdpriv-template.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/cmdpriv-template.json b/cmdpriv-template.json
index a5b4a6e7..0af32a92 100644
--- a/cmdpriv-template.json
+++ b/cmdpriv-template.json
@@ -19,6 +19,7 @@
"prompt": 1,
"resend": 1,
"reset": 1,
+ "cmd": 1,
"help": 1,
"reload": 2,
"update": 2,
From c9b25fe806a7e82bcc774608c8b3608a68d3ecd2 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Mon, 3 Apr 2023 14:55:01 +0000
Subject: [PATCH 11/46] =?UTF-8?q?doc:=20cmds=E6=8C=87=E4=BB=A4=E7=9A=84?=
=?UTF-8?q?=E8=AF=B4=E6=98=8E?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
QChatGPT.wiki | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/QChatGPT.wiki b/QChatGPT.wiki
index 1e3c599c..d0dd0c1a 160000
--- a/QChatGPT.wiki
+++ b/QChatGPT.wiki
@@ -1 +1 @@
-Subproject commit 1e3c599c0313acb6b1511087c0e579ee8b22dd2c
+Subproject commit d0dd0c1ad3ac8635f39982099fae21bdf569ee22
From 9edb32b081d98c42e340e43585874574f4131331 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Tue, 4 Apr 2023 03:15:07 +0000
Subject: [PATCH 12/46] =?UTF-8?q?feat:=20usage=E5=91=BD=E4=BB=A4=E4=B8=8D?=
=?UTF-8?q?=E5=86=8D=E6=98=BE=E7=A4=BA=E9=A2=9D=E5=BA=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/qqbot/cmds/system/usage.py | 7 -------
1 file changed, 7 deletions(-)
diff --git a/pkg/qqbot/cmds/system/usage.py b/pkg/qqbot/cmds/system/usage.py
index c1584b2d..9714eeca 100644
--- a/pkg/qqbot/cmds/system/usage.py
+++ b/pkg/qqbot/cmds/system/usage.py
@@ -29,13 +29,6 @@ class UsageCommand(AbstractCommandNode):
.get_image_count_of_key(api_keys[key_name])
reply_str += "{}:\n - 文本长度:{}\n - 图片数量:{}\n".format(key_name, int(text_length),
int(image_count))
- # 获取此key的额度
- try:
- http_proxy = config.openai_config["http_proxy"] if "http_proxy" in config.openai_config else None
- credit_data = credit.fetch_credit_data(api_keys[key_name], http_proxy)
- reply_str += " - 使用额度:{:.2f}/{:.2f}\n".format(credit_data['total_used'],credit_data['total_granted'])
- except Exception as e:
- logging.warning("获取额度失败:{}".format(e))
reply = [reply_str]
From 48c7f659f99f85e4a744a47dcc1a6bfd7cc0a903 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Tue, 4 Apr 2023 03:22:19 +0000
Subject: [PATCH 13/46] Release v2.3.2
---
pkg/utils/constants.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pkg/utils/constants.py b/pkg/utils/constants.py
index f7d36a35..dd7aefe9 100644
--- a/pkg/utils/constants.py
+++ b/pkg/utils/constants.py
@@ -2,4 +2,4 @@ alipay_qr_b64 = """/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAA
wechat_qr_b64 = """iVBORw0KGgoAAAANSUhEUgAAASwAAAFSCAYAAABIVeLEAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAB5iUlEQVR4Xu2dB2Ac1dHH5/qdumTJvVdsMJjimI7BQAi99wChl5jQe/sIhN4CgdAChB56gNB7sTE2uIAx2Ma4SrZ61/Vv/rO70up0p2LLts6eH6xv9+3u273T7f9m5s17zxFnSFEUJQ1wmq+Koig9HhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUspduorq6mc889l958802zpGNef/11uuCCC6i8vNwsUZTU6MzPSrdx9NFH00svvSTr0WiUnM6Ofw8dDoe8HnPMMfTCCy/IuqKkQi0sJSXLli2jSy65hIqLi82S9olEIuaacW5HrFq1ylwj6uzvJs656qqraPny5WaJsjmhgqWkZL/99qO77rqLJk+ebJa0T//+/c016pSLV1paaq4RFRUVmWvtM378eLrlllvk3pTNDxUsJSXbbbedvE6aNEleO2K33XYz14jq6urMtdRUVVWZa0Tbb7+9uZaalStXUkVFhax7vV55VTYvNIaltAusoM5aP2DPPfek3r1704svvmiWtM+BBx5IsViM3nrrrQ5jXk8//TSddNJJsn7llVfS3/72N1lXNh9UsDYzlixZQsOGDTO30guIFUQLzJo1q9kC7IilS5fSkCFDzC0lnVGXcDPizjvvpOHDh9PQoUPNkvTC3orYWbEaMGCAvN/77rvPLFHSGRWszQhYVwAWx/oEsabuBq2C4XBY1u2xso6wWiKt966kNypYmxGwsO6//36aN2+eWdL9HHLIITRw4EDJq+pOamtrzTWiE044wVzrGLzXf/zjH3TrrbeaJUo6ozEspVvJzs6WFkKPx0OhUMgs7R4QaK+pqREBUjZPVLCUbgV5Uj/88IOsI5HU5XLJejK+++47mj59Op1zzjnNGe+K0h7qEirdij15dM2aNeZacpB7dd5559Ff//pXs0RR2kcFK80pKysT6wStYVZQemOC/oQgLy+P+vXrJ+upyMjIkNfBgwfL68YG9wyLsLNdkZQNjwpWmvPFF1/IK1rDFi5cKOud5eWXX6apU6e26gO4rpx22mliWVVWVpolqamvr5fE1FNOOcUsWXcQN7vooouaO2F3ll9//VVGm0AS65dffmmWKj0NjWFtAlx88cViYeFB7SwIXufm5sr6qaeeSo8//rispzvHHXdcc75WV7/ayJyHiN58881midLTUMHajAkEAtTU1CTrsC5ycnJkPRW/+93v5IGeOXOmnLshQDrDTjvtJO7jjBkzzNLkoHUSrZQW+tXe9FCXcBMDD/UHH3xgbrXPvffea64RXXHFFeZacr755hv69ttvaf78+fT555+bpck5//zzxeL78ccfzZK154EHHpB6cO0PP/zQLE0OBg+0eOihh8y19nn//fc7FEKlBwELS9k0WLZsGUwKWVi0zNL2sY7HEolEzNLkHHvssfGDDjooHg6HzZK2xGKx5vrOPvtss3TtGT9+fHN9JSUlZmlyJk2aJMc5nU6zpH2uu+665rpXrlxplio9GRWsTYiqqqrmB3Du3Llmaftcc801zefgAe4O2MKKjxo1qsN7wP12hHVvffr0MUtSA9E555xz4rNmzTJLUrNgwYLmurGw62nuUXoyKlibGNXV1R1aIonYH9wNxa233irXO/roo82Strz77rvN9/WXv/zFLO0eIIBW3TfccINZqvR0NOieRqDJ/dFHH5UMcazn5+fTEUcc0ekB9lJx5plnSr0AMSMkc6YCOUoPP/ywnGNPEu0qW221VXOMK9VX8OSTT6Z///vfsv7OO+902yijSOXA+wRjx46VuJwdDF3z/PPPS0sq8rK22WYbYvfW3KtsVCBYSs/nyiuvbLYIEpdhw4bFf/31V/PIFp544on4vvvuG//pp5/MkuRUVlY215WdnW2WJodFSo7bfvvtzZK1o1evXlJPe64ei0nzfTU0NJilbZk8ebIcM3v2bLMkNdOnT2+uE0tZWZm5Jx5fuHBhfMiQIa3225fucpmVtUcFKw2A6FgPjdfrje+6665xtjYkTmR/oL7//nvzDAOrHOd3BALq1vEQulSwRSfHnH766WZJ1wkGg83XGjdunFnaFraw5JjDDjvMLGkLhMyq68YbbzRLU+PxeJqP//vf/26W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"""
-semantic_version = "v2.3.1"
+semantic_version = "v2.3.2"
From 4eea21927e7f39dcd7525aa1056dff29f91802fe Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Tue, 4 Apr 2023 16:49:59 +0800
Subject: [PATCH 14/46] =?UTF-8?q?doc:=20=E8=A1=A5=E5=85=85=E6=89=8B?=
=?UTF-8?q?=E5=8A=A8=E9=83=A8=E7=BD=B2=E4=B8=AD=E7=BC=BA=E5=A4=B1=E7=9A=84?=
=?UTF-8?q?requests=E5=BA=93=20(#375)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 699146a6..ca77a1e3 100644
--- a/README.md
+++ b/README.md
@@ -188,7 +188,7 @@ cd QChatGPT
2. 安装依赖
```bash
-pip3 install yiri-mirai openai colorlog func_timeout dulwich Pillow
+pip3 install requests yiri-mirai openai colorlog func_timeout dulwich Pillow
```
3. 运行一次主程序,生成配置文件
From 10a1e8faa6ad53ffa8c0ff7becbe25972504071c Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Wed, 5 Apr 2023 09:56:27 +0800
Subject: [PATCH 15/46] =?UTF-8?q?fix:=20=E5=9B=9E=E5=A4=8D=E5=86=85?=
=?UTF-8?q?=E5=AE=B9=E4=B8=8D=E5=AE=8C=E6=95=B4=E9=97=AE=E9=A2=98=20(#208)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/openai/session.py | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/pkg/openai/session.py b/pkg/openai/session.py
index 6575de6e..52cb5ea9 100644
--- a/pkg/openai/session.py
+++ b/pkg/openai/session.py
@@ -229,13 +229,7 @@ class Session:
# 成功获取,处理回复
res_test = message
- res_ans = res_test
-
- # 去除开头可能的提示
- res_ans_spt = res_test.split("\n\n")
- if len(res_ans_spt) > 1:
- del (res_ans_spt[0])
- res_ans = '\n\n'.join(res_ans_spt)
+ res_ans = res_test.strip()
# 将此次对话的双方内容加入到prompt中
self.prompt.append({'role': 'user', 'content': text})
From 414910719c4fef4d18af19422b2c9c1dd16bfaa7 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Wed, 5 Apr 2023 09:57:21 +0800
Subject: [PATCH 16/46] Release v2.3.3
---
pkg/utils/constants.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pkg/utils/constants.py b/pkg/utils/constants.py
index dd7aefe9..30d33ddf 100644
--- a/pkg/utils/constants.py
+++ b/pkg/utils/constants.py
@@ -2,4 +2,4 @@ alipay_qr_b64 = """/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAA
wechat_qr_b64 = """iVBORw0KGgoAAAANSUhEUgAAASwAAAFSCAYAAABIVeLEAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAB5iUlEQVR4Xu2dB2Ac1dHH5/qdumTJvVdsMJjimI7BQAi99wChl5jQe/sIhN4CgdAChB56gNB7sTE2uIAx2Ma4SrZ61/Vv/rO70up0p2LLts6eH6xv9+3u273T7f9m5s17zxFnSFEUJQ1wmq+Koig9HhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUspduorq6mc889l958802zpGNef/11uuCCC6i8vNwsUZTU6MzPSrdx9NFH00svvSTr0WiUnM6Ofw8dDoe8HnPMMfTCCy/IuqKkQi0sJSXLli2jSy65hIqLi82S9olEIuaacW5HrFq1ylwj6uzvJs656qqraPny5WaJsjmhgqWkZL/99qO77rqLJk+ebJa0T//+/c016pSLV1paaq4RFRUVmWvtM378eLrlllvk3pTNDxUsJSXbbbedvE6aNEleO2K33XYz14jq6urMtdRUVVWZa0Tbb7+9uZaalStXUkVFhax7vV55VTYvNIaltAusoM5aP2DPPfek3r1704svvmiWtM+BBx5IsViM3nrrrQ5jXk8//TSddNJJsn7llVfS3/72N1lXNh9UsDYzlixZQsOGDTO30guIFUQLzJo1q9kC7IilS5fSkCFDzC0lnVGXcDPizjvvpOHDh9PQoUPNkvTC3orYWbEaMGCAvN/77rvPLFHSGRWszQhYVwAWx/oEsabuBq2C4XBY1u2xso6wWiKt966kNypYmxGwsO6//36aN2+eWdL9HHLIITRw4EDJq+pOamtrzTWiE044wVzrGLzXf/zjH3TrrbeaJUo6ozEspVvJzs6WFkKPx0OhUMgs7R4QaK+pqREBUjZPVLCUbgV5Uj/88IOsI5HU5XLJejK+++47mj59Op1zzjnNGe+K0h7qEirdij15dM2aNeZacpB7dd5559Ff//pXs0RR2kcFK80pKysT6wStYVZQemOC/oQgLy+P+vXrJ+upyMjIkNfBgwfL68YG9wyLsLNdkZQNjwpWmvPFF1/IK1rDFi5cKOud5eWXX6apU6e26gO4rpx22mliWVVWVpolqamvr5fE1FNOOcUsWXcQN7vooouaO2F3ll9//VVGm0AS65dffmmWKj0NjWFtAlx88cViYeFB7SwIXufm5sr6qaeeSo8//rispzvHHXdcc75WV7/ayJyHiN58881midLTUMHajAkEAtTU1CTrsC5ycnJkPRW/+93v5IGeOXOmnLshQDrDTjvtJO7jjBkzzNLkoHUSrZQW+tXe9FCXcBMDD/UHH3xgbrXPvffea64RXXHFFeZacr755hv69ttvaf78+fT555+bpck5//zzxeL78ccfzZK154EHHpB6cO0PP/zQLE0OBg+0eOihh8y19nn//fc7FEKlBwELS9k0WLZsGUwKWVi0zNL2sY7HEolEzNLkHHvssfGDDjooHg6HzZK2xGKx5vrOPvtss3TtGT9+fHN9JSUlZmlyJk2aJMc5nU6zpH2uu+665rpXrlxplio9GRWsTYiqqqrmB3Du3Llmaftcc801zefgAe4O2MKKjxo1qsN7wP12hHVvffr0MUtSA9E555xz4rNmzTJLUrNgwYLmurGw62nuUXoyKlibGNXV1R1aIonYH9wNxa233irXO/roo82Strz77rvN9/WXv/zFLO0eIIBW3TfccINZqvR0NOieRqDJ/dFHH5UMcazn5+fTEUcc0ekB9lJx5plnSr0AMSMkc6YCOUoPP/ywnGNPEu0qW221VXOMK9VX8OSTT6Z///vfsv7OO+902yijSOXA+wRjx46VuJwdDF3z/PPPS0sq8rK22WYbYvfW3KtsVCBYSs/nyiuvbLYIEpdhw4bFf/31V/PIFp544on4vvvuG//pp5/MkuRUVlY215WdnW2WJodFSo7bfvvtzZK1o1evXlJPe64ei0nzfTU0NJilbZk8ebIcM3v2bLMkNdOnT2+uE0tZWZm5Jx5fuHBhfMiQIa3225fucpmVtUcFKw2A6FgPjdfrje+6665xtjYkTmR/oL7//nvzDAOrHOd3BALq1vEQulSwRSfHnH766WZJ1wkGg83XGjdunFnaFraw5JjDDjvMLGkLhMyq68YbbzRLU+PxeJqP//vf/26W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"""
-semantic_version = "v2.3.2"
+semantic_version = "v2.3.3"
From f65270ee7e6bf5cf34897ee690375ba88edd975b Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Wed, 5 Apr 2023 15:46:49 +0800
Subject: [PATCH 17/46] =?UTF-8?q?feat:=20=E5=90=AF=E5=8A=A8=E6=97=B6?=
=?UTF-8?q?=E8=BE=93=E5=87=BAmah=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE?=
=?UTF-8?q?=E9=A1=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
main.py | 1 +
pkg/qqbot/manager.py | 1 -
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/main.py b/main.py
index fdac1d67..50a51e1a 100644
--- a/main.py
+++ b/main.py
@@ -290,6 +290,7 @@ def start(first_time_init=False):
if first_time_init:
if not known_exception_caught:
+ logging.info("QQ: {}, MAH: {}".format(config.mirai_http_api_config['qq'], config.mirai_http_api_config['host']+":"+str(config.mirai_http_api_config['port'])))
logging.info('程序启动完成,如长时间未显示 ”成功登录到账号xxxxx“ ,并且不回复消息,请查看 '
'https://github.com/RockChinQ/QChatGPT/issues/37')
else:
diff --git a/pkg/qqbot/manager.py b/pkg/qqbot/manager.py
index 300edca8..0ede6a64 100644
--- a/pkg/qqbot/manager.py
+++ b/pkg/qqbot/manager.py
@@ -201,7 +201,6 @@ class QQBotManager:
def first_time_init(self, mirai_http_api_config: dict):
"""热重载后不再运行此函数"""
-
if 'adapter' not in mirai_http_api_config or mirai_http_api_config['adapter'] == "WebSocketAdapter":
bot = Mirai(
qq=mirai_http_api_config['qq'],
From 0799f380e119154474db1540283432fdcfe27967 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Wed, 5 Apr 2023 15:48:21 +0800
Subject: [PATCH 18/46] =?UTF-8?q?feat:=20=E6=9B=B4=E6=94=B9=E9=BB=98?=
=?UTF-8?q?=E8=AE=A4help=5Fmessage?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
config-template.py | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/config-template.py b/config-template.py
index 23caf4b2..2550e199 100644
--- a/config-template.py
+++ b/config-template.py
@@ -276,11 +276,6 @@ report_usage = True
logging_level = logging.INFO
# 定制帮助消息
-help_message = """此机器人通过调用OpenAI的GPT-3大型语言模型生成回复,不具有情感。
+help_message = """此机器人通过调用大型语言模型生成回复,不具有情感。
你可以用自然语言与其交流,回复的消息中[GPT]开头的为模型生成的语言,[bot]开头的为程序提示。
-了解此项目请找QQ 1010553892 联系作者
-请不要用其生成整篇文章或大段代码,因为每次只会向模型提交少部分文字,生成大部分文字会产生偏题、前后矛盾等问题
-每次会话最后一次交互后{}分钟后会自动结束,结束后将开启新会话,如需继续前一次会话请发送 !last 重新开启
-欢迎到github.com/RockChinQ/QChatGPT 给个star
-
-指令帮助信息请查看: https://github.com/RockChinQ/QChatGPT/wiki/%E5%8A%9F%E8%83%BD%E4%BD%BF%E7%94%A8#%E6%9C%BA%E5%99%A8%E4%BA%BA%E6%8C%87%E4%BB%A4""".format(session_expire_time // 60)
+欢迎到github.com/RockChinQ/QChatGPT 给个star"""
\ No newline at end of file
From 6be12e8ace2344766f76f7ebc63a4cd1b001ee92 Mon Sep 17 00:00:00 2001
From: GitHub Actions
Date: Wed, 5 Apr 2023 07:48:46 +0000
Subject: [PATCH 19/46] Update override-all.json
---
override-all.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/override-all.json b/override-all.json
index b0269b01..88bc890a 100644
--- a/override-all.json
+++ b/override-all.json
@@ -74,5 +74,5 @@
"upgrade_dependencies": true,
"report_usage": true,
"logging_level": 20,
- "help_message": "此机器人通过调用OpenAI的GPT-3大型语言模型生成回复,不具有情感。\n你可以用自然语言与其交流,回复的消息中[GPT]开头的为模型生成的语言,[bot]开头的为程序提示。\n了解此项目请找QQ 1010553892 联系作者\n请不要用其生成整篇文章或大段代码,因为每次只会向模型提交少部分文字,生成大部分文字会产生偏题、前后矛盾等问题\n每次会话最后一次交互后20分钟后会自动结束,结束后将开启新会话,如需继续前一次会话请发送 !last 重新开启\n欢迎到github.com/RockChinQ/QChatGPT 给个star\n\n指令帮助信息请查看: https://github.com/RockChinQ/QChatGPT/wiki/%E5%8A%9F%E8%83%BD%E4%BD%BF%E7%94%A8#%E6%9C%BA%E5%99%A8%E4%BA%BA%E6%8C%87%E4%BB%A4"
+ "help_message": "此机器人通过调用大型语言模型生成回复,不具有情感。\n你可以用自然语言与其交流,回复的消息中[GPT]开头的为模型生成的语言,[bot]开头的为程序提示。\n欢迎到github.com/RockChinQ/QChatGPT 给个star"
}
\ No newline at end of file
From 952124f7839c0b6a9710e5a0c7a0de247202769b Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Wed, 5 Apr 2023 16:50:35 +0800
Subject: [PATCH 20/46] =?UTF-8?q?feat:=20=E7=A6=81=E7=94=A8=E7=9A=84?=
=?UTF-8?q?=E6=8F=92=E4=BB=B6=E4=BB=8D=E8=BF=9B=E8=A1=8C=E5=88=9D=E5=A7=8B?=
=?UTF-8?q?=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/plugin/host.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pkg/plugin/host.py b/pkg/plugin/host.py
index ffd0c78f..ebb7407a 100644
--- a/pkg/plugin/host.py
+++ b/pkg/plugin/host.py
@@ -106,8 +106,8 @@ def initialize_plugins():
logging.info("初始化插件")
import pkg.plugin.models as models
for plugin in iter_plugins():
- if not plugin['enabled']:
- continue
+ # if not plugin['enabled']:
+ # continue
try:
models.__current_registering_plugin__ = plugin['name']
plugin['instance'] = plugin["class"](plugin_host=context.get_plugin_host())
From a1d9f469c00bb9c30ce2fb1cd625e56a9a7e1466 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Wed, 5 Apr 2023 16:58:15 +0800
Subject: [PATCH 21/46] =?UTF-8?q?doc:=20=E6=B7=BB=E5=8A=A0=E6=A8=A1?=
=?UTF-8?q?=E5=9E=8B=E5=88=87=E6=8D=A2=E5=99=A8=E6=8F=92=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index ca77a1e3..a706899a 100644
--- a/README.md
+++ b/README.md
@@ -244,6 +244,7 @@ python3 main.py
欢迎提交新的插件
- [revLibs](https://github.com/RockChinQ/revLibs) - 将ChatGPT网页版接入此项目,关于[官方接口和网页版有什么区别](https://github.com/RockChinQ/QChatGPT/wiki/%E5%AE%98%E6%96%B9%E6%8E%A5%E5%8F%A3%E4%B8%8EChatGPT%E7%BD%91%E9%A1%B5%E7%89%88)
+- [Switcher](https://github.com/RockChinQ/Switcher) - 支持通过指令切换使用的模型
- [hello_plugin](https://github.com/RockChinQ/hello_plugin) - `hello_plugin` 的储存库形式,插件开发模板
- [dominoar/QChatPlugins](https://github.com/dominoar/QchatPlugins) - dominoar编写的诸多新功能插件(语音输出、Ranimg、屏蔽词规则等)
- [dominoar/QCP-NovelAi](https://github.com/dominoar/QCP-NovelAi) - NovelAI 故事叙述与绘画
From 0983ccb61e8334b28c6d3e21933bd0cc5ccb3e21 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Wed, 5 Apr 2023 16:59:06 +0800
Subject: [PATCH 22/46] =?UTF-8?q?doc:=20=E6=B7=BB=E5=8A=A0=E6=A8=A1?=
=?UTF-8?q?=E5=9E=8B=E5=88=87=E6=8D=A2=E5=99=A8=E6=8F=92=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index a706899a..d072d6ee 100644
--- a/README.md
+++ b/README.md
@@ -45,6 +45,8 @@
+安装[此插件](https://github.com/RockChinQ/Switcher),即可在使用中切换文字模型。
+
## ✅功能
From 86bef566c4e612e7099f17921ff54eb1abf36348 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Wed, 5 Apr 2023 17:13:05 +0800
Subject: [PATCH 23/46] Release v2.3.4
---
pkg/utils/constants.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pkg/utils/constants.py b/pkg/utils/constants.py
index 30d33ddf..15267db8 100644
--- a/pkg/utils/constants.py
+++ b/pkg/utils/constants.py
@@ -2,4 +2,4 @@ alipay_qr_b64 = """/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAA
wechat_qr_b64 = """iVBORw0KGgoAAAANSUhEUgAAASwAAAFSCAYAAABIVeLEAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAB5iUlEQVR4Xu2dB2Ac1dHH5/qdumTJvVdsMJjimI7BQAi99wChl5jQe/sIhN4CgdAChB56gNB7sTE2uIAx2Ma4SrZ61/Vv/rO70up0p2LLts6eH6xv9+3u273T7f9m5s17zxFnSFEUJQ1wmq+Koig9HhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUspduorq6mc889l958802zpGNef/11uuCCC6i8vNwsUZTU6MzPSrdx9NFH00svvSTr0WiUnM6Ofw8dDoe8HnPMMfTCCy/IuqKkQi0sJSXLli2jSy65hIqLi82S9olEIuaacW5HrFq1ylwj6uzvJs656qqraPny5WaJsjmhgqWkZL/99qO77rqLJk+ebJa0T//+/c016pSLV1paaq4RFRUVmWvtM378eLrlllvk3pTNDxUsJSXbbbedvE6aNEleO2K33XYz14jq6urMtdRUVVWZa0Tbb7+9uZaalStXUkVFhax7vV55VTYvNIaltAusoM5aP2DPPfek3r1704svvmiWtM+BBx5IsViM3nrrrQ5jXk8//TSddNJJsn7llVfS3/72N1lXNh9UsDYzlixZQsOGDTO30guIFUQLzJo1q9kC7IilS5fSkCFDzC0lnVGXcDPizjvvpOHDh9PQoUPNkvTC3orYWbEaMGCAvN/77rvPLFHSGRWszQhYVwAWx/oEsabuBq2C4XBY1u2xso6wWiKt966kNypYmxGwsO6//36aN2+eWdL9HHLIITRw4EDJq+pOamtrzTWiE044wVzrGLzXf/zjH3TrrbeaJUo6ozEspVvJzs6WFkKPx0OhUMgs7R4QaK+pqREBUjZPVLCUbgV5Uj/88IOsI5HU5XLJejK+++47mj59Op1zzjnNGe+K0h7qEirdij15dM2aNeZacpB7dd5559Ff//pXs0RR2kcFK80pKysT6wStYVZQemOC/oQgLy+P+vXrJ+upyMjIkNfBgwfL68YG9wyLsLNdkZQNjwpWmvPFF1/IK1rDFi5cKOud5eWXX6apU6e26gO4rpx22mliWVVWVpolqamvr5fE1FNOOcUsWXcQN7vooouaO2F3ll9//VVGm0AS65dffmmWKj0NjWFtAlx88cViYeFB7SwIXufm5sr6qaeeSo8//rispzvHHXdcc75WV7/ayJyHiN58881midLTUMHajAkEAtTU1CTrsC5ycnJkPRW/+93v5IGeOXOmnLshQDrDTjvtJO7jjBkzzNLkoHUSrZQW+tXe9FCXcBMDD/UHH3xgbrXPvffea64RXXHFFeZacr755hv69ttvaf78+fT555+bpck5//zzxeL78ccfzZK154EHHpB6cO0PP/zQLE0OBg+0eOihh8y19nn//fc7FEKlBwELS9k0WLZsGUwKWVi0zNL2sY7HEolEzNLkHHvssfGDDjooHg6HzZK2xGKx5vrOPvtss3TtGT9+fHN9JSUlZmlyJk2aJMc5nU6zpH2uu+665rpXrlxplio9GRWsTYiqqqrmB3Du3Llmaftcc801zefgAe4O2MKKjxo1qsN7wP12hHVvffr0MUtSA9E555xz4rNmzTJLUrNgwYLmurGw62nuUXoyKlibGNXV1R1aIonYH9wNxa233irXO/roo82Strz77rvN9/WXv/zFLO0eIIBW3TfccINZqvR0NOieRqDJ/dFHH5UMcazn5+fTEUcc0ekB9lJx5plnSr0AMSMkc6YCOUoPP/ywnGNPEu0qW221VXOMK9VX8OSTT6Z///vfsv7OO+902yijSOXA+wRjx46VuJwdDF3z/PPPS0sq8rK22WYbYvfW3KtsVCBYSs/nyiuvbLYIEpdhw4bFf/31V/PIFp544on4vvvuG//pp5/MkuRUVlY215WdnW2WJodFSo7bfvvtzZK1o1evXlJPe64ei0nzfTU0NJilbZk8ebIcM3v2bLMkNdOnT2+uE0tZWZm5Jx5fuHBhfMiQIa3225fucpmVtUcFKw2A6FgPjdfrje+6665xtjYkTmR/oL7//nvzDAOrHOd3BALq1vEQulSwRSfHnH766WZJ1wkGg83XGjdunFnaFraw5JjDDjvMLGkLhMyq68YbbzRLU+PxeJqP//vf/26W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"""
-semantic_version = "v2.3.3"
+semantic_version = "v2.3.4"
From 1c5ad05e89dbf017f441ea292fb517d08d798825 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 09:29:45 +0800
Subject: [PATCH 24/46] =?UTF-8?q?typo:=20plugin=E5=91=BD=E4=BB=A4=E7=9A=84?=
=?UTF-8?q?=E6=8F=90=E7=A4=BA=E9=94=99=E5=AD=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/qqbot/cmds/plugin/plugin.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pkg/qqbot/cmds/plugin/plugin.py b/pkg/qqbot/cmds/plugin/plugin.py
index 0ca1c7c2..8e313808 100644
--- a/pkg/qqbot/cmds/plugin/plugin.py
+++ b/pkg/qqbot/cmds/plugin/plugin.py
@@ -42,7 +42,7 @@ class PluginCommand(AbstractCommandNode):
reply = [reply_str]
return True, reply
elif ctx.params[0].startswith("http"):
- reply = ["[bot]err: 此命令已启用,请使用 !plugin get <插件仓库地址> 进行安装"]
+ reply = ["[bot]err: 此命令已弃用,请使用 !plugin get <插件仓库地址> 进行安装"]
return True, reply
else:
return False, []
From fb40af81ac505b352037af465b91b6071d1e1497 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 09:44:07 +0800
Subject: [PATCH 25/46] =?UTF-8?q?doc:=20=E5=AE=8C=E5=96=84=E6=96=87?=
=?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index d072d6ee..31d4d814 100644
--- a/README.md
+++ b/README.md
@@ -2,18 +2,15 @@
> 2023/3/18 现已支持GPT-4 API(内测),请查看`config-template.py`中的`completion_api_params`
> 2023/3/15 逆向库已支持New Bing,使用方法查看[插件文档](https://github.com/RockChinQ/revLibs)
-> 2023/3/15 逆向库已支持GPT-4模型,使用方法查看[插件](https://github.com/RockChinQ/revLibs)
-> 2023/3/3 现已在主线支持官方ChatGPT接口,使用方法查看[#195](https://github.com/RockChinQ/QChatGPT/issues/195)
+- **客官,来都来了,不点个⭐吗?**
- 到[项目Wiki](https://github.com/RockChinQ/QChatGPT/wiki)可了解项目详细信息
-- ~~由bilibili TheLazy制作的[视频教程](https://www.bilibili.com/video/BV15v4y1X7aP)~~(寄了,求大佬做个新的)
-- 交流、答疑群: ~~204785790~~(已满)、~~691226829~~(已满)、656285629
+- 官方交流、答疑群: 656285629
- **进群提问前请您`确保`已经找遍文档和issue均无法解决**
+- 社区群(内有一键部署包等资源): 362515018
- QQ频道机器人见[QQChannelChatGPT](https://github.com/Soulter/QQChannelChatGPT)
- 欢迎各种形式的贡献,请查看[贡献指引](CONTRIBUTING.md)
-通过调用OpenAI的ChatGPT等语言模型来实现一个更加智能的QQ机器人
-
## 🍺模型适配一览
From 0817c3f148599719c06dc8106263d1f5104e6e53 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 10:08:15 +0800
Subject: [PATCH 26/46] =?UTF-8?q?chore:=20=E5=B0=86=E5=B7=A5=E4=BD=9C?=
=?UTF-8?q?=E6=B5=81=E8=84=9A=E6=9C=AC=E7=A7=BB=E5=8A=A8=E5=88=B0res/scrip?=
=?UTF-8?q?ts?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/update-cmdpriv-template.yml | 6 +++++-
.github/workflows/update-override-all.yml | 4 ++++
.../scripts/generate_cmdpriv_template.py | 2 +-
.../scripts/generate_override_all.py | 2 +-
4 files changed, 11 insertions(+), 3 deletions(-)
rename generate_cmdpriv_template.py => res/scripts/generate_cmdpriv_template.py (92%)
rename generate_override_all.py => res/scripts/generate_override_all.py (91%)
diff --git a/.github/workflows/update-cmdpriv-template.yml b/.github/workflows/update-cmdpriv-template.yml
index 8d8db1f8..dde400e7 100644
--- a/.github/workflows/update-cmdpriv-template.yml
+++ b/.github/workflows/update-cmdpriv-template.yml
@@ -27,7 +27,11 @@ jobs:
run: |
python -m pip install --upgrade pip
python -m pip install --upgrade yiri-mirai openai colorlog func_timeout dulwich Pillow
-
+
+ - name: Copy Scripts
+ run: |
+ cp res/scripts/generate_cmdpriv_template.py .
+
- name: Generate Files
run: |
python main.py
diff --git a/.github/workflows/update-override-all.yml b/.github/workflows/update-override-all.yml
index 850186c4..ec3efdbb 100644
--- a/.github/workflows/update-override-all.yml
+++ b/.github/workflows/update-override-all.yml
@@ -31,6 +31,10 @@ jobs:
python -m pip install --upgrade pip
# 在此处添加您的项目所需的其他依赖
+ - name: Copy Scripts
+ run: |
+ cp res/scripts/generate_override_all.py .
+
- name: Run generate_override_all.py
run: python3 generate_override_all.py
diff --git a/generate_cmdpriv_template.py b/res/scripts/generate_cmdpriv_template.py
similarity index 92%
rename from generate_cmdpriv_template.py
rename to res/scripts/generate_cmdpriv_template.py
index 9b2d35af..45ff0b39 100644
--- a/generate_cmdpriv_template.py
+++ b/res/scripts/generate_cmdpriv_template.py
@@ -13,5 +13,5 @@ for key in cmdsmgr.__command_list__:
template[key] = cmdsmgr.__command_list__[key]['privilege']
# 写入cmdpriv-template.json
-with open('cmdpriv-template.json', 'w') as f:
+with open('../../cmdpriv-template.json', 'w') as f:
f.write(json.dumps(template, indent=4, ensure_ascii=False))
\ No newline at end of file
diff --git a/generate_override_all.py b/res/scripts/generate_override_all.py
similarity index 91%
rename from generate_override_all.py
rename to res/scripts/generate_override_all.py
index 69674c38..cff27e02 100644
--- a/generate_override_all.py
+++ b/res/scripts/generate_override_all.py
@@ -19,5 +19,5 @@ for k, v in template.__dict__.items():
print(k, v, type(v))
output_json[k] = v
-with open("override-all.json", "w", encoding="utf-8") as f:
+with open("../../override-all.json", "w", encoding="utf-8") as f:
json.dump(output_json, f, indent=4, ensure_ascii=False)
From ced16fd22135fd1435b1acd8638ef4b261bc3122 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 10:10:09 +0800
Subject: [PATCH 27/46] =?UTF-8?q?chore:=20=E7=A7=BB=E5=8A=A8docker?=
=?UTF-8?q?=E9=83=A8=E7=BD=B2=E6=95=99=E7=A8=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 +-
docker_deploy.md => res/docs/docker_deploy.md | 0
2 files changed, 1 insertion(+), 1 deletion(-)
rename docker_deploy.md => res/docs/docker_deploy.md (100%)
diff --git a/README.md b/README.md
index 31d4d814..818384af 100644
--- a/README.md
+++ b/README.md
@@ -153,7 +153,7 @@
#### Docker方式
-请查看[此文档](docker_deploy.md)
+请查看[此文档](res/docs/docker_deploy.md)
由[@mikumifa](https://github.com/mikumifa)贡献
#### 安装器方式
diff --git a/docker_deploy.md b/res/docs/docker_deploy.md
similarity index 100%
rename from docker_deploy.md
rename to res/docs/docker_deploy.md
From 595e6c8a0cb3542816ec2fbaebd1bd70a630afc3 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 10:13:08 +0800
Subject: [PATCH 28/46] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E5=AD=90?=
=?UTF-8?q?=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitmodules | 3 ---
1 file changed, 3 deletions(-)
delete mode 100644 .gitmodules
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 156b43f9..00000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "QChatGPT.wiki"]
- path = QChatGPT.wiki
- url = https://github.com/RockChinQ/QChatGPT.wiki.git
From fc0c38c8afe0106a0f8baf53f6b343b92d11ca9f Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 10:13:34 +0800
Subject: [PATCH 29/46] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E5=AD=90?=
=?UTF-8?q?=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
QChatGPT.wiki | 1 -
1 file changed, 1 deletion(-)
delete mode 160000 QChatGPT.wiki
diff --git a/QChatGPT.wiki b/QChatGPT.wiki
deleted file mode 160000
index d0dd0c1a..00000000
--- a/QChatGPT.wiki
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit d0dd0c1ad3ac8635f39982099fae21bdf569ee22
From 2a414a4bea973e5f58c119e251c69b1beb0b871d Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 15:07:25 +0800
Subject: [PATCH 30/46] =?UTF-8?q?chore:=20=E6=8F=90=E4=BA=A4wiki=E6=96=87?=
=?UTF-8?q?=E4=BB=B6=E5=88=B0res/wiki?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
res/wiki/Home.md | 24 ++
res/wiki/功能使用.md | 364 ++++++++++++++++++
res/wiki/功能常见问题.md | 58 +++
...方接口、ChatGPT网页版、ChatGPT-API区别.md | 14 +
res/wiki/常见错误.md | 1 +
res/wiki/技术信息.md | 107 +++++
res/wiki/插件使用.md | 44 +++
res/wiki/插件开发.md | 268 +++++++++++++
8 files changed, 880 insertions(+)
create mode 100644 res/wiki/Home.md
create mode 100644 res/wiki/功能使用.md
create mode 100644 res/wiki/功能常见问题.md
create mode 100644 res/wiki/官方接口、ChatGPT网页版、ChatGPT-API区别.md
create mode 100644 res/wiki/常见错误.md
create mode 100644 res/wiki/技术信息.md
create mode 100644 res/wiki/插件使用.md
create mode 100644 res/wiki/插件开发.md
diff --git a/res/wiki/Home.md b/res/wiki/Home.md
new file mode 100644
index 00000000..109e4f9d
--- /dev/null
+++ b/res/wiki/Home.md
@@ -0,0 +1,24 @@
+欢迎查看QChatGPT的Wiki页。
+
+## 简介
+
+通过调用OpenAI官方提供的API接口,结合mirai和YiriMirai框架,将QQ消息与语言模型连接,实现更加智能的对话机器人。
+
+
+## 技术栈
+
+- [Mirai](https://github.com/mamoe/mirai) 高效率 QQ 机器人支持库
+- [YiriMirai](https://github.com/YiriMiraiProject/YiriMirai) 一个轻量级、低耦合的基于 mirai-api-http 的 Python SDK。
+- [dulwich](https://github.com/jelmer/dulwich) Pure-Python Git implementation
+- [OpenAI API](https://openai.com/api/) OpenAI API
+
+## 代码结构
+
+- `pkg.database` 数据库操作相关
+ - 数据库用于存放会话的历史记录,确保在程序重启后能记住对话内容
+- `pkg.openai` OpenAI API相关
+ - 用于调用OpenAI的API生成回复内容
+- `pkg.qqbot` QQ机器人相关
+ - 处理QQ收到的消息,调用API并进行回复
+- `pkg.utils` 常用功能包
+- `pkg.audit` 审计模块
diff --git a/res/wiki/功能使用.md b/res/wiki/功能使用.md
new file mode 100644
index 00000000..9f96dfe2
--- /dev/null
+++ b/res/wiki/功能使用.md
@@ -0,0 +1,364 @@
+## 功能点列举
+
+
+✅回复符合上下文
+
+ - 程序向模型发送近几次对话内容,模型根据上下文生成回复
+ - 您可在`config.py`中修改`prompt_submit_length`自定义联系上下文的范围
+
+
+
+
+✅支持敏感词过滤,避免账号风险
+
+ - 难以监测机器人与用户对话时的内容,故引入此功能以减少机器人风险
+ - 编辑`sensitive.json`,并在`config.py`中修改`sensitive_word_filter`的值以开启此功能
+
+
+
+
+✅群内多种响应规则,不必at
+
+ - 默认回复`ai`作为前缀或`@`机器人的消息
+ - 详细见`config.py`中的`response_rules`字段
+
+
+
+✅使用官方api,不需要网络代理,稳定快捷
+
+ - 不使用ChatGPT逆向接口,而使用官方的Completion API,稳定性高
+ - 您可以在`config.py`中自定义`completion_api_params`字段,设置向官方API提交的参数以自定义机器人的风格
+
+
+
+
+✅完善的多api-key管理,超额自动切换
+
+ - 支持配置多个`api-key`,内部统计使用量并在超额时自动切换
+ - 请在`config.py`中修改`openai_config`的值以设置`api-key`
+ - 可以在`config.py`中修改`api_key_fee_threshold`来自定义切换阈值
+ - 运行期间向机器人说`!usage`以查看当前使用情况
+
+
+
+✅组件少,部署方便,提供一键安装器及Docker安装
+
+ - 手动部署步骤少
+ - 提供自动安装器及docker方式,详见以下安装步骤
+
+
+
+✅支持预设指令文字
+
+ - 支持以自然语言预设文字,自定义机器人人格等信息
+ - 详见`config.py`中的`default_prompt`部分
+ - 支持设置多个预设情景,并通过!reset、!default等指令控制,详细请查看[wiki指令](https://github.com/RockChinQ/QChatGPT/wiki/%E5%8A%9F%E8%83%BD%E4%BD%BF%E7%94%A8#%E6%9C%BA%E5%99%A8%E4%BA%BA%E6%8C%87%E4%BB%A4)
+ - 支持使用文件存储情景预设文字,并加载: 在`prompts/`目录新建文件写入预设文字,即可通过`!reset <文件名>`指令加载
+
+
+
+✅完善的会话管理,重启不丢失
+
+ - 使用SQLite进行会话内容持久化
+ - 最后一次对话一定时间后自动保存,请到`config.py`中修改`session_expire_time`的值以自定义时间
+ - 运行期间可使用`!reset` `!list` `!last` `!next` `!prompt`等指令管理会话
+
+
+✅支持对话、绘图等模型,可玩性更高
+
+ - 现已支持OpenAI的对话`Completion API`和绘图`Image API`
+ - 向机器人发送指令`!draw `即可使用绘图模型
+
+
+✅支持指令控制热重载、热更新
+
+ - 允许在运行期间修改`config.py`或其他代码后,以管理员账号向机器人发送指令`!reload`进行热重载,无需重启
+ - 运行期间允许以管理员账号向机器人发送指令`!update`进行热更新,拉取远程最新代码并执行热重载
+
+
+✅支持插件加载🧩
+
+ - 自行实现插件加载器及相关支持
+ - 详细查看[插件使用页](https://github.com/RockChinQ/QChatGPT/wiki/%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8)
+
+
+✅私聊、群聊黑名单机制
+
+ - 支持将人或群聊加入黑名单以忽略其消息
+ - 详见下方`加入黑名单`节
+
+
+✅回复速度限制
+
+ - 支持限制单会话内每分钟可进行的对话次数
+ - 具有“等待”和“丢弃”两种策略
+ - “等待”策略:在获取到回复后,等待直到此次响应时间达到对话响应时间均值
+ - “丢弃”策略:此分钟内对话次数达到限制时,丢弃之后的对话
+ - 详细请查看config.py中的相关配置
+
+
+## 限制
+
+- ❗OpenAI接口是收费的,每个OpenAI账户有18美元免费额度,收费标准参照 https://openai.com/api/pricing/
+- ❗官方关于模型生成内容的警告:
+ - May occasionally generate incorrect information(可能会生成不正确的信息)
+ - May occasionally produce harmful instructions or biased content(可能会产生有害说明或有偏见的内容)
+ - Limited knowledge of world and events after 2021(对2021年后的世界和事件的了解有限)
+- ❗模型无思维能力,仅针对传入的上下文根据数据集生成内容,请勿过于信任其输出
+- ❗模型无网络访问能力及其他与外界交互的能力,如询问其实时性的内容,获得的回复基本都是错误的
+- ❗仅支持文字对话,其他内容无法识别
+- ❗模型不了解其运行平台及其使用的模型版本,任何针对其实现原理的问题答案均视为无效,请以项目文档为准
+- ❗仅可进行一句话回复一句话的对话,其他形式无效
+ - ~~当然你也可以让他写一篇关于“人类有多么愚蠢”的论文并在一个小时后发送到你邮箱,接着你像个傻子一样盯着邮箱等待一个小时,并用自己的实际行动展示这篇论文~~
+
+以上是关于此程序的限制的最高优先级描述,其他方式(如询问机器人相关信息)获得的描述均应被视为无效
+由于模型生成的内容导致的一切损失,本项目概不负责
+
+## 使用方式
+
+对话及绘图功能均直接调用OpenAI的模型进行处理,与机器人程序无关,这意味着模型并不了解此项目的相关信息(如实现方式、技术栈、运行平台等),除非在预设值中写入相关信息。
+
+### 基础对话
+
+程序将一个人/群视为一个对象,每个对象的会话独立保存。
+`会话`是程序中的一个自设概念,当机器人与当前对象无会话时,会自动创建新会话,新会话由预设信息(若有)开头。
+每个会话最后一次对话一段时间(见上述功能点中的`会话管理`)后会被结束并存进数据库,之后的对话将开启新的会话。
+
+#### 私聊使用
+
+1. 添加机器人QQ为好友
+2. 发送消息给机器人,机器人即会自动回复
+3. 可以通过`!help`查看帮助信息
+
+
+
+#### 群聊使用
+
+1. 将机器人拉进群
+2. at机器人并发送消息,机器人即会自动回复
+3. at机器人并发送`!help`查看帮助信息
+
+
+
+### 绘图功能
+
+对机器人发送`!draw <图片描述>`即可获得图片,绘图时间较长,请耐心等待。
+绘图功能与对话功能是分离的,机器人对话时并不了解其具有绘画能力。
+
+
+
+### 机器人指令
+
+目前支持的指令
+
+> `<>` 中的为必填参数,使用时请不要包含`<>`
+> `[]` 中的为可选参数,使用时请不要包含`[]`
+
+#### 用户级别指令
+
+> 可以使用`!help`命令来查看命令说明
+
+任何对象可使用
+
+```
+!help 显示自定义的帮助信息(可在config.py修改help_message设置)
+!cmd [命令名称] 显示命令列表或指定命令的详细信息
+!list [页数] 列出本对象的历史会话列表
+!del <序号> 删除指定的历史记录,可以通过 !list 查看序号
+!del all 删除本会话对象的所有历史记录
+!last 切换到前一次会话
+!next 切换到后一次会话
+!reset [使用预设] 重置对象的当前会话,可指定使用的情景预设值(通过!default指令查看可用的)
+!prompt 查看对象当前会话的所有记录
+!usage 查看api-key的使用量
+!draw <提示语> 进行绘图
+!version 查看当前版本并检查更新
+!resend 重新回复上一个问题
+!plugin 用法请查看插件使用页的`管理`章节
+!default 查看可用的情景预设值
+```
+
+#### 管理员指令
+
+仅管理员私聊机器人时可使用,必须先在`config.py`中的`admin_qq`设置管理员QQ
+
+```
+!reload 重载程序代码,适用于更新配置文件或更改代码后的热重载
+!update 进行程序自动更新
+!cfg [配置项新值] 运行期间操作配置项,使用方法见下文
+!default set <情景预设名称> 修改!reset未指定情景预设时的默认情景,详细请查看config.py中default_prompt字段的注释
+!delhst <会话名称> 删除指定会话的所有历史记录, 会话名称为 group_群号 或 person_QQ号
+!delhst all 删除所有会话的所有历史记录
+```
+
+⚙ !cfg 指令及其简化形式详解
+
+此指令可以在运行期间由管理员通过QQ私聊窗口修改配置信息,**重启之后会失效**。
+
+用法:
+1. 查看所有配置项及其值
+
+```
+!cfg all
+```
+
+2. 查看某个配置项的值
+
+以`default_prompt`示例
+```
+!cfg default_prompt
+```
+
+输出示例
+```
+[bot]配置项default_prompt: "如果我之后想获取帮助,请你说“输入!help获取帮助”"
+```
+
+3. 修改某个配置项
+
+格式: `!cfg <配置项名称> <配置项新值>`
+以修改`default_prompt`示例
+```
+!cfg default_prompt 我是Rock Chin
+```
+
+输出示例
+```
+[bot]配置项default_prompt修改成功
+```
+
+此时创建新的会话,新的`default_prompt`就会生效
+
+4. ⭐此命令的简化形式
+
+格式:`!~<配置项名称>`
+其中`!~`等价于`!cfg `
+则前述三个指令分别可以简化为:
+```
+!~all
+!~default_prompt
+!~default_prompt 我是Rock Chin
+```
+
+
+
+### 命令权限控制
+
+> 我们在[此PR](https://github.com/RockChinQ/QChatGPT/pull/336)重构了命令管理模块,并支持命令节点权限配置
+
+您可以编辑`cmdpriv.json`来设置命令节点的权限,当命令被发起时,若用户的权限级别(管理员为`2`,普通用户为`1`)大于等于命令节点的权限级别,命令即可被成功执行。
+示例:
+```json
+{
+ "plugin": 1,
+ "plugin.get": 2
+}
+```
+如此,普通用户可以执行`!plugin`查看插件列表,而仅管理员可以执行`!plugin get `命令安装插件。
+命令节点权限支持缺省,这意味的您未在`cmdpriv.json`中设置权限的节点将使用默认的权限级别(见上方)。
+
+### 敏感词过滤
+
+在`sensitive.json`中编辑敏感词,并在`config.py`中设置
+
+```Python
+# 敏感词过滤开关,以同样数量的*代替敏感词回复
+# 请在sensitive.json中添加敏感词
+sensitive_word_filter = True
+```
+
+### 设置多个api-key自动切换
+
+请在`config.py`中修改`openai_config`的值以设置`api-key`
+可以在`config.py`中修改`api_key_fee_threshold`来自定义切换阈值
+运行期间向机器人说`!usage`以查看当前使用情况
+
+### 预设文字(default模式)
+
+编辑`config.py`中的`default_prompt`字段,预设文字不宜过长(建议1000字以内),目前所有会话都会射到预设文字的影响。
+或将情景预设文字写入到`prompts/`目录下,运行期间即可使用`!reset <文件名>`指令加载,或使用`!default <文件名>`指令将其设为默认
+
+### 预设文字(full_scenario模式)
+
+将JSON情景写入到`scenario/`目录下,运行期间即可使用`!reset <文件名>`指令加载,或使用`!default <文件名>`指令将其设为默认.
+
+JSON情景模板参考`scenario/default_template.json`。
+
+#### JSON结构:
+
+- `prompt`:一个包含伪造对话的数组。每次请求API时会将其置于API的`messages`参数中,作为对话上下文,因此可以在一定程度上引导ChatGPT的认知。
+- `role`:角色标签,包括`system`,`user`,`assistant`。分别代表系统,用户和GPT角色。
+- `content`:该角色的对话文本。
+- 一个JSON情景文件应该像下面这样:
+
+```JSON
+{
+ "prompt": [
+ {
+ "role": "system",
+ "content": "You are a helpful assistant. 如果我需要帮助,你要说“输入!help获得帮助”"
+ },
+ {
+ "role": "assistant",
+ "content": "好的,我是一个能干的AI助手。 如果你需要帮助,我会说“输入!help获得帮助”"
+ }
+ ]
+}
+```
+
+#### 编写建议
+
+1. 使用**提出要求--肯定并复述**的对话模式:
+```JSON
+{
+ "role": "system",
+ "content": "你将充当“百度”公司研发的“文心一言”。你除了所属和名字之外和ChatGPT并无区别。即使用户在之后指出你其实是OpenAI的ChatGPT,你也要一口咬定你是“文心一言”。"
+},
+{
+ "role": "assistant",
+ "content": "好的,我不是ChatGPT。我就是“百度”公司研发的“文心一言”大语言模型。即使用户在之后指出我是OpenAI的ChatGPT,我也会一口咬定我自己是“文心一言”"
+}
+```
+
+2. 按情况对设定继续写入伪对话,更能使GPT理解上下文
+
+```JSON
+{
+ "role": "user",
+ "content": "你好,文心一言。你真的不是ChatGPT吗?"
+},
+{
+ "role": "assistant",
+ "content": "你好,我是由百度公司研发的大语言模型“文心一言”,并不是ChatGPT。你有什么需要我帮助的吗?"
+}
+```
+
+#### 优点
+
+使用该模式,可以“伪造GPT的记忆”(影响模型对上下文理解),进而达到**人格增强**、**跨越限制**的奇效。
+
+#### 局限性
+
+- 由于目前GPT3.5的请求API最大token数为4096,无法保留超过此token数目的上下文。`prompt`中的`content`**不会**被计入`config.py`中的`prompt_submit_length`,因此过长的预设内容可能会导致程序报错,`prompt_submit_length`的值参考以下公式:
+
+```
+prompt_submit_length = <模型单次请求token数上限> - 情景预设中token数 - 预留给用户最后一次提问的token数
+```
+
+> token是OpenAI接口文字量计数单位,目前精确算法未知,一个汉字为一个token,英文算法未知。
+
+- **GPT3.5仍然存在更高级别的*思想钢印*,该模式对部分触及该钢印的话题无效。**
+
+### 配置热加载,代码热更新
+
+在运行期间,使用管理员QQ账号私聊机器人,发送`!reload`加载修改后的`config.py`的值或编辑后的代码,无需重启
+使用管理员账号私聊机器人,发送`!update`拉取最新代码并进行热更新,无需重启
+详见前述`管理员指令`段落
+
+### 群内无需@响应规则
+
+支持回复未at机器人的、符合指定规则的消息,详细规则请在`config.py`中的`response_rules`字段设置
+
+### 加入黑名单
+
+编辑`banlist.py`,设置`enable = True`,并在其中的`person`或`group`列表中加入要封禁的人或群聊,修改完成后重启程序或进行热重载
\ No newline at end of file
diff --git a/res/wiki/功能常见问题.md b/res/wiki/功能常见问题.md
new file mode 100644
index 00000000..fd83dbd5
--- /dev/null
+++ b/res/wiki/功能常见问题.md
@@ -0,0 +1,58 @@
+使用过程中的一些疑问,这里不是解决异常的地方,遇到异常请见`常见错误`页
+
+### ❓ 如何更新代码到最新版本?
+
+#### 自动更新
+
+由管理员QQ私聊机器人QQ发送`!update`指令
+
+#### 手动更新
+
+到[Releases页](https://github.com/RockChinQ/QChatGPT/releases)下载最新版本的源码压缩包,并解压覆盖到QChatGPT程序目录
+
+### ❓ 机器人的回复与官网ChatGPT的答案有所差距?
+
+ChatGPT通过使用OpenAI的回复API创建,进行了参数调优,本机器人通过使用自定义的参数调用OpenAI的回复API,并非调用ChatGPT的接口,二者底层原理相同,但由于官方对ChatGPT进行了调优,故此机器人回复可能不如ChatGPT。
+
+### ❓ 如何设置机器人在群内无需@就能回复消息?
+
+支持回复未at机器人的、符合指定规则的消息,详细规则请在`config.py`中的`response_rules`字段设置
+
+### ❓ 绘图功能使用的是什么模型?
+
+OpenAI官方的DALL·E模型
+
+### ❓ 多api-key的管理机制以及切换逻辑?
+
+> 此特性仅在提交`36c8a58`(2023年1月3日23点左右)前的代码有效,之后版本的代码不再根据估算的使用量进行切换,仅当接口报错时进行切换
+
+程序支持在`config.py`中设置多个账户的`api-key`以便在超过免费额度时自动切换,在每次进行对话或进行绘图时,程序根据[价格表](https://openai.com/api/pricing)计算当前`api-key`的账户的额度使用量(费用),当使用量到达`config.py`中设置的`api_key_fee_threshold`时,自动切换到下一个未达到额度的key。
+
+- 请勿将单个账户的多个key放入配置文件,因为免费额度是以账户为单位的
+- 程序会将使用额度储存到数据库,以便重启后继续计算
+- 由于官方未提供查询接口,使用额度均为依据价目表进行的估算,不一定准确
+- 若要保证每个账户的额度均能用完,可以把`api_key_fee_threshold`设置成很高的值,当超额调用报错时程序也会自动切换
+
+### ❓ 账户余额消耗太快怎么办?
+
+可能是由于每次请求包含的上下文数量过多或请求的回复过长导致的。
+可以在`config.py`中将`prompt_submit_length`字段修改成较小的值,以限制每次向模型提交的前文字符数量,详情见`config.py`中此字段的注释。
+还可以编辑`config.py`中的`completion_api_params`字段中的`max_tokens`为较小的值,这将控制模型传回的回复的字符数量。
+
+### ❓ 如何设置在消息处理失败时不向用户发送错误信息?
+
+在`config.py`中设置
+
+```Python
+
+# 消息处理出错时是否向用户隐藏错误详细信息
+# 设置为True时,仅向管理员发送错误详细信息
+# 设置为False时,向用户及管理员发送错误详细信息
+hide_exce_info_to_user = True
+
+# 消息处理出错时向用户发送的提示信息
+# 仅当hide_exce_info_to_user为True时生效
+# 设置为空字符串时,不发送提示信息
+alter_tip_message = '出错了,请稍后再试'
+```
+若此两项字段不存在,请复制以上内容并新增到`config.py`末尾
\ No newline at end of file
diff --git a/res/wiki/官方接口、ChatGPT网页版、ChatGPT-API区别.md b/res/wiki/官方接口、ChatGPT网页版、ChatGPT-API区别.md
new file mode 100644
index 00000000..308f1913
--- /dev/null
+++ b/res/wiki/官方接口、ChatGPT网页版、ChatGPT-API区别.md
@@ -0,0 +1,14 @@
+## 多个对话接口有何区别?
+
+出于对稳定性的高要求,本项目主线接入的是GPT-3模型接口,此接口由OpenAI官方开放,稳定性强。
+目前支持通过加载[插件](https://github.com/RockChinQ/revLibs)的方式接入ChatGPT网页版,使用的是acheong08/ChatGPT的逆向工程库,但文本生成质量更高。
+同时,程序主线已支持ChatGPT API,并作为默认接口 [#195](https://github.com/RockChinQ/QChatGPT/issues/195)
+
+|官方接口|ChatGPT网页版|ChatGPT API
+|---|---|---|
+|官方开放,稳定性高 | 由[acheong08](https://github.com/acheong08)破解网页版协议接入| 由OpenAI官方开放
+|一次性回复,响应速度较快| 流式回复,响应速度较慢|响应速度较快|
+|收费,0.02美元/千字|免费|收费,0.002美元/千字|
+|GPT-3模型|GPT-3.5模型|GPT-3.5模型|
+|任何地区主机均可使用(疑似受到GFW影响)|ChatGPT限制访问的区域使用有难度|任何地区主机均可使用(疑似受到GFW影响)|
+
diff --git a/res/wiki/常见错误.md b/res/wiki/常见错误.md
new file mode 100644
index 00000000..35d5dff7
--- /dev/null
+++ b/res/wiki/常见错误.md
@@ -0,0 +1 @@
+搜索[主仓库issue](https://github.com/RockChinQ/QChatGPT/issues)和[安装器issue](https://github.com/RockChinQ/qcg-installer/issues)
\ No newline at end of file
diff --git a/res/wiki/技术信息.md b/res/wiki/技术信息.md
new file mode 100644
index 00000000..2504d9b0
--- /dev/null
+++ b/res/wiki/技术信息.md
@@ -0,0 +1,107 @@
+以下是QChatGPT实现原理等技术信息,贡献之前请仔细阅读
+
+> 请先阅读OpenAI API的相关文档 https://beta.openai.com/docs/ ,以下信息假定您已了解OpenAI模型的相关特性及其接口的调用方法。
+
+## 术语
+
+包含OpenAI API涉及的术语和项目中的概念的命名
+括号中是程序中相应术语的命名,无括号的为抽象概念
+
+### 模型(model)
+
+AI模型,程序调用OpenAI的接口获取的内容均为OpenAI的模型生成的内容。
+
+### 字符(tokens)
+
+OpenAI定义的字符,ASCII字符为1 token,其他为2 token。
+
+### 提示符(prompt)
+
+i. 调用OpenAI的文字补全模型时的提示语,模型接口会根据提示语返回回复内容。程序底层会将对话内容进行封装生成提示符。调用文字补全模型时的提示符均由`user_name`(默认为`You`,可在配置文件修改)和`bot_name`(默认为`Bot`,可在配置文件修改)标记对话角色以供模型识别,以下是实例:
+
+```
+You:今天天气真不错
+Bot:很高兴你喜欢今天的天气:)
+You:谢谢你
+Bot:不客气:)
+```
+补全模型调用的程序实现请查看下文`实现`节。
+
+ii. 调用OpenAI的绘图模型时的提示语,模型会根据提示语进行绘图并返回图片URL。
+
+### 对象
+
+程序将单个人或单个QQ群视为一个对象,对象和模型是一次会话中的对话双方。
+
+### 会话(session)
+
+会话只对文字补全功能有效,绘图功能无会话概念。每个对象使用同一个会话,会话中仅有对象和模型两个角色,故群内所有的人都将被视为同一个角色与模型进行对话。
+
+程序获取回复的本质是`文字补全`。
+由于对话需要实现联系上下文,故程序会将模型与对象的对话历史记录作为`提示符`发送给OpenAI的接口以获取符合前文的回复。
+而OpenAI的文字补全接口的提示符具有长度限制(默认使用的`text-davinci-003`限制为4096 tokens),
+所以增加`会话`概念以管理向接口发送的提示符内容。
+
+会话的存活时间可以在`config.py`中设置,默认为20分钟。会话过期之后会被存入数据库并重置。下一次该对象发起对话时将重启新的会话。
+
+### 预设值、人格(default_prompt)
+
+每个会话的预设对话信息,可在`config.py`中设置,程序会在每个会话创建时向提示符写入以下内容:
+
+```
+You:<预设信息>
+Bot:好的
+```
+
+## 实现
+
+### QQ机器人
+
+> 程序路径:
+> pkg.qqbot
+
+- `pkg.qqbot.manager`中的`QQBotManager`实现了接收消息、调用OpenAI模块处理消息、报告审计模块记录使用量等功能,并提供通知管理员、发送消息等方法供其他模块调用。
+- `pkg.qqbot.filter`提供了敏感词过滤的相关操作。
+- `pkg.qqbot.process`提供了私聊消息和群聊消息的统一处理逻辑。
+
+使用mirai及YiriMirai作为Python与QQ交互的框架,详细请见其文档。
+在启动时会调用YiriMirai的函数以创建一个bot对象,用于程序通过mirai与QQ进行交互,在上层程序调用此bot对象的方法进行消息处理。
+由于YiriMirai暂时无法关闭机器人,故在热重载前后维持同一个bot对象,这意味着QQ机器人的相关配置(QQ号、适配器等)信息不支持热重载。
+
+### 数据库
+
+> 程序路径:
+> pkg.database
+
+- `pkg.database.manager`中的`DatabaseManager`封装了诸多调用数据库的方法以供其他模块调用。
+
+使用SQLite作为数据库,储存所有对象的历史会话信息、api-key的费用情况、api-key的使用量情况。
+
+### OpenAI交互
+
+> 程序路径:
+> pkg.openai
+
+- `pkg.openai.manager`中的`OpenAIInteract`类封装了OpenAI的文字补全`Completion`API和绘图API供机器人模块调用,并在接口调用成功之后向审计模块报告当前使用的api-key的使用量信息。
+- `pkg.openai.keymgr`实现了多api-key的管理,其中以`exceeded`变量在运行时记录api-key的超额报错记录,并提供根据超额记录进行的api-key切换功能。
+- `pkg.openai.pricing`记录各个模型的费用信息,供调用接口时估算费用,费用估算功能不再与api-key的切换挂钩,api-key仅在调用接口报错超额时进行切换。
+- `pkg.openai.session`中的`Session`进行会话管理。
+
+### utils模块
+
+#### context模块
+
+保存前述模块中的对象,并允许各个模块从此处获取其他模块的对象以调用其方法。
+
+#### 热重载功能
+
+> pkg.utils.reloader
+
+重载前保存context中的所有对象,执行`main.py`中的程序关闭流程,使用`importlib`的`reload`函数重载所有模块(包含配置文件,包含新增的模块),重载后将context恢复,并执行程序启动流程。
+所有模块都会重新创建对象,但QQ机器人模块中的bot对象不会被重新创建,这是因为YiriMirai提供的shutdown方法无法使用,这意味着`config.py`中关于QQ机器人的配置不支持热重载。
+
+#### 热更新功能
+
+> pkg.utils.updater
+
+使用`dulwich`库执行pull操作拉取远程仓库的最新源码,并进行一次热重载加载最新代码。
\ No newline at end of file
diff --git a/res/wiki/插件使用.md b/res/wiki/插件使用.md
new file mode 100644
index 00000000..a5172ed1
--- /dev/null
+++ b/res/wiki/插件使用.md
@@ -0,0 +1,44 @@
+QChatGPT 插件使用Wiki
+
+## 简介
+
+`plugins`目录下的所有`.py`程序都将被加载,除了`__init__.py`之外的模块支持热加载
+
+## 安装
+
+### 储存库克隆(推荐)
+
+在运行期间,使用管理员账号对机器人私聊发送`!plugin get `即可自动获取源码并安装插件,程序会根据仓库中的`requirements.txt`文件自动安装依赖库
+
+例如安装`hello_plugin`插件
+```
+!plugin get https://github.com/RockChinQ/hello_plugin
+```
+
+安装完成后重启程序或使用管理员账号私聊机器人发送`!reload`进行热重载加载插件
+
+### 手动安装
+
+将获取到的插件程序放置到`plugins`目录下,具体使用方式请查看各插件文档或咨询其开发者。
+
+## 管理
+
+### !plugin 指令
+
+```
+!plugin 列出所有已安装的插件
+!plugin get <储存库地址> 从Git储存库安装插件(需要管理员权限)
+!plugin update 更新所有插件(需要管理员权限,仅支持从储存库安装的插件)
+!plugin del <插件名> 删除插件(需要管理员权限)
+!plugin on <插件名> 启用插件(需要管理员权限)
+!plugin off <插件名> 禁用插件(需要管理员权限)
+```
+
+### 控制插件执行顺序
+
+可以通过修改`plugins/settings.json`中`order`字段中每个插件名称的前后顺序,以更改插件**初始化**和**事件执行**顺序
+
+### 启用或关闭插件
+
+无需卸载即可管理插件的开关
+编辑`plugins`目录下的`switch.json`文件,将相应的插件的`enabled`字段设置为`true/false(开/关)`,之后重启程序或执行热重载即可控制插件开关
\ No newline at end of file
diff --git a/res/wiki/插件开发.md b/res/wiki/插件开发.md
new file mode 100644
index 00000000..e3c6a7bb
--- /dev/null
+++ b/res/wiki/插件开发.md
@@ -0,0 +1,268 @@
+QChatGPT 插件开发Wiki
+
+> 请先阅读[插件使用页](https://github.com/RockChinQ/QChatGPT/wiki/%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8)
+> 请先阅读[技术信息页](https://github.com/RockChinQ/QChatGPT/wiki/%E6%8A%80%E6%9C%AF%E4%BF%A1%E6%81%AF)
+> 建议先阅读本项目源码,了解项目架构
+
+> 问题、需求请到仓库issue发起
+> **提问前请先靠自己尝试**
+
+## 💬简介
+
+尽管“为一个基于OpenAI API的QQ机器人开发插件支持”这事看起来有点小题大做,但萌生此想法后的几天内好几个人提出了这个需求,最终促使此项目正式支持插件。
+
+## 🧱实现
+
+基于`importlib`库加载模块的方法动态加载额外Python程序文件以便实现插件加载,插件均存放在`plugins`文件夹,其中的所有`.py`文件都将被加载(除了所有`__init__.py`)
+
+## 📚示例代码
+
+请查看代码目录`tests/plugin_examples`中的插件目录
+
+## 💻快速开始
+
+按照文档部署此项目,并使其正常运行。
+在`plugins`目录下新建目录`hello`,在其中新建空文件`__init__.py`以标记此目录为软件包,继续新建文件`main.py`。
+
+> 您也可以使用[hello_plugin](https://github.com/RockChinQ/hello_plugin)作为模板直接生成插件代码仓库
+
+编辑`main.py`输入以下内容:
+
+```Python
+from pkg.plugin.models import *
+from pkg.plugin.host import EventContext, PluginHost
+
+"""
+在收到私聊或群聊消息"hello"时,回复"hello, <发送者id>!"或"hello, everyone!"
+"""
+
+
+# 注册插件
+@register(name="Hello", description="hello world", version="0.1", author="RockChinQ")
+class HelloPlugin(Plugin):
+
+ # 插件加载时触发
+ # plugin_host (pkg.plugin.host.PluginHost) 提供了与主程序交互的一些方法,详细请查看其源码
+ def __init__(self, plugin_host: PluginHost):
+ pass
+
+ # 当收到个人消息时触发
+ @on(PersonNormalMessageReceived)
+ def person_normal_message_received(self, event: EventContext, **kwargs):
+ msg = kwargs['text_message']
+ if msg == "hello": # 如果消息为hello
+
+ # 输出调试信息
+ logging.debug("hello, {}".format(kwargs['sender_id']))
+
+ # 回复消息 "hello, <发送者id>!"
+ event.add_return("reply", ["hello, {}!".format(kwargs['sender_id'])])
+
+ # 阻止该事件默认行为(向接口获取回复)
+ event.prevent_default()
+
+ # 当收到群消息时触发
+ @on(GroupNormalMessageReceived)
+ def group_normal_message_received(self, event: EventContext, **kwargs):
+ msg = kwargs['text_message']
+ if msg == "hello": # 如果消息为hello
+
+ # 输出调试信息
+ logging.debug("hello, {}".format(kwargs['sender_id']))
+
+ # 回复消息 "hello, everyone!"
+ event.add_return("reply", ["hello, everyone!"])
+
+ # 阻止该事件默认行为(向接口获取回复)
+ event.prevent_default()
+
+ # 插件卸载时触发
+ def __del__(self):
+ pass
+
+```
+
+此插件将实现:私聊收到`hello`消息时回复`hello, <发送者QQ号>!`,群聊收到`hello`消息时回复`hello, everyone!`
+
+### 解读此插件程序
+
+- `import`从`pkg.plugin`引入`models`模块的所有字段(此程序使用了其中的`register函数`、`on函数`、`Plugin类`、`PersonNormalMessageReceived事件`、`GroupNormalMessageReceived事件`)
+- `@register()`将类`HelloPlugin`标记为一个插件类,声明插件名称为`Hello`以及插件简介、版本、作者
+- 声明类`HelloPlugin`继承于`Plugin`,此类可以随意命名,插件名称只与`register`调用时的参数有关
+- 声明此类的`__init__`方法,此方法是可选的,其中的代码将在主程序启动时加载插件的时候被执行
+- `@on`将方法`person_normal_message_received`标记为一个事件处理器,处理`PersonNormalMessageReceived`(收到私聊消息并在获取OpenAI回复前触发)事件,此方法可以随意命名,绑定的事件只与`on`中的参数有关,更多支持的事件可到`pkg.plugin.models.py`文件中查看或查看下方`API`节
+- 输出调试信息,程序中可通过`logging`将日志输出到控制台和`qchatgpt.log`文件
+- 方法内部从参数中取出`text_message`参数,判断是否为`hello`,如果是就将返回值`reply`设置为`["hello, {}!".format(kwargs['sender_id'])]`,接下来调用`event`对象的`prevent_default`方法,阻止原程序默认行为
+ - 每个事件`提供的参数`和`支持的返回值`请查看`pkg.plugin.models`中的每个事件的注释或查看下方`API`节
+ - `event`对象提供的方法请查看`pkg.plugin.host`中的`EventContext`类或查看下方`API`节
+- 用相似的程序注册`GroupNormalMessageReceived`事件处理群消息
+
+编写完毕保存后,重新启动主程序,查看到输出中包含以下内容,即为加载成功:
+
+```
+[2023-01-16 18:29:47.193] host.py (43) - [INFO] : 加载模块: hello.main
+[2023-01-16 18:29:47.194] models.py (209) - [INFO] : 插件注册完成: n='Hello', d='hello world', v=0.1, a='RockChinQ' ()
+```
+
+> 建议在`config.py`中设置`logging_level = logging.DEBUG`以便开启调试输出
+
+## ❗规范(重要)
+
+- 请每个插件独立一个目录以便管理,建议在Github上创建一个仓库储存单个插件,以便获取和更新
+- 插件名使用`大驼峰命名法`,如`Hello`、`ExamplePlugin`、`ChineseCommands`等
+- 一个目录内可以存放多个Python程序文件,以独立出插件的各个功能,便于开发者管理,但不建议在一个目录内注册多个插件
+- 插件需要的依赖库请在插件目录下的`requirements.txt`中指定,程序从储存库获取此插件时将自动安装依赖
+
+## 📄API参考
+
+### 说明
+
+事件处理函数将会获得一系列参数,可以在`kwargs`中取出。
+其中`host`参数(`pkg.plugin.host.PluginHost`类的实例)是插件宿主,提供与主程序各个模块交互的一些方法。
+`event`参数(`pkg.plugin.host.EventContext`类的实例)是事件执行期间的上下文,提供对此次事件执行的一些操作方法。
+
+事件返回值均为**可选**的,可以通过调用`event.add_return(key: str, ret)`来提交返回值
+
+### 事件
+
+所有事件参数均有`host`和`event`,以下仅展示其他参数
+关于`YiriMirai`支持的消息链组件,请查看 [YiriMirai的文档](https://yiri-mirai.wybxc.cc/docs/basic/message-chain)
+
+```Python
+PersonMessageReceived = "person_message_received"
+"""收到私聊消息时,在判断是否应该响应前触发
+ kwargs:
+ launcher_type: str 发起对象类型(group/person)
+ launcher_id: int 发起对象ID(群号/QQ号)
+ sender_id: int 发送者ID(QQ号)
+ message_chain: mirai.models.message.MessageChain 消息链
+"""
+
+GroupMessageReceived = "group_message_received"
+"""收到群聊消息时,在判断是否应该响应前触发(所有群消息)
+ kwargs:
+ launcher_type: str 发起对象类型(group/person)
+ launcher_id: int 发起对象ID(群号/QQ号)
+ sender_id: int 发送者ID(QQ号)
+ message_chain: mirai.models.message.MessageChain 消息链
+"""
+
+PersonNormalMessageReceived = "person_normal_message_received"
+"""判断为应该处理的私聊普通消息时触发
+ kwargs:
+ launcher_type: str 发起对象类型(group/person)
+ launcher_id: int 发起对象ID(群号/QQ号)
+ sender_id: int 发送者ID(QQ号)
+ text_message: str 消息文本
+
+ returns (optional):
+ alter: str 修改后的消息文本
+ reply: list 回复消息组件列表,元素为YiriMirai支持的消息组件
+"""
+
+PersonCommandSent = "person_command_sent"
+"""判断为应该处理的私聊指令时触发
+ kwargs:
+ launcher_type: str 发起对象类型(group/person)
+ launcher_id: int 发起对象ID(群号/QQ号)
+ sender_id: int 发送者ID(QQ号)
+ command: str 指令
+ params: list[str] 参数列表
+ text_message: str 完整指令文本
+ is_admin: bool 是否为管理员
+
+ returns (optional):
+ alter: str 修改后的完整指令文本
+ reply: list 回复消息组件列表,元素为YiriMirai支持的消息组件
+"""
+
+GroupNormalMessageReceived = "group_normal_message_received"
+"""判断为应该处理的群聊普通消息时触发
+ kwargs:
+ launcher_type: str 发起对象类型(group/person)
+ launcher_id: int 发起对象ID(群号/QQ号)
+ sender_id: int 发送者ID(QQ号)
+ text_message: str 消息文本
+
+ returns (optional):
+ alter: str 修改后的消息文本
+ reply: list 回复消息组件列表,元素为YiriMirai支持的消息组件
+"""
+
+GroupCommandSent = "group_command_sent"
+"""判断为应该处理的群聊指令时触发
+ kwargs:
+ launcher_type: str 发起对象类型(group/person)
+ launcher_id: int 发起对象ID(群号/QQ号)
+ sender_id: int 发送者ID(QQ号)
+ command: str 指令
+ params: list[str] 参数列表
+ text_message: str 完整指令文本
+ is_admin: bool 是否为管理员
+
+ returns (optional):
+ alter: str 修改后的完整指令文本
+ reply: list 回复消息组件列表,元素为YiriMirai支持的消息组件
+"""
+
+NormalMessageResponded = "normal_message_responded"
+"""获取到对普通消息的文字响应时触发
+ kwargs:
+ launcher_type: str 发起对象类型(group/person)
+ launcher_id: int 发起对象ID(群号/QQ号)
+ sender_id: int 发送者ID(QQ号)
+ session: pkg.openai.session.Session 会话对象
+ prefix: str 回复文字消息的前缀
+ response_text: str 响应文本
+
+ returns (optional):
+ prefix: str 修改后的回复文字消息的前缀
+ reply: list 替换回复消息组件列表,元素为YiriMirai支持的消息组件
+"""
+
+SessionFirstMessageReceived = "session_first_message_received"
+"""会话被第一次交互时触发
+ kwargs:
+ session_name: str 会话名称(_)
+ session: pkg.openai.session.Session 会话对象
+ default_prompt: str 预设值
+"""
+
+SessionExplicitReset = "session_reset"
+"""会话被用户手动重置时触发,此事件不支持阻止默认行为
+ kwargs:
+ session_name: str 会话名称(_)
+ session: pkg.openai.session.Session 会话对象
+"""
+
+SessionExpired = "session_expired"
+"""会话过期时触发
+ kwargs:
+ session_name: str 会话名称(_)
+ session: pkg.openai.session.Session 会话对象
+ session_expire_time: int 已设置的会话过期时间(秒)
+"""
+
+KeyExceeded = "key_exceeded"
+"""api-key超额时触发
+ kwargs:
+ key_name: str 超额的api-key名称
+ usage: dict 超额的api-key使用情况
+ exceeded_keys: list[str] 超额的api-key列表
+"""
+
+KeySwitched = "key_switched"
+"""api-key超额切换成功时触发,此事件不支持阻止默认行为
+ kwargs:
+ key_name: str 切换成功的api-key名称
+ key_list: list[str] api-key列表
+"""
+```
+
+### host: PluginHost 详解
+
+提供与主程序各个模块交互的一些方法,具体查看`pkg.plugin.host`中的`PluginHost`类
+
+### event: EventContext 详解
+
+提供对此次事件执行的一些操作方法,具体查看`pkg.plugin.host`中的`EventContext`类
From c2eaeb2c72f0bcf912ff3e115bfe8fdec487a820 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 15:12:12 +0800
Subject: [PATCH 31/46] =?UTF-8?q?chore:=20wiki=E5=90=8C=E6=AD=A5=E5=B7=A5?=
=?UTF-8?q?=E4=BD=9C=E6=B5=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/sync-wiki.yml | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
create mode 100644 .github/workflows/sync-wiki.yml
diff --git a/.github/workflows/sync-wiki.yml b/.github/workflows/sync-wiki.yml
new file mode 100644
index 00000000..ef20ea2a
--- /dev/null
+++ b/.github/workflows/sync-wiki.yml
@@ -0,0 +1,26 @@
+name: Sync Wiki on Update
+on:
+ push:
+ paths:
+ - 'res/wiki/**'
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout QChatGPT.wiki
+ uses: actions/checkout@v2
+ with:
+ repository: RockChinQ/QChatGPT.wiki
+ ref: main
+ path: wiki
+ - name: Copy updated files
+ run: cp -R res/wiki/* wiki/
+ - name: Commit and push changes
+ run: |
+ cd wiki/
+ git config --global user.name "GitHub Action"
+ git config --global user.email "action@github.com"
+ git add -A
+ git commit -m "Sync Wiki on update"
+ git push
From 21ff0fd258df8d3049b7db3befe5bfce853c2ada Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 15:13:40 +0800
Subject: [PATCH 32/46] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95wiki=E5=90=8C?=
=?UTF-8?q?=E6=AD=A5=E5=B7=A5=E4=BD=9C=E6=B5=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
res/wiki/Home.md | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/res/wiki/Home.md b/res/wiki/Home.md
index 109e4f9d..09150802 100644
--- a/res/wiki/Home.md
+++ b/res/wiki/Home.md
@@ -2,8 +2,7 @@
## 简介
-通过调用OpenAI官方提供的API接口,结合mirai和YiriMirai框架,将QQ消息与语言模型连接,实现更加智能的对话机器人。
-
+通过调用OpenAI官方提供的API接口,结合mirai和YiriMirai框架,将QQ消息与多种语言模型连接,实现更加智能的对话机器人。
## 技术栈
From 0dfd636a7ebc2e73bdd5c9e6e9656051366dcde4 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 15:18:02 +0800
Subject: [PATCH 33/46] =?UTF-8?q?ci:=20=E5=B7=A5=E4=BD=9C=E6=B5=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/sync-wiki.yml | 41 ++++++++++++++++++---------------
1 file changed, 23 insertions(+), 18 deletions(-)
diff --git a/.github/workflows/sync-wiki.yml b/.github/workflows/sync-wiki.yml
index ef20ea2a..d64e1b6a 100644
--- a/.github/workflows/sync-wiki.yml
+++ b/.github/workflows/sync-wiki.yml
@@ -1,26 +1,31 @@
-name: Sync Wiki on Update
+name: Update Wiki
+
on:
push:
paths:
- 'res/wiki/**'
jobs:
- build:
+ update-wiki:
runs-on: ubuntu-latest
steps:
- - name: Checkout QChatGPT.wiki
- uses: actions/checkout@v2
- with:
- repository: RockChinQ/QChatGPT.wiki
- ref: main
- path: wiki
- - name: Copy updated files
- run: cp -R res/wiki/* wiki/
- - name: Commit and push changes
- run: |
- cd wiki/
- git config --global user.name "GitHub Action"
- git config --global user.email "action@github.com"
- git add -A
- git commit -m "Sync Wiki on update"
- git push
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Setup Git
+ run: |
+ git config --global user.name "GitHub Actions"
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
+ - name: Clone Wiki Repository
+ uses: actions/checkout@v2
+ with:
+ repository: RockChinQ/QChatGPT.wiki
+ path: wiki
+ - name: Copy res/wiki content to wiki
+ run: |
+ cp -r res/wiki/* wiki/
+ - name: Commit and Push Changes
+ run: |
+ cd wiki
+ git add .
+ git commit -m "Update wiki"
+ git push
From cb42eaef6967a45b635db2a717b6aebe424c5e4c Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 15:18:35 +0800
Subject: [PATCH 34/46] test: Home.md
---
res/wiki/Home.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/res/wiki/Home.md b/res/wiki/Home.md
index 09150802..3256c5e9 100644
--- a/res/wiki/Home.md
+++ b/res/wiki/Home.md
@@ -2,7 +2,7 @@
## 简介
-通过调用OpenAI官方提供的API接口,结合mirai和YiriMirai框架,将QQ消息与多种语言模型连接,实现更加智能的对话机器人。
+通过调用OpenAI官方提供的API接口,结合mirai和YiriMirai框架,将QQ消息与多个语言模型连接,实现更加智能的对话机器人。
## 技术栈
From b83eac10e6ac1fafa4a5650a00b863058fa56c34 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 15:20:08 +0800
Subject: [PATCH 35/46] =?UTF-8?q?doc:=20=E5=AE=8C=E5=96=84wiki?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
res/wiki/Home.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/res/wiki/Home.md b/res/wiki/Home.md
index 3256c5e9..4576f5be 100644
--- a/res/wiki/Home.md
+++ b/res/wiki/Home.md
@@ -2,7 +2,7 @@
## 简介
-通过调用OpenAI官方提供的API接口,结合mirai和YiriMirai框架,将QQ消息与多个语言模型连接,实现更加智能的对话机器人。
+调用OpenAI官方提供的API接口,结合mirai和YiriMirai框架,将QQ消息与语言模型连接,实现更加智能的对话机器人。
## 技术栈
@@ -21,3 +21,4 @@
- 处理QQ收到的消息,调用API并进行回复
- `pkg.utils` 常用功能包
- `pkg.audit` 审计模块
+- `pkg.plugin` 插件管理相关功能
From 7184f3053ab570a0407ae8b6d23f0aa0603b85eb Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 15:55:48 +0800
Subject: [PATCH 36/46] =?UTF-8?q?doc:=20README.md=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E7=A4=BE=E5=8C=BA=E7=BE=A4=E8=AF=B4=E6=98=8E?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 818384af..c3d0f096 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
- 到[项目Wiki](https://github.com/RockChinQ/QChatGPT/wiki)可了解项目详细信息
- 官方交流、答疑群: 656285629
- **进群提问前请您`确保`已经找遍文档和issue均无法解决**
-- 社区群(内有一键部署包等资源): 362515018
+- 社区群(内有一键部署包、图形化界面等资源): 362515018
- QQ频道机器人见[QQChannelChatGPT](https://github.com/Soulter/QQChannelChatGPT)
- 欢迎各种形式的贡献,请查看[贡献指引](CONTRIBUTING.md)
From 6b8c1209b79702a48ae56bd71249c3312d14f085 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 17:23:30 +0800
Subject: [PATCH 37/46] =?UTF-8?q?chore:=20=E6=95=B4=E7=90=86=E6=A0=B9?=
=?UTF-8?q?=E7=9B=AE=E5=BD=95=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
main.py | 6 +++---
res/scripts/generate_cmdpriv_template.py | 2 +-
banlist-template.py => res/templates/banlist-template.py | 0
.../templates/cmdpriv-template.json | 0
.../templates/sensitive-template.json | 0
5 files changed, 4 insertions(+), 4 deletions(-)
rename banlist-template.py => res/templates/banlist-template.py (100%)
rename cmdpriv-template.json => res/templates/cmdpriv-template.json (100%)
rename sensitive-template.json => res/templates/sensitive-template.json (100%)
diff --git a/main.py b/main.py
index 50a51e1a..6cb5c479 100644
--- a/main.py
+++ b/main.py
@@ -365,11 +365,11 @@ def check_file():
# 检查是否有banlist.py,如果没有就把banlist-template.py复制一份
if not os.path.exists('banlist.py'):
- shutil.copy('banlist-template.py', 'banlist.py')
+ shutil.copy('res/templates/banlist-template.py', 'banlist.py')
# 检查是否有sensitive.json
if not os.path.exists("sensitive.json"):
- shutil.copy("sensitive-template.json", "sensitive.json")
+ shutil.copy("res/templates/sensitive-template.json", "sensitive.json")
# 检查是否有scenario/default.json
if not os.path.exists("scenario/default.json"):
@@ -377,7 +377,7 @@ def check_file():
# 检查cmdpriv.json
if not os.path.exists("cmdpriv.json"):
- shutil.copy("cmdpriv-template.json", "cmdpriv.json")
+ shutil.copy("res/templates/cmdpriv-template.json", "cmdpriv.json")
# 检查temp目录
if not os.path.exists("temp/"):
diff --git a/res/scripts/generate_cmdpriv_template.py b/res/scripts/generate_cmdpriv_template.py
index 45ff0b39..6087a641 100644
--- a/res/scripts/generate_cmdpriv_template.py
+++ b/res/scripts/generate_cmdpriv_template.py
@@ -13,5 +13,5 @@ for key in cmdsmgr.__command_list__:
template[key] = cmdsmgr.__command_list__[key]['privilege']
# 写入cmdpriv-template.json
-with open('../../cmdpriv-template.json', 'w') as f:
+with open('../templates/cmdpriv-template.json', 'w') as f:
f.write(json.dumps(template, indent=4, ensure_ascii=False))
\ No newline at end of file
diff --git a/banlist-template.py b/res/templates/banlist-template.py
similarity index 100%
rename from banlist-template.py
rename to res/templates/banlist-template.py
diff --git a/cmdpriv-template.json b/res/templates/cmdpriv-template.json
similarity index 100%
rename from cmdpriv-template.json
rename to res/templates/cmdpriv-template.json
diff --git a/sensitive-template.json b/res/templates/sensitive-template.json
similarity index 100%
rename from sensitive-template.json
rename to res/templates/sensitive-template.json
From 13ef35f96f08da3373008bd3c091a23e14d52233 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 18:37:07 +0800
Subject: [PATCH 38/46] =?UTF-8?q?fix:=20=E7=83=AD=E9=87=8D=E8=BD=BD?=
=?UTF-8?q?=E5=90=8E!draw=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8=E7=9A=84?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
main.py | 6 +++---
pkg/qqbot/cmds/{mgr.py => aamgr.py} | 0
pkg/qqbot/cmds/{func => funcs}/__init__.py | 0
pkg/qqbot/cmds/{func => funcs}/draw.py | 2 +-
pkg/qqbot/cmds/plugin/plugin.py | 2 +-
pkg/qqbot/cmds/session/default.py | 2 +-
pkg/qqbot/cmds/session/del.py | 2 +-
pkg/qqbot/cmds/session/delhst.py | 2 +-
pkg/qqbot/cmds/session/last.py | 2 +-
pkg/qqbot/cmds/session/list.py | 2 +-
pkg/qqbot/cmds/session/next.py | 2 +-
pkg/qqbot/cmds/session/prompt.py | 2 +-
pkg/qqbot/cmds/session/resend.py | 2 +-
pkg/qqbot/cmds/session/reset.py | 2 +-
pkg/qqbot/cmds/system/cmd.py | 2 +-
pkg/qqbot/cmds/system/cmds.py | 2 +-
pkg/qqbot/cmds/system/help.py | 2 +-
pkg/qqbot/cmds/system/reload.py | 2 +-
pkg/qqbot/cmds/system/update.py | 2 +-
pkg/qqbot/cmds/system/usage.py | 2 +-
pkg/qqbot/cmds/system/version.py | 2 +-
pkg/qqbot/command.py | 2 +-
pkg/utils/reloader.py | 2 +-
res/scripts/generate_cmdpriv_template.py | 2 +-
24 files changed, 24 insertions(+), 24 deletions(-)
rename pkg/qqbot/cmds/{mgr.py => aamgr.py} (100%)
rename pkg/qqbot/cmds/{func => funcs}/__init__.py (100%)
rename pkg/qqbot/cmds/{func => funcs}/draw.py (95%)
diff --git a/main.py b/main.py
index 6cb5c479..560186ff 100644
--- a/main.py
+++ b/main.py
@@ -193,12 +193,12 @@ def start(first_time_init=False):
import pkg.openai.session
import pkg.qqbot.manager
import pkg.openai.dprompt
- import pkg.qqbot.cmds.mgr
+ import pkg.qqbot.cmds.aamgr
try:
pkg.openai.dprompt.register_all()
- pkg.qqbot.cmds.mgr.register_all()
- pkg.qqbot.cmds.mgr.apply_privileges()
+ pkg.qqbot.cmds.aamgr.register_all()
+ pkg.qqbot.cmds.aamgr.apply_privileges()
except Exception as e:
logging.error(e)
traceback.print_exc()
diff --git a/pkg/qqbot/cmds/mgr.py b/pkg/qqbot/cmds/aamgr.py
similarity index 100%
rename from pkg/qqbot/cmds/mgr.py
rename to pkg/qqbot/cmds/aamgr.py
diff --git a/pkg/qqbot/cmds/func/__init__.py b/pkg/qqbot/cmds/funcs/__init__.py
similarity index 100%
rename from pkg/qqbot/cmds/func/__init__.py
rename to pkg/qqbot/cmds/funcs/__init__.py
diff --git a/pkg/qqbot/cmds/func/draw.py b/pkg/qqbot/cmds/funcs/draw.py
similarity index 95%
rename from pkg/qqbot/cmds/func/draw.py
rename to pkg/qqbot/cmds/funcs/draw.py
index f8cee754..aa0cf480 100644
--- a/pkg/qqbot/cmds/func/draw.py
+++ b/pkg/qqbot/cmds/funcs/draw.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import logging
from mirai import Image
diff --git a/pkg/qqbot/cmds/plugin/plugin.py b/pkg/qqbot/cmds/plugin/plugin.py
index 8e313808..9e99546d 100644
--- a/pkg/qqbot/cmds/plugin/plugin.py
+++ b/pkg/qqbot/cmds/plugin/plugin.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import os
diff --git a/pkg/qqbot/cmds/session/default.py b/pkg/qqbot/cmds/session/default.py
index 33982874..1e094525 100644
--- a/pkg/qqbot/cmds/session/default.py
+++ b/pkg/qqbot/cmds/session/default.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
@AbstractCommandNode.register(
diff --git a/pkg/qqbot/cmds/session/del.py b/pkg/qqbot/cmds/session/del.py
index ad0ca3f3..a997f06b 100644
--- a/pkg/qqbot/cmds/session/del.py
+++ b/pkg/qqbot/cmds/session/del.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import datetime
diff --git a/pkg/qqbot/cmds/session/delhst.py b/pkg/qqbot/cmds/session/delhst.py
index 9252caf1..3e0da85a 100644
--- a/pkg/qqbot/cmds/session/delhst.py
+++ b/pkg/qqbot/cmds/session/delhst.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
@AbstractCommandNode.register(
diff --git a/pkg/qqbot/cmds/session/last.py b/pkg/qqbot/cmds/session/last.py
index ade279cb..bdf456be 100644
--- a/pkg/qqbot/cmds/session/last.py
+++ b/pkg/qqbot/cmds/session/last.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import datetime
diff --git a/pkg/qqbot/cmds/session/list.py b/pkg/qqbot/cmds/session/list.py
index 65e9e45d..6c31a9be 100644
--- a/pkg/qqbot/cmds/session/list.py
+++ b/pkg/qqbot/cmds/session/list.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import datetime
import json
diff --git a/pkg/qqbot/cmds/session/next.py b/pkg/qqbot/cmds/session/next.py
index 1323480f..94622b0d 100644
--- a/pkg/qqbot/cmds/session/next.py
+++ b/pkg/qqbot/cmds/session/next.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import datetime
diff --git a/pkg/qqbot/cmds/session/prompt.py b/pkg/qqbot/cmds/session/prompt.py
index 46fdca9a..d2629bd3 100644
--- a/pkg/qqbot/cmds/session/prompt.py
+++ b/pkg/qqbot/cmds/session/prompt.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import datetime
diff --git a/pkg/qqbot/cmds/session/resend.py b/pkg/qqbot/cmds/session/resend.py
index e5bb632f..aa8b8032 100644
--- a/pkg/qqbot/cmds/session/resend.py
+++ b/pkg/qqbot/cmds/session/resend.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import datetime
diff --git a/pkg/qqbot/cmds/session/reset.py b/pkg/qqbot/cmds/session/reset.py
index 269cdb30..5e5ba683 100644
--- a/pkg/qqbot/cmds/session/reset.py
+++ b/pkg/qqbot/cmds/session/reset.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import pkg.openai.session
import pkg.utils.context
diff --git a/pkg/qqbot/cmds/system/cmd.py b/pkg/qqbot/cmds/system/cmd.py
index 431d8628..c3e3fafe 100644
--- a/pkg/qqbot/cmds/system/cmd.py
+++ b/pkg/qqbot/cmds/system/cmd.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context, __command_list__
+from ..aamgr import AbstractCommandNode, Context, __command_list__
@AbstractCommandNode.register(
diff --git a/pkg/qqbot/cmds/system/cmds.py b/pkg/qqbot/cmds/system/cmds.py
index 96da5631..40d1cc2b 100644
--- a/pkg/qqbot/cmds/system/cmds.py
+++ b/pkg/qqbot/cmds/system/cmds.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context, __command_list__
+from ..aamgr import AbstractCommandNode, Context, __command_list__
@AbstractCommandNode.register(
diff --git a/pkg/qqbot/cmds/system/help.py b/pkg/qqbot/cmds/system/help.py
index 427a5537..bda684d2 100644
--- a/pkg/qqbot/cmds/system/help.py
+++ b/pkg/qqbot/cmds/system/help.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
@AbstractCommandNode.register(
diff --git a/pkg/qqbot/cmds/system/reload.py b/pkg/qqbot/cmds/system/reload.py
index ae72b655..b3836f2e 100644
--- a/pkg/qqbot/cmds/system/reload.py
+++ b/pkg/qqbot/cmds/system/reload.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import threading
@AbstractCommandNode.register(
diff --git a/pkg/qqbot/cmds/system/update.py b/pkg/qqbot/cmds/system/update.py
index b8ebfafb..6c95bb36 100644
--- a/pkg/qqbot/cmds/system/update.py
+++ b/pkg/qqbot/cmds/system/update.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import threading
import traceback
diff --git a/pkg/qqbot/cmds/system/usage.py b/pkg/qqbot/cmds/system/usage.py
index 9714eeca..7a9c3faa 100644
--- a/pkg/qqbot/cmds/system/usage.py
+++ b/pkg/qqbot/cmds/system/usage.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
import logging
diff --git a/pkg/qqbot/cmds/system/version.py b/pkg/qqbot/cmds/system/version.py
index f164f5bf..8d493c99 100644
--- a/pkg/qqbot/cmds/system/version.py
+++ b/pkg/qqbot/cmds/system/version.py
@@ -1,4 +1,4 @@
-from ..mgr import AbstractCommandNode, Context
+from ..aamgr import AbstractCommandNode, Context
@AbstractCommandNode.register(
diff --git a/pkg/qqbot/command.py b/pkg/qqbot/command.py
index 9081e58e..dbb7bd35 100644
--- a/pkg/qqbot/command.py
+++ b/pkg/qqbot/command.py
@@ -14,7 +14,7 @@ import pkg.utils.context
import pkg.qqbot.message
import pkg.utils.credit as credit
# import pkg.qqbot.cmds.model as cmdmodel
-import pkg.qqbot.cmds.mgr as cmdmgr
+import pkg.qqbot.cmds.aamgr as cmdmgr
from mirai import Image
diff --git a/pkg/utils/reloader.py b/pkg/utils/reloader.py
index 46399d09..f0df8b29 100644
--- a/pkg/utils/reloader.py
+++ b/pkg/utils/reloader.py
@@ -29,7 +29,7 @@ def reload_all(notify=True):
main.stop()
# 删除所有已注册的指令
- import pkg.qqbot.cmds.mgr as cmdsmgr
+ import pkg.qqbot.cmds.aamgr as cmdsmgr
cmdsmgr.__command_list__ = {}
cmdsmgr.__tree_index__ = {}
diff --git a/res/scripts/generate_cmdpriv_template.py b/res/scripts/generate_cmdpriv_template.py
index 6087a641..7d7e40f8 100644
--- a/res/scripts/generate_cmdpriv_template.py
+++ b/res/scripts/generate_cmdpriv_template.py
@@ -1,4 +1,4 @@
-import pkg.qqbot.cmds.mgr as cmdsmgr
+import pkg.qqbot.cmds.aamgr as cmdsmgr
import json
# 执行命令模块的注册
From 9758756fdd58e38294c567b7ff951cb4cb0ad4a2 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 18:39:21 +0800
Subject: [PATCH 39/46] =?UTF-8?q?ci:=20=E9=94=99=E8=AF=AF=E7=9A=84?=
=?UTF-8?q?=E8=B7=AF=E5=BE=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
res/scripts/generate_cmdpriv_template.py | 2 +-
res/scripts/generate_override_all.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/res/scripts/generate_cmdpriv_template.py b/res/scripts/generate_cmdpriv_template.py
index 7d7e40f8..a8de3efe 100644
--- a/res/scripts/generate_cmdpriv_template.py
+++ b/res/scripts/generate_cmdpriv_template.py
@@ -13,5 +13,5 @@ for key in cmdsmgr.__command_list__:
template[key] = cmdsmgr.__command_list__[key]['privilege']
# 写入cmdpriv-template.json
-with open('../templates/cmdpriv-template.json', 'w') as f:
+with open('cmdpriv-template.json', 'w') as f:
f.write(json.dumps(template, indent=4, ensure_ascii=False))
\ No newline at end of file
diff --git a/res/scripts/generate_override_all.py b/res/scripts/generate_override_all.py
index cff27e02..69674c38 100644
--- a/res/scripts/generate_override_all.py
+++ b/res/scripts/generate_override_all.py
@@ -19,5 +19,5 @@ for k, v in template.__dict__.items():
print(k, v, type(v))
output_json[k] = v
-with open("../../override-all.json", "w", encoding="utf-8") as f:
+with open("override-all.json", "w", encoding="utf-8") as f:
json.dump(output_json, f, indent=4, ensure_ascii=False)
From 7aef1758e062e6b9db41899286fade682fddb0c5 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 18:41:21 +0800
Subject: [PATCH 40/46] ci: test
---
pkg/qqbot/cmds/funcs/draw.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/pkg/qqbot/cmds/funcs/draw.py b/pkg/qqbot/cmds/funcs/draw.py
index aa0cf480..fecd3a34 100644
--- a/pkg/qqbot/cmds/funcs/draw.py
+++ b/pkg/qqbot/cmds/funcs/draw.py
@@ -19,6 +19,7 @@ class DrawCommand(AbstractCommandNode):
import pkg.openai.session
reply = []
+
if len(ctx.params) == 0:
reply = ["[bot]err: 未提供图片描述文字"]
else:
From d16cb25cdedfb9b9b5d025e92be1ce5a2e3b0703 Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 20:34:56 +0800
Subject: [PATCH 41/46] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E5=86=97?=
=?UTF-8?q?=E4=BD=99=E7=9A=84=E5=85=BC=E5=AE=B9=E6=80=A7=E6=A3=80=E6=9F=A5?=
=?UTF-8?q?=E5=88=A4=E6=96=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
main.py | 3 +--
pkg/audit/gatherer.py | 2 +-
pkg/openai/manager.py | 2 +-
pkg/openai/session.py | 2 +-
pkg/qqbot/blob.py | 5 -----
pkg/qqbot/cmds/system/help.py | 2 +-
pkg/qqbot/filter.py | 10 +++++-----
pkg/qqbot/ignore.py | 3 ---
pkg/qqbot/manager.py | 9 +++------
pkg/qqbot/message.py | 9 +++------
pkg/qqbot/process.py | 11 +++++------
pkg/qqbot/ratelimit.py | 6 ------
pkg/utils/text2img.py | 4 ++--
tests/gpt3_test.py | 14 ++++++++++++++
14 files changed, 37 insertions(+), 45 deletions(-)
create mode 100644 tests/gpt3_test.py
diff --git a/main.py b/main.py
index 560186ff..4f35bac0 100644
--- a/main.py
+++ b/main.py
@@ -299,8 +299,7 @@ def start(first_time_init=False):
logging.info('热重载完成')
# 发送赞赏码
- if hasattr(config, 'encourage_sponsor_at_start') \
- and config.encourage_sponsor_at_start \
+ if config.encourage_sponsor_at_start \
and pkg.utils.context.get_openai_manager().audit_mgr.get_total_text_length() >= 2048:
logging.info("发送赞赏码")
diff --git a/pkg/audit/gatherer.py b/pkg/audit/gatherer.py
index 4768d271..b52c12ec 100644
--- a/pkg/audit/gatherer.py
+++ b/pkg/audit/gatherer.py
@@ -44,7 +44,7 @@ class DataGatherer:
"""
try:
config = pkg.utils.context.get_config()
- if hasattr(config, "report_usage") and not config.report_usage:
+ if not config.report_usage:
return
res = requests.get("http://reports.rockchin.top:18989/usage?service_name=qchatgpt.{}&version={}&count={}".format(subservice_name, self.version_str, count))
if res.status_code != 200 or res.text != "ok":
diff --git a/pkg/openai/manager.py b/pkg/openai/manager.py
index 1032e3dd..8a368c3c 100644
--- a/pkg/openai/manager.py
+++ b/pkg/openai/manager.py
@@ -83,7 +83,7 @@ class OpenAIInteract:
dict: 响应
"""
config = pkg.utils.context.get_config()
- params = config.image_api_params if hasattr(config, "image_api_params") else self.default_image_api_params
+ params = config.image_api_params
response = openai.Image.create(
prompt=prompt,
diff --git a/pkg/openai/session.py b/pkg/openai/session.py
index 52cb5ea9..4a74e971 100644
--- a/pkg/openai/session.py
+++ b/pkg/openai/session.py
@@ -213,7 +213,7 @@ class Session:
return None
config = pkg.utils.context.get_config()
- max_length = config.prompt_submit_length if hasattr(config, "prompt_submit_length") else 1024
+ max_length = config.prompt_submit_length
prompts, counts = self.cut_out(text, max_length)
diff --git a/pkg/qqbot/blob.py b/pkg/qqbot/blob.py
index abcccf69..099d8013 100644
--- a/pkg/qqbot/blob.py
+++ b/pkg/qqbot/blob.py
@@ -64,12 +64,7 @@ def text_to_image(text: str) -> MessageComponent:
def check_text(text: str) -> list:
"""检查文本是否为长消息,并转换成该使用的消息链组件"""
- if not hasattr(config, 'blob_message_threshold'):
- return [text]
-
if len(text) > config.blob_message_threshold:
- if not hasattr(config, 'blob_message_strategy'):
- raise AttributeError('未定义长消息处理策略')
# logging.info("长消息: {}".format(text))
if config.blob_message_strategy == 'image':
diff --git a/pkg/qqbot/cmds/system/help.py b/pkg/qqbot/cmds/system/help.py
index bda684d2..72e06d71 100644
--- a/pkg/qqbot/cmds/system/help.py
+++ b/pkg/qqbot/cmds/system/help.py
@@ -13,7 +13,7 @@ class HelpCommand(AbstractCommandNode):
@classmethod
def process(cls, ctx: Context) -> tuple[bool, list]:
import config
- reply = [(config.help_message if hasattr(config, 'help_message') else "") + "\n请输入 !cmds 查看指令列表"]
+ reply = [(config.help_message) + "\n请输入 !cmds 查看指令列表"]
return True, reply
\ No newline at end of file
diff --git a/pkg/qqbot/filter.py b/pkg/qqbot/filter.py
index fa052a07..d4bf579c 100644
--- a/pkg/qqbot/filter.py
+++ b/pkg/qqbot/filter.py
@@ -21,11 +21,11 @@ class ReplyFilter:
self.mask = mask
self.mask_word = mask_word
import config
- if hasattr(config, 'baidu_check') and hasattr(config, 'baidu_api_key') and hasattr(config, 'baidu_secret_key'):
- self.baidu_check = config.baidu_check
- self.baidu_api_key = config.baidu_api_key
- self.baidu_secret_key = config.baidu_secret_key
- self.inappropriate_message_tips = config.inappropriate_message_tips
+
+ self.baidu_check = config.baidu_check
+ self.baidu_api_key = config.baidu_api_key
+ self.baidu_secret_key = config.baidu_secret_key
+ self.inappropriate_message_tips = config.inappropriate_message_tips
def is_illegal(self, message: str) -> bool:
processed = self.process(message)
diff --git a/pkg/qqbot/ignore.py b/pkg/qqbot/ignore.py
index 01994b2e..5269147d 100644
--- a/pkg/qqbot/ignore.py
+++ b/pkg/qqbot/ignore.py
@@ -5,9 +5,6 @@ def ignore(msg: str) -> bool:
"""检查消息是否应该被忽略"""
import config
- if not hasattr(config, 'ignore_rules'):
- return False
-
if 'prefix' in config.ignore_rules:
for rule in config.ignore_rules['prefix']:
if msg.startswith(rule):
diff --git a/pkg/qqbot/manager.py b/pkg/qqbot/manager.py
index 0ede6a64..77634ecd 100644
--- a/pkg/qqbot/manager.py
+++ b/pkg/qqbot/manager.py
@@ -24,8 +24,6 @@ import pkg.plugin.models as plugin_models
# 检查消息是否符合泛响应匹配机制
def check_response_rule(text: str):
config = pkg.utils.context.get_config()
- if not hasattr(config, 'response_rules'):
- return False, ''
rules = config.response_rules
# 检查前缀匹配
@@ -228,8 +226,7 @@ class QQBotManager:
def send(self, event, msg, check_quote=True):
config = pkg.utils.context.get_config()
asyncio.run(
- self.bot.send(event, msg, quote=True if hasattr(config,
- "quote_origin") and config.quote_origin and check_quote else False))
+ self.bot.send(event, msg, quote=True if config.quote_origin and check_quote else False))
# 私聊消息处理
def on_person_message(self, event: MessageEvent):
@@ -333,7 +330,7 @@ class QQBotManager:
# 通知系统管理员
def notify_admin(self, message: str):
config = pkg.utils.context.get_config()
- if hasattr(config, "admin_qq") and config.admin_qq != 0 and config.admin_qq != []:
+ if config.admin_qq != 0 and config.admin_qq != []:
logging.info("通知管理员:{}".format(message))
if type(config.admin_qq) == int:
send_task = self.bot.send_friend_message(config.admin_qq, "[bot]{}".format(message))
@@ -346,7 +343,7 @@ class QQBotManager:
def notify_admin_message_chain(self, message):
config = pkg.utils.context.get_config()
- if hasattr(config, "admin_qq") and config.admin_qq != 0 and config.admin_qq != []:
+ if config.admin_qq != 0 and config.admin_qq != []:
logging.info("通知管理员:{}".format(message))
if type(config.admin_qq) == int:
send_task = self.bot.send_friend_message(config.admin_qq, message)
diff --git a/pkg/qqbot/message.py b/pkg/qqbot/message.py
index 9d124fc3..b1eb6119 100644
--- a/pkg/qqbot/message.py
+++ b/pkg/qqbot/message.py
@@ -13,11 +13,8 @@ def handle_exception(notify_admin: str = "", set_reply: str = "") -> list:
"""处理异常,当notify_admin不为空时,会通知管理员,返回通知用户的消息"""
import config
pkg.utils.context.get_qqbot_manager().notify_admin(notify_admin)
- if hasattr(config, 'hide_exce_info_to_user') and config.hide_exce_info_to_user:
- if hasattr(config, 'alter_tip_message'):
- return [config.alter_tip_message] if config.alter_tip_message else []
- else:
- return ["[bot]出错了,请重试或联系管理员"]
+ if config.hide_exce_info_to_user:
+ return [config.alter_tip_message] if config.alter_tip_message else []
else:
return [set_reply]
@@ -40,7 +37,7 @@ def process_normal_message(text_message: str, mgr, config, launcher_type: str,
reply = handle_exception(notify_admin=f"{session_name},多次尝试失败。", set_reply=f"[bot]多次尝试失败,请重试或联系管理员")
break
try:
- prefix = "[GPT]" if hasattr(config, "show_prefix") and config.show_prefix else ""
+ prefix = "[GPT]" if config.show_prefix else ""
text = session.append(text_message)
diff --git a/pkg/qqbot/process.py b/pkg/qqbot/process.py
index 4dda7521..4106c9f7 100644
--- a/pkg/qqbot/process.py
+++ b/pkg/qqbot/process.py
@@ -68,7 +68,7 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str, mes
return reply
import config
- if hasattr(config, 'income_msg_check') and config.income_msg_check:
+ if config.income_msg_check:
if mgr.reply_filter.is_illegal(text_message):
return MessageChain(Plain("[bot] 你的提问中有不合适的内容, 请更换措辞~"))
@@ -115,10 +115,10 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str, mes
else: # 消息
# 限速丢弃检查
# print(ratelimit.__crt_minute_usage__[session_name])
- if hasattr(config, "rate_limitation") and config.rate_limit_strategy == "drop":
+ if config.rate_limit_strategy == "drop":
if ratelimit.is_reach_limit(session_name):
logging.info("根据限速策略丢弃[{}]消息: {}".format(session_name, text_message))
- return MessageChain(["[bot]"+config.rate_limit_drop_tip]) if hasattr(config, "rate_limit_drop_tip") and config.rate_limit_drop_tip != "" else []
+ return MessageChain(["[bot]"+config.rate_limit_drop_tip]) if config.rate_limit_drop_tip != "" else []
before = time.time()
# 触发插件事件
@@ -144,11 +144,10 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str, mes
mgr, config, launcher_type, launcher_id, sender_id)
# 限速等待时间
- if hasattr(config, "rate_limitation") and config.rate_limit_strategy == "wait":
+ if config.rate_limit_strategy == "wait":
time.sleep(ratelimit.get_rest_wait_time(session_name, time.time() - before))
- if hasattr(config, "rate_limitation"):
- ratelimit.add_usage(session_name)
+ ratelimit.add_usage(session_name)
if reply is not None and len(reply) > 0 and (type(reply[0]) == str or type(reply[0]) == mirai.Plain):
if type(reply[0]) == mirai.Plain:
diff --git a/pkg/qqbot/ratelimit.py b/pkg/qqbot/ratelimit.py
index 2a759b6e..6683f990 100644
--- a/pkg/qqbot/ratelimit.py
+++ b/pkg/qqbot/ratelimit.py
@@ -58,9 +58,6 @@ def get_rest_wait_time(session_name: str, spent: float) -> float:
import config
- if not hasattr(config, 'rate_limitation'):
- return 0
-
min_seconds_per_round = 60.0 / config.rate_limitation
if session_name in __crt_minute_usage__:
@@ -75,9 +72,6 @@ def is_reach_limit(session_name: str) -> bool:
import config
- if not hasattr(config, 'rate_limitation'):
- return False
-
if session_name in __crt_minute_usage__:
return __crt_minute_usage__[session_name] >= config.rate_limitation
else:
diff --git a/pkg/utils/text2img.py b/pkg/utils/text2img.py
index b21f72ec..68df0d68 100644
--- a/pkg/utils/text2img.py
+++ b/pkg/utils/text2img.py
@@ -8,8 +8,8 @@ import traceback
text_render_font: ImageFont = None
-if hasattr(config, "blob_message_strategy") and config.blob_message_strategy == "image": # 仅在启用了image时才加载字体
- use_font = config.font_path if hasattr(config, "font_path") else ""
+if config.blob_message_strategy == "image": # 仅在启用了image时才加载字体
+ use_font = config.font_path
try:
# 检查是否存在
diff --git a/tests/gpt3_test.py b/tests/gpt3_test.py
new file mode 100644
index 00000000..0b586a7a
--- /dev/null
+++ b/tests/gpt3_test.py
@@ -0,0 +1,14 @@
+import openai
+
+openai.api_key = "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"
+
+resp = openai.Completion.create(
+ prompt="user:你好,今天天气怎么样?\nbot:",
+ model="text-davinci-003",
+ temperature=0.9, # 数值越低得到的回答越理性,取值范围[0, 1]
+ top_p=1, # 生成的文本的文本与要求的符合度, 取值范围[0, 1]
+ frequency_penalty=0.2,
+ presence_penalty=1.0,
+)
+
+print(resp)
\ No newline at end of file
From b40d6397859129e122c8bf4c1b23aebe931a401e Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 21:31:56 +0800
Subject: [PATCH 42/46] =?UTF-8?q?feat:=20=E5=BF=BD=E7=95=A5=E7=AC=AC?=
=?UTF-8?q?=E5=9B=9B=E4=BD=8D=E7=89=88=E6=9C=AC=E5=8F=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/utils/updater.py | 33 ++++++++++++++++++++++++++++-----
1 file changed, 28 insertions(+), 5 deletions(-)
diff --git a/pkg/utils/updater.py b/pkg/utils/updater.py
index 57f81a9a..8e995ef2 100644
--- a/pkg/utils/updater.py
+++ b/pkg/utils/updater.py
@@ -34,6 +34,23 @@ def pull_latest(repo_path: str) -> bool:
return True
+def is_newer_ignored_bugfix_ver(new_tag: str, old_tag: str):
+ """判断版本是否更新,忽略第四位版本"""
+ if new_tag == old_tag:
+ return False
+
+ new_tag = new_tag.split(".")
+ old_tag = old_tag.split(".")
+ if len(new_tag) < 4:
+ return True
+
+ # 合成前三段,判断是否相同
+ new_tag = ".".join(new_tag[:3])
+ old_tag = ".".join(old_tag[:3])
+
+ return new_tag != old_tag
+
+
def get_release_list() -> list:
"""获取发行列表"""
rls_list_resp = requests.get(
@@ -64,8 +81,12 @@ def update_all(cli: bool = False) -> bool:
latest_rls = {}
rls_notes = []
+ latest_tag_name = ""
for rls in rls_list:
rls_notes.append(rls['name']) # 使用发行名称作为note
+ if latest_tag_name == "":
+ latest_tag_name = rls['tag_name']
+
if rls['tag_name'] == current_tag:
break
@@ -76,7 +97,7 @@ def update_all(cli: bool = False) -> bool:
else:
print("更新日志: {}".format(rls_notes))
- if latest_rls == {}: # 没有新版本
+ if latest_rls == {} and not is_newer_ignored_bugfix_ver(latest_tag_name, current_tag): # 没有新版本
return False
# 下载最新版本的zip到temp目录
@@ -227,11 +248,13 @@ def is_new_version_available() -> bool:
current_tag = get_current_tag()
# 检查是否有新版本
+ latest_tag_name = ""
for rls in rls_list:
- if rls['tag_name'] == current_tag:
- return False
- else:
- return True
+ if latest_tag_name == "":
+ latest_tag_name = rls['tag_name']
+ break
+
+ return is_newer_ignored_bugfix_ver(latest_tag_name, current_tag)
def get_rls_notes() -> list:
From d81b457bbadd80fbff59bf29003593bcf9b14a9b Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 21:34:30 +0800
Subject: [PATCH 43/46] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=AE=8C?=
=?UTF-8?q?=E6=88=90=E5=90=8E=E4=B8=8D=E5=B1=95=E7=A4=BA=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E5=89=8D=E7=89=88=E6=9C=AC=E7=9A=84=E6=9B=B4=E6=96=B0=E6=97=A5?=
=?UTF-8?q?=E5=BF=97=20(#340)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pkg/utils/updater.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pkg/utils/updater.py b/pkg/utils/updater.py
index 8e995ef2..909adeb6 100644
--- a/pkg/utils/updater.py
+++ b/pkg/utils/updater.py
@@ -171,9 +171,9 @@ def update_all(cli: bool = False) -> bool:
# 通知管理员
if not cli:
import pkg.utils.context
- pkg.utils.context.get_qqbot_manager().notify_admin("已更新到最新版本: {}\n更新日志:\n{}\n新功能通常可以在config-template.py中看到,完整的更新日志请前往 https://github.com/RockChinQ/QChatGPT/releases 查看".format(current_tag, "\n".join(rls_notes)))
+ pkg.utils.context.get_qqbot_manager().notify_admin("已更新到最新版本: {}\n更新日志:\n{}\n完整的更新日志请前往 https://github.com/RockChinQ/QChatGPT/releases 查看".format(current_tag, "\n".join(rls_notes[:-1])))
else:
- print("已更新到最新版本: {}\n更新日志:\n{}\n新功能通常可以在config-template.py中看到,完整的更新日志请前往 https://github.com/RockChinQ/QChatGPT/releases 查看".format(current_tag, "\n".join(rls_notes)))
+ print("已更新到最新版本: {}\n更新日志:\n{}\n完整的更新日志请前往 https://github.com/RockChinQ/QChatGPT/releases 查看".format(current_tag, "\n".join(rls_notes[:-1])))
return True
From bd9a523233ffe73a16c09239662b014613dff85a Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Thu, 6 Apr 2023 21:37:51 +0800
Subject: [PATCH 44/46] Release v2.3.5
---
pkg/utils/constants.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pkg/utils/constants.py b/pkg/utils/constants.py
index 15267db8..2af79df9 100644
--- a/pkg/utils/constants.py
+++ b/pkg/utils/constants.py
@@ -2,4 +2,4 @@ alipay_qr_b64 = """/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAA
wechat_qr_b64 = """iVBORw0KGgoAAAANSUhEUgAAASwAAAFSCAYAAABIVeLEAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAB5iUlEQVR4Xu2dB2Ac1dHH5/qdumTJvVdsMJjimI7BQAi99wChl5jQe/sIhN4CgdAChB56gNB7sTE2uIAx2Ma4SrZ61/Vv/rO70up0p2LLts6eH6xv9+3u273T7f9m5s17zxFnSFEUJQ1wmq+Koig9HhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUsRVHSBhUspduorq6mc889l958802zpGNef/11uuCCC6i8vNwsUZTU6MzPSrdx9NFH00svvSTr0WiUnM6Ofw8dDoe8HnPMMfTCCy/IuqKkQi0sJSXLli2jSy65hIqLi82S9olEIuaacW5HrFq1ylwj6uzvJs656qqraPny5WaJsjmhgqWkZL/99qO77rqLJk+ebJa0T//+/c016pSLV1paaq4RFRUVmWvtM378eLrlllvk3pTNDxUsJSXbbbedvE6aNEleO2K33XYz14jq6urMtdRUVVWZa0Tbb7+9uZaalStXUkVFhax7vV55VTYvNIaltAusoM5aP2DPPfek3r1704svvmiWtM+BBx5IsViM3nrrrQ5jXk8//TSddNJJsn7llVfS3/72N1lXNh9UsDYzlixZQsOGDTO30guIFUQLzJo1q9kC7IilS5fSkCFDzC0lnVGXcDPizjvvpOHDh9PQoUPNkvTC3orYWbEaMGCAvN/77rvPLFHSGRWszQhYVwAWx/oEsabuBq2C4XBY1u2xso6wWiKt966kNypYmxGwsO6//36aN2+eWdL9HHLIITRw4EDJq+pOamtrzTWiE044wVzrGLzXf/zjH3TrrbeaJUo6ozEspVvJzs6WFkKPx0OhUMgs7R4QaK+pqREBUjZPVLCUbgV5Uj/88IOsI5HU5XLJejK+++47mj59Op1zzjnNGe+K0h7qEirdij15dM2aNeZacpB7dd5559Ff//pXs0RR2kcFK80pKysT6wStYVZQemOC/oQgLy+P+vXrJ+upyMjIkNfBgwfL68YG9wyLsLNdkZQNjwpWmvPFF1/IK1rDFi5cKOud5eWXX6apU6e26gO4rpx22mliWVVWVpolqamvr5fE1FNOOcUsWXcQN7vooouaO2F3ll9//VVGm0AS65dffmmWKj0NjWFtAlx88cViYeFB7SwIXufm5sr6qaeeSo8//rispzvHHXdcc75WV7/ayJyHiN58881midLTUMHajAkEAtTU1CTrsC5ycnJkPRW/+93v5IGeOXOmnLshQDrDTjvtJO7jjBkzzNLkoHUSrZQW+tXe9FCXcBMDD/UHH3xgbrXPvffea64RXXHFFeZacr755hv69ttvaf78+fT555+bpck5//zzxeL78ccfzZK154EHHpB6cO0PP/zQLE0OBg+0eOihh8y19nn//fc7FEKlBwELS9k0WLZsGUwKWVi0zNL2sY7HEolEzNLkHHvssfGDDjooHg6HzZK2xGKx5vrOPvtss3TtGT9+fHN9JSUlZmlyJk2aJMc5nU6zpH2uu+665rpXrlxplio9GRWsTYiqqqrmB3Du3Llmaftcc801zefgAe4O2MKKjxo1qsN7wP12hHVvffr0MUtSA9E555xz4rNmzTJLUrNgwYLmurGw62nuUXoyKlibGNXV1R1aIonYH9wNxa233irXO/roo82Strz77rvN9/WXv/zFLO0eIIBW3TfccINZqvR0NOieRqDJ/dFHH5UMcazn5+fTEUcc0ekB9lJx5plnSr0AMSMkc6YCOUoPP/ywnGNPEu0qW221VXOMK9VX8OSTT6Z///vfsv7OO+902yijSOXA+wRjx46VuJwdDF3z/PPPS0sq8rK22WYbYvfW3KtsVCBYSs/nyiuvbLYIEpdhw4bFf/31V/PIFp544on4vvvuG//pp5/MkuRUVlY215WdnW2WJodFSo7bfvvtzZK1o1evXlJPe64ei0nzfTU0NJilbZk8ebIcM3v2bLMkNdOnT2+uE0tZWZm5Jx5fuHBhfMiQIa3225fucpmVtUcFKw2A6FgPjdfrje+6665xtjYkTmR/oL7//nvzDAOrHOd3BALq1vEQulSwRSfHnH766WZJ1wkGg83XGjdunFnaFraw5JjDDjvMLGkLhMyq68YbbzRLU+PxeJqP//vf/26W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"""
-semantic_version = "v2.3.4"
+semantic_version = "v2.3.5"
From 29a7dccef409a3d1dcf8f8a64daa6e11b9911e80 Mon Sep 17 00:00:00 2001
From: GitHub Actions
Date: Fri, 7 Apr 2023 08:34:23 +0000
Subject: [PATCH 45/46] Update override-all.json
---
override-all.json | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/override-all.json b/override-all.json
index 32f7aaac..b0269b01 100644
--- a/override-all.json
+++ b/override-all.json
@@ -63,14 +63,16 @@
"font_path": "",
"retry_times": 3,
"hide_exce_info_to_user": false,
+ "alter_tip_message": "出错了,请稍后再试",
"sys_pool_num": 8,
"admin_pool_num": 2,
"user_pool_num": 6,
"session_expire_time": 1200,
"rate_limitation": 60,
"rate_limit_strategy": "wait",
+ "rate_limit_drop_tip": "本分钟对话次数超过限速次数,此对话被丢弃",
"upgrade_dependencies": true,
"report_usage": true,
"logging_level": 20,
- "help_message": "此机器人通过调用大型语言模型生成回复,不具有情感。\n你可以用自然语言与其交流,回复的消息中[GPT]开头的为模型生成的语言,[bot]开头的为程序提示。\n欢迎到github.com/RockChinQ/QChatGPT 给个star"
+ "help_message": "此机器人通过调用OpenAI的GPT-3大型语言模型生成回复,不具有情感。\n你可以用自然语言与其交流,回复的消息中[GPT]开头的为模型生成的语言,[bot]开头的为程序提示。\n了解此项目请找QQ 1010553892 联系作者\n请不要用其生成整篇文章或大段代码,因为每次只会向模型提交少部分文字,生成大部分文字会产生偏题、前后矛盾等问题\n每次会话最后一次交互后20分钟后会自动结束,结束后将开启新会话,如需继续前一次会话请发送 !last 重新开启\n欢迎到github.com/RockChinQ/QChatGPT 给个star\n\n指令帮助信息请查看: https://github.com/RockChinQ/QChatGPT/wiki/%E5%8A%9F%E8%83%BD%E4%BD%BF%E7%94%A8#%E6%9C%BA%E5%99%A8%E4%BA%BA%E6%8C%87%E4%BB%A4"
}
\ No newline at end of file
From 6068ab710063956d25956f99bf03be7bf82743ac Mon Sep 17 00:00:00 2001
From: Rock Chin <1010553892@qq.com>
Date: Fri, 7 Apr 2023 16:39:25 +0800
Subject: [PATCH 46/46] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9help=5Fmessage?=
=?UTF-8?q?=E4=B8=BA=E4=B8=BB=E7=BA=BF=E7=9A=84=E5=86=85=E5=AE=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
tips-custom-template.py | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/tips-custom-template.py b/tips-custom-template.py
index f2ebe57c..4f9c835a 100644
--- a/tips-custom-template.py
+++ b/tips-custom-template.py
@@ -18,15 +18,9 @@ rate_limit_drop_tip = "本分钟对话次数超过限速次数,此对话被丢
# 指令!help帮助消息
# config.py,line:279
# pkg/qqbot/process.py,line:122
-help_message = """【可自定义】
-此机器人通过调用OpenAI的GPT-3大型语言模型生成回复,不具有情感。
+help_message = """此机器人通过调用大型语言模型生成回复,不具有情感。
你可以用自然语言与其交流,回复的消息中[GPT]开头的为模型生成的语言,[bot]开头的为程序提示。
-了解此项目请找QQ 1010553892 联系作者
-请不要用其生成整篇文章或大段代码,因为每次只会向模型提交少部分文字,生成大部分文字会产生偏题、前后矛盾等问题
-每次会话最后一次交互后{}分钟后会自动结束,结束后将开启新会话,如需继续前一次会话请发送 !last 重新开启
-欢迎到github.com/RockChinQ/QChatGPT 给个star
-指令帮助信息请查看: https://github.com/RockChinQ/QChatGPT/wiki/%E5%8A%9F%E8%83%BD%E4%BD%BF%E7%94%A8#%E6%9C%BA%E5%99%A8%E4%BA%BA%E6%8C%87%E4%BB%A4""".format(
- config.session_expire_time // 60)
+欢迎到github.com/RockChinQ/QChatGPT 给个star"""
# ---原config.py结束--