adjust:整理代码,仅添加json方式的prompt读取

This commit is contained in:
chordfish
2023-03-10 10:13:40 +08:00
parent 7477c7c67f
commit ac65d81ba1
4 changed files with 39 additions and 74 deletions

View File

@@ -79,17 +79,11 @@ default_prompt = {
"default": "如果我之后想获取帮助,请你说“输入!help获取帮助”",
}
# 实验性设置项
# JSON完整情景导入存放JSON的文件夹
full_prompt_dir = "scenario/"
# 实验性设置项: JSON完整情景导入
# 预设prompt模式
# 参考值旧版本方式default | 完整情景full_scenario
preset_mode = "default"
# 过滤AI脱离人设的消息
# 这类消息在对应情景json中设置将其替换为自定义消息以保持人格
filter_ai_warning = False
# 群内响应规则
# 符合此消息的群内消息即使不包含at机器人也会响应

View File

@@ -10,6 +10,10 @@ __prompts_from_files__ = {}
"""从文件中读取的情景预设值"""
import json
import logging
def read_prompt_from_file() -> str:
"""从文件读取预设值"""
# 读取prompts/目录下的所有文件,以文件名为键,文件内容为值
@@ -66,14 +70,38 @@ def set_to_default():
def get_prompt(name: str = None) -> str:
import config
preset_mode = config.preset_mode
"""获取预设值"""
if name is None:
name = get_current()
default_dict = get_prompt_dict()
# JSON预设方式
if preset_mode == 'full_scenario':
import os
# 整合路径获取json文件名
json_file = os.path.join(os.getcwd(), "scenario", name + '.json')
for key in default_dict:
if key.lower().startswith(name.lower()):
return default_dict[key]
logging.debug('try to load json: {}'.format(json_file))
raise KeyError("未找到情景预设: " + name)
try:
with open(json_file, 'r', encoding ='utf-8') as f:
json_content = json.load(f)
logging.debug('succeed to load json: {}'.format(json_file))
return json_content['prompt']
except FileNotFoundError:
raise KeyError("未找到Json情景预设: " + name)
# 默认预设方式
elif preset_mode == 'default':
default_dict = get_prompt_dict()
for key in default_dict:
if key.lower().startswith(name.lower()):
return default_dict[key], None, None
raise KeyError("未找到默认情景预设: " + name)

View File

@@ -128,52 +128,15 @@ class Session:
logging.debug('{},lock release successfully,{}'.format(self.name, self.response_lock))
# 从配置文件获取会话预设信息
def get_default_prompt(self, use_default: str = None, get_only = False):
def get_default_prompt(self, use_default: str = None):
config = pkg.utils.context.get_config()
import pkg.openai.dprompt as dprompt
if use_default is None:
use_default = dprompt.get_current()
current_default_prompt = \
[
{
'role': 'user',
'content': '如果我之后想获取帮助,请你说“输入!help获取帮助”'
}, {
'role': 'assistant',
'content': 'ok'
}
]
# 根据设置进行prompt预设模式
if config.preset_mode == "full_scenario":
import os
dir = os.path.join(os.getcwd(), config.full_prompt_dir)
json_file = os.path.join(dir, use_default) + '.json'
logging.debug("try to load json: {}".format(json_file))
try:
with open(json_file, 'r', encoding ='utf-8') as f:
json_content = json.load(f)
current_default_prompt = json_content['prompt']
if not get_only:
# 读取机器人名字,用于响应信息
self.bot_name = json_content['name']
# 过滤掉不符合人格的回复
self.bot_filter = json_content['filter']
logging.debug("first bot filter: {}".format(self.bot_filter))
except FileNotFoundError:
logging.info("couldn't find file {}".format(json_file))
else:
current_default_prompt = dprompt.get_prompt(use_default)
current_default_prompt = dprompt.get_prompt(use_default)
return current_default_prompt
@@ -228,7 +191,7 @@ class Session:
self.last_interact_timestamp = int(time.time())
# 触发插件事件
if self.prompt == self.get_default_prompt(get_only = True):
if self.prompt == self.get_default_prompt():
args = {
'session_name': self.name,
'session': self,
@@ -258,18 +221,6 @@ class Session:
del (res_ans_spt[0])
res_ans = '\n\n'.join(res_ans_spt)
# 检测是否包含ai人格否定
if config.filter_ai_warning and self.bot_filter:
import re
match = re.search(self.bot_filter['reg'], res_ans)
logging.debug(self.bot_filter)
logging.debug(res_ans)
if match:
logging.debug('回复:{} 检测到人格否定,替换中。。'.format(res_ans))
res_ans = self.bot_filter['replace']
logging.debug('替换为: {}'.format(res_ans))
# 将此次对话的双方内容加入到prompt中
self.prompt.append({'role': 'user', 'content': text})
@@ -323,7 +274,7 @@ class Session:
# 持久化session
def persistence(self):
if self.prompt == self.get_default_prompt(get_only = True):
if self.prompt == self.get_default_prompt():
return
db_inst = pkg.utils.context.get_database_manager()

View File

@@ -27,15 +27,7 @@ def check_response_rule(text: str, event):
config = pkg.utils.context.get_config()
if not hasattr(config, 'response_rules'):
return False, ''
bot_name = pkg.openai.session.get_session('group_{}'.format(event.group.id)).bot_name
logging.debug(bot_name)
# 检查情景json自带的名字
if bot_name:
import re
if re.search(bot_name, text):
return True, text
rules = config.response_rules
# 检查前缀匹配
if 'prefix' in rules: