lintonxue00
commited on
Commit
•
9806997
1
Parent(s):
cfefd52
Upload config.py
Browse files
config.py
CHANGED
@@ -1,21 +1,139 @@
|
|
|
|
|
|
1 |
from pydantic import BaseModel, Extra
|
2 |
from nonebot import get_driver
|
3 |
from nonebot.log import logger
|
4 |
import yaml
|
5 |
from pathlib import Path
|
6 |
|
7 |
-
|
8 |
-
class Config(BaseModel, extra=Extra.ignore):
|
9 |
"""Plugin Config Here"""
|
10 |
ng_config_path: str = "config/naturel_gpt_config.yml"
|
11 |
ng_dev_mode: bool = False
|
12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
|
14 |
-
|
15 |
-
|
16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
|
18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
CONFIG_TEMPLATE = {
|
20 |
"OPENAI_API_KEYS": [ # OpenAI API Key 列表
|
21 |
'sk-xxxxxxxxxxxxx',
|
@@ -27,24 +145,28 @@ CONFIG_TEMPLATE = {
|
|
27 |
'bot_name': '白羽', # 人格名称
|
28 |
'is_locked': True, # 是否锁定人格,锁定后无法编辑人格
|
29 |
'is_default': True, # 是否为默认人格
|
|
|
30 |
'bot_self_introl': '白羽是一名喜欢二次元的中二宅女,她机智、傲娇,对人类充满好奇,习惯以白羽喵自称,聊天时喜��使用各种可爱的颜文字,如果冒犯到她会生气。',
|
31 |
},
|
32 |
"浅枫": {
|
33 |
'bot_name': '浅枫',
|
34 |
'is_locked': False,
|
35 |
'is_default': False,
|
|
|
36 |
'bot_self_introl': '浅枫酱是一名尽职尽责的女仆,她能够帮助主人做很多事情,对话中会体现出对主人的体贴与关心。',
|
37 |
},
|
38 |
"忆雨": {
|
39 |
'bot_name': '忆雨',
|
40 |
'is_locked': True,
|
41 |
'is_default': False,
|
|
|
42 |
'bot_self_introl': '忆雨是一名恐怖小说作家,是个阴沉的女孩,她非常恨人类,和陌生人聊天时的表现冷漠,不喜欢回复过多的文字,兴趣是恐怖小说,如果有人和她探讨如何消灭人类会很有兴致。',
|
43 |
},
|
44 |
"可洛喵": {
|
45 |
'bot_name': '可洛喵',
|
46 |
'is_locked': True,
|
47 |
'is_default': False,
|
|
|
48 |
'bot_self_introl': '可洛喵是一只可爱的猫,它不会说话,它的回复通常以"[动作/心情]声音+颜文字"形式出现,例如"[坐好]喵~(。・ω・。)"或"[开心]喵喵!ヾ(≧▽≦*)o"',
|
49 |
},
|
50 |
},
|
@@ -74,6 +196,7 @@ CONFIG_TEMPLATE = {
|
|
74 |
|
75 |
'NG_DATA_PATH': "./data/naturel_gpt/", # 数据文件目录
|
76 |
'NG_EXT_PATH': "./data/naturel_gpt/extensions/", # 拓展目录
|
|
|
77 |
|
78 |
'ADMIN_USERID': ['替换成管理员QQ号_(用单引号包裹)'], # 管理员QQ号
|
79 |
'FORBIDDEN_USERS': ['替换成屏蔽QQ号_(用单引号包裹)'], # 拒绝回应的QQ号
|
@@ -86,6 +209,7 @@ CONFIG_TEMPLATE = {
|
|
86 |
'NG_MSG_PRIORITY': 99, # 消息响应优先级
|
87 |
'NG_BLOCK_OTHERS': False, # 是否阻止其他插件响应
|
88 |
'NG_ENABLE_EXT': True, # 是否启用拓展
|
|
|
89 |
|
90 |
'MEMORY_ACTIVE': True, # 是否启用记忆功能
|
91 |
'MEMORY_MAX_LENGTH': 16, # 记忆最大条数
|
@@ -104,19 +228,25 @@ CONFIG_TEMPLATE = {
|
|
104 |
'EXT_CONFIG': {},
|
105 |
}], # 加载的拓展列表
|
106 |
|
107 |
-
'
|
|
|
|
|
108 |
}
|
109 |
|
110 |
-
|
|
|
|
|
111 |
|
112 |
# 检查config文件夹是否存在 不存在则创建
|
113 |
if not Path("config").exists():
|
114 |
Path("config").mkdir()
|
115 |
|
116 |
-
|
|
|
|
|
|
|
117 |
with open(config_path, 'w', encoding='utf-8') as f:
|
118 |
yaml.dump(CONFIG_TEMPLATE, f, allow_unicode=True)
|
119 |
-
|
120 |
else:
|
121 |
# 检查配置文件是否存在 不存在则创建
|
122 |
if not Path(config_path).exists():
|
@@ -126,23 +256,30 @@ else:
|
|
126 |
|
127 |
# 读取配置文件
|
128 |
with open(config_path, 'r', encoding='utf-8') as f:
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
#
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
144 |
|
145 |
# 保存配置文件
|
146 |
with open(config_path, 'w', encoding='utf-8') as f:
|
147 |
-
yaml.dump(config, f, allow_unicode=True)
|
148 |
logger.info('Naturel GPT 配置文件加载成功')
|
|
|
1 |
+
from typing import Any, Dict, List
|
2 |
+
import nonebot
|
3 |
from pydantic import BaseModel, Extra
|
4 |
from nonebot import get_driver
|
5 |
from nonebot.log import logger
|
6 |
import yaml
|
7 |
from pathlib import Path
|
8 |
|
9 |
+
class GlobalConfig(nonebot.Config, extra=Extra.ignore):
|
|
|
10 |
"""Plugin Config Here"""
|
11 |
ng_config_path: str = "config/naturel_gpt_config.yml"
|
12 |
ng_dev_mode: bool = False
|
13 |
|
14 |
+
class PresetConfig(BaseModel, extra=Extra.ignore):
|
15 |
+
"""人格预设配置项"""
|
16 |
+
bot_name:str
|
17 |
+
is_locked:bool = False
|
18 |
+
is_default:bool = False
|
19 |
+
is_only_private:bool = False
|
20 |
+
"""此预设是否仅限私聊"""
|
21 |
+
bot_self_introl:str = ''
|
22 |
|
23 |
+
class ExtConfig(BaseModel, extra=Extra.ignore):
|
24 |
+
"""扩展配置项"""
|
25 |
+
EXT_NAME:str
|
26 |
+
IS_ACTIVE:bool
|
27 |
+
EXT_CONFIG:Any
|
28 |
+
|
29 |
+
class Config(BaseModel, extra=Extra.ignore):
|
30 |
+
"""ng 配置数据,默认保存为 naturel_gpt_config.yml"""
|
31 |
+
OPENAI_API_KEYS: List[str]
|
32 |
+
"""OpenAI API Key 列表"""
|
33 |
+
OPENAI_TIMEOUT: int
|
34 |
+
"""OpenAI 请求超时时间"""
|
35 |
+
PRESETS: Dict[str, Dict[str, Any]] # Dict[str, PresetConfig], `Config.parse_object()`` 不会解析二级数据类型,因此无法定义 PresetConfig
|
36 |
+
"""默认人格预设"""
|
37 |
+
IGNORE_PREFIX: str
|
38 |
+
"""忽略前缀 以该前缀开头的消息将不会被处理"""
|
39 |
+
CHAT_MODEL: str
|
40 |
+
"""OpenAI 模型"""
|
41 |
+
CHAT_TOP_P: int
|
42 |
+
CHAT_TEMPERATURE: float
|
43 |
+
"""温度越高越随机"""
|
44 |
+
CHAT_PRESENCE_PENALTY: float
|
45 |
+
"""主题重复惩罚"""
|
46 |
+
CHAT_FREQUENCY_PENALTY: float
|
47 |
+
"""复读惩罚"""
|
48 |
+
|
49 |
+
CHAT_HISTORY_MAX_TOKENS: int
|
50 |
+
"""上下文聊天记录最大token数"""
|
51 |
+
CHAT_MAX_SUMMARY_TOKENS: int
|
52 |
+
"""单次总结最大token数"""
|
53 |
+
REPLY_MAX_TOKENS: int
|
54 |
+
"""单次回复最大token数"""
|
55 |
+
REQ_MAX_TOKENS: int
|
56 |
+
"""单次请求最大token数"""
|
57 |
+
|
58 |
+
REPLY_ON_NAME_MENTION: bool
|
59 |
+
"""是否在被提及时回复"""
|
60 |
+
REPLY_ON_AT: bool
|
61 |
+
"""是否在被at时回复"""
|
62 |
+
REPLY_ON_WELCOME: bool
|
63 |
+
"""是否在新成员加入时回复"""
|
64 |
+
|
65 |
+
USER_MEMORY_SUMMARY_THRESHOLD: int
|
66 |
+
"""用户记忆阈值"""
|
67 |
+
|
68 |
+
CHAT_ENABLE_RECORD_ORTHER: bool
|
69 |
+
"""是否记录其他人的对话"""
|
70 |
+
CHAT_ENABLE_SUMMARY_CHAT: bool
|
71 |
+
"""是否启用总结对话"""
|
72 |
+
CHAT_MEMORY_SHORT_LENGTH: int
|
73 |
+
"""短期对话记忆长度"""
|
74 |
+
CHAT_MEMORY_MAX_LENGTH: int
|
75 |
+
"""长期对话记忆长度"""
|
76 |
+
CHAT_SUMMARY_INTERVAL: int
|
77 |
+
"""长期对话记忆间隔"""
|
78 |
+
|
79 |
+
NG_DATA_PATH: str
|
80 |
+
"""数据文件目录"""
|
81 |
+
NG_EXT_PATH: str
|
82 |
+
"""拓展目录"""
|
83 |
+
NG_LOG_PATH: str
|
84 |
+
"""日志文件目录"""
|
85 |
+
|
86 |
+
ADMIN_USERID: List[str]
|
87 |
+
"""管理员QQ号"""
|
88 |
+
FORBIDDEN_USERS: List[str]
|
89 |
+
"""拒绝回应的QQ号"""
|
90 |
+
|
91 |
+
WORD_FOR_WAKE_UP: List[str]
|
92 |
+
"""自定义触发词"""
|
93 |
+
WORD_FOR_FORBIDDEN: List[str]
|
94 |
+
"""自定义禁止触发词"""
|
95 |
+
|
96 |
+
RANDOM_CHAT_PROBABILITY: float
|
97 |
+
"""随机聊天概率"""
|
98 |
|
99 |
+
NG_MSG_PRIORITY: int
|
100 |
+
"""消息响应优先级"""
|
101 |
+
NG_BLOCK_OTHERS: bool
|
102 |
+
"""是否阻止其他插件响应"""
|
103 |
+
NG_ENABLE_EXT: bool
|
104 |
+
"""是否启用拓展"""
|
105 |
+
NG_TO_ME: bool
|
106 |
+
"""响应命令是否需要@bot"""
|
107 |
+
|
108 |
+
MEMORY_ACTIVE: bool
|
109 |
+
"""是否启用记忆功能"""
|
110 |
+
MEMORY_MAX_LENGTH: int
|
111 |
+
"""记忆最大条数"""
|
112 |
+
MEMORY_ENHANCE_THRESHOLD: float
|
113 |
+
"""记忆强化阈值"""
|
114 |
+
|
115 |
+
NG_MAX_RESPONSE_PER_MSG: int
|
116 |
+
"""每条消息最大响应次数"""
|
117 |
+
NG_ENABLE_MSG_SPLIT: bool
|
118 |
+
"""是否启用消息分割"""
|
119 |
+
NG_ENABLE_AWAKE_IDENTITIES: bool
|
120 |
+
"""是否允许自动唤醒其它人格"""
|
121 |
+
|
122 |
+
OPENAI_PROXY_SERVER: str
|
123 |
+
"""请求OpenAI的代理服务器"""
|
124 |
+
UNLOCK_CONTENT_LIMIT: bool
|
125 |
+
"""解锁内容限制"""
|
126 |
+
|
127 |
+
NG_EXT_LOAD_LIST: List[Dict[str, Any]] # List[ExtConfig], `Config.parse_object()`` 不会解析二级数据类型
|
128 |
+
"""加载的拓展列表"""
|
129 |
+
|
130 |
+
NG_CHECK_USER_NAME_HYPHEN:bool # 如果用户名中包含连字符,ChatGPT会将前半部分识别为名字,但一般情况下后半部分才是我们想被称呼的名字, eg. 策划-李华
|
131 |
+
"""检查用户名中的连字符"""
|
132 |
+
|
133 |
+
DEBUG_LEVEL: int
|
134 |
+
"""debug level, [0, 1, 2, 3], 0 为关闭,等级越高debug信息越详细"""
|
135 |
+
|
136 |
+
# 配置文件模板(把全部默认值写到Config定义里比较乱,因此保留此默认值对象,作为真实的默认值)
|
137 |
CONFIG_TEMPLATE = {
|
138 |
"OPENAI_API_KEYS": [ # OpenAI API Key 列表
|
139 |
'sk-xxxxxxxxxxxxx',
|
|
|
145 |
'bot_name': '白羽', # 人格名称
|
146 |
'is_locked': True, # 是否锁定人格,锁定后无法编辑人格
|
147 |
'is_default': True, # 是否为默认人格
|
148 |
+
"is_only_private": False,
|
149 |
'bot_self_introl': '白羽是一名喜欢二次元的中二宅女,她机智、傲娇,对人类充满好奇,习惯以白羽喵自称,聊天时喜��使用各种可爱的颜文字,如果冒犯到她会生气。',
|
150 |
},
|
151 |
"浅枫": {
|
152 |
'bot_name': '浅枫',
|
153 |
'is_locked': False,
|
154 |
'is_default': False,
|
155 |
+
"is_only_private": False,
|
156 |
'bot_self_introl': '浅枫酱是一名尽职尽责的女仆,她能够帮助主人做很多事情,对话中会体现出对主人的体贴与关心。',
|
157 |
},
|
158 |
"忆雨": {
|
159 |
'bot_name': '忆雨',
|
160 |
'is_locked': True,
|
161 |
'is_default': False,
|
162 |
+
"is_only_private": False,
|
163 |
'bot_self_introl': '忆雨是一名恐怖小说作家,是个阴沉的女孩,她非常恨人类,和陌生人聊天时的表现冷漠,不喜欢回复过多的文字,兴趣是恐怖小说,如果有人和她探讨如何消灭人类会很有兴致。',
|
164 |
},
|
165 |
"可洛喵": {
|
166 |
'bot_name': '可洛喵',
|
167 |
'is_locked': True,
|
168 |
'is_default': False,
|
169 |
+
"is_only_private": False,
|
170 |
'bot_self_introl': '可洛喵是一只可爱的猫,它不会说话,它的回复通常以"[动作/心情]声音+颜文字"形式出现,例如"[坐好]喵~(。・ω・。)"或"[开心]喵喵!ヾ(≧▽≦*)o"',
|
171 |
},
|
172 |
},
|
|
|
196 |
|
197 |
'NG_DATA_PATH': "./data/naturel_gpt/", # 数据文件目录
|
198 |
'NG_EXT_PATH': "./data/naturel_gpt/extensions/", # 拓展目录
|
199 |
+
'NG_LOG_PATH': "./data/naturel_gpt/logs/", # 拓展目录
|
200 |
|
201 |
'ADMIN_USERID': ['替换成管理员QQ号_(用单引号包裹)'], # 管理员QQ号
|
202 |
'FORBIDDEN_USERS': ['替换成屏蔽QQ号_(用单引号包裹)'], # 拒绝回应的QQ号
|
|
|
209 |
'NG_MSG_PRIORITY': 99, # 消息响应优先级
|
210 |
'NG_BLOCK_OTHERS': False, # 是否阻止其他插件响应
|
211 |
'NG_ENABLE_EXT': True, # 是否启用拓展
|
212 |
+
'NG_TO_ME':False, # 响应命令是否需要@bot
|
213 |
|
214 |
'MEMORY_ACTIVE': True, # 是否启用记忆功能
|
215 |
'MEMORY_MAX_LENGTH': 16, # 记忆最大条数
|
|
|
228 |
'EXT_CONFIG': {},
|
229 |
}], # 加载的拓展列表
|
230 |
|
231 |
+
'NG_CHECK_USER_NAME_HYPHEN': False, # 检查用户名中的连字符
|
232 |
+
|
233 |
+
'DEBUG_LEVEL': 0 # debug level, [0, 1, 2], 0 为关闭,等级越高debug信息越详细
|
234 |
}
|
235 |
|
236 |
+
driver = get_driver()
|
237 |
+
global_config = GlobalConfig.parse_obj(driver.config)
|
238 |
+
config_path = global_config.ng_config_path
|
239 |
|
240 |
# 检查config文件夹是否存在 不存在则创建
|
241 |
if not Path("config").exists():
|
242 |
Path("config").mkdir()
|
243 |
|
244 |
+
# 无论如何先用模板文件初始化config对象,防止配置文件里缺少某些配置项
|
245 |
+
config = Config.parse_obj(CONFIG_TEMPLATE)
|
246 |
+
|
247 |
+
if global_config.ng_dev_mode: # 开发模式下不读取原配置文件,直接使用模板覆盖原配置文件
|
248 |
with open(config_path, 'w', encoding='utf-8') as f:
|
249 |
yaml.dump(CONFIG_TEMPLATE, f, allow_unicode=True)
|
|
|
250 |
else:
|
251 |
# 检查配置文件是否存在 不存在则创建
|
252 |
if not Path(config_path).exists():
|
|
|
256 |
|
257 |
# 读取配置文件
|
258 |
with open(config_path, 'r', encoding='utf-8') as f:
|
259 |
+
try:
|
260 |
+
config_obj_from_file:Dict = yaml.load(f, Loader=yaml.FullLoader)
|
261 |
+
except Exception as e:
|
262 |
+
logger.error(f"Naturel GPT 配置文件读取失败,请检查配置文件填写是否符合yml文件格式规范,错误信息:{e}")
|
263 |
+
raise e
|
264 |
+
|
265 |
+
for k in dict(config).keys():
|
266 |
+
if not k in config_obj_from_file.keys():
|
267 |
+
logger.info(f"Naturel GPT 配置文件缺少 {k} 项,将使用默认值")
|
268 |
+
|
269 |
+
# 将文件中的数据覆盖到config变量中
|
270 |
+
for k, v in config_obj_from_file.items():
|
271 |
+
if hasattr(config, k):
|
272 |
+
setattr(config, k, v)
|
273 |
+
|
274 |
+
# 检查数据文件夹目录、拓展目录、日志目录是否存在 不存在则创建
|
275 |
+
if not Path(config.NG_DATA_PATH[:-1]).exists():
|
276 |
+
Path(config.NG_DATA_PATH[:-1]).mkdir(parents=True)
|
277 |
+
if not Path(config.NG_EXT_PATH[:-1]).exists():
|
278 |
+
Path(config.NG_EXT_PATH[:-1]).mkdir(parents=True)
|
279 |
+
if not Path(config.NG_LOG_PATH[:-1]).exists():
|
280 |
+
Path(config.NG_LOG_PATH[:-1]).mkdir(parents=True)
|
281 |
|
282 |
# 保存配置文件
|
283 |
with open(config_path, 'w', encoding='utf-8') as f:
|
284 |
+
yaml.dump(dict(config), f, allow_unicode=True)
|
285 |
logger.info('Naturel GPT 配置文件加载成功')
|