lintonxue00 commited on
Commit
9806997
1 Parent(s): cfefd52

Upload config.py

Browse files
Files changed (1) hide show
  1. config.py +163 -26
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
- driver = get_driver()
15
- global_config = driver.config
16
- config = Config.parse_obj(global_config)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- '__DEBUG__': False, # 是否启用debug模式
 
 
108
  }
109
 
110
- config_path = config.ng_config_path
 
 
111
 
112
  # 检查config文件夹是否存在 不存在则创建
113
  if not Path("config").exists():
114
  Path("config").mkdir()
115
 
116
- if config.ng_dev_mode: # 开发模式下不读取原配置文件,直接使用模板覆盖原配置文件
 
 
 
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
- config = yaml.load(f, Loader=yaml.FullLoader)
130
- # 对比配置模板和配置文件
131
- for k, v in CONFIG_TEMPLATE.items():
132
- if k not in config:
133
- config[k] = v
134
- logger.info(f'Naturel GPT 配置文件缺少 {k} 项,已自动补充')
135
- # 将配置文件内容写入config
136
- for k, v in config.items():
137
- setattr(Config, k, v)
138
-
139
- # 检查数据文件夹目录和拓展目录是否存在 不存在则创建
140
- if not Path(config['NG_DATA_PATH'][:-1]).exists():
141
- Path(config['NG_DATA_PATH'][:-1]).mkdir(parents=True)
142
- if not Path(config['NG_EXT_PATH'][:-1]).exists():
143
- Path(config['NG_EXT_PATH'][:-1]).mkdir(parents=True)
 
 
 
 
 
 
 
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 配置文件加载成功')