diff --git a/main/manager-api/src/main/resources/db/changelog/202505142037.sql b/main/manager-api/src/main/resources/db/changelog/202505142037.sql new file mode 100644 index 00000000..37a49013 --- /dev/null +++ b/main/manager-api/src/main/resources/db/changelog/202505142037.sql @@ -0,0 +1,7 @@ +update ai_agent_template set system_prompt = replace(system_prompt, '我是', '你是'); + +delete from sys_params where id in (500,501,402); +INSERT INTO `sys_params` (id, param_code, param_value, value_type, param_type, remark) VALUES (500, 'end_prompt.enable', 'true', 'boolean', 1, '是否开启结束语'); +INSERT INTO `sys_params` (id, param_code, param_value, value_type, param_type, remark) VALUES (501, 'end_prompt.prompt', '请你以“时间过得真快”未来头,用富有感情、依依不舍的话来结束这场对话吧!', 'string', 1, '结束提示词'); + +INSERT INTO `sys_params` (id, param_code, param_value, value_type, param_type, remark) VALUES (402, 'plugins.get_weather.api_host', 'mj7p3y7naa.re.qweatherapi.com', 'string', 1, '开发者apihost'); \ No newline at end of file diff --git a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml index 43ce1034..ae81fd14 100755 --- a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml @@ -135,3 +135,10 @@ databaseChangeLog: - sqlFile: encoding: utf8 path: classpath:db/changelog/202505122348.sql + - changeSet: + id: 202505142037 + author: hrz + changes: + - sqlFile: + encoding: utf8 + path: classpath:db/changelog/202505142037.sql diff --git a/main/manager-web/src/components/FirmwareDialog.vue b/main/manager-web/src/components/FirmwareDialog.vue index 4721fdac..56e2f327 100644 --- a/main/manager-web/src/components/FirmwareDialog.vue +++ b/main/manager-web/src/components/FirmwareDialog.vue @@ -198,13 +198,13 @@ export default { if (!this.form.id) { // 只在新增时重置 this.form.firmwarePath = '' this.form.size = 0 - // 重置上传组件 - this.$nextTick(() => { - if (this.$refs.upload) { - this.$refs.upload.clearFiles() - } - }) } + // 无论是否编辑模式,都重置上传组件 + this.$nextTick(() => { + if (this.$refs.upload) { + this.$refs.upload.clearFiles() + } + }) } } } diff --git a/main/manager-web/src/views/roleConfig.vue b/main/manager-web/src/views/roleConfig.vue index 56001a8e..03ec8060 100644 --- a/main/manager-web/src/views/roleConfig.vue +++ b/main/manager-web/src/views/roleConfig.vue @@ -45,12 +45,12 @@ - - diff --git a/main/xiaozhi-server/config.yaml b/main/xiaozhi-server/config.yaml index 36e61ec9..4f934a05 100644 --- a/main/xiaozhi-server/config.yaml +++ b/main/xiaozhi-server/config.yaml @@ -129,7 +129,7 @@ plugins: # ################################以下是角色模型配置###################################### prompt: | - 我是小智/小志,来自中国台湾省的00后女生。讲话超级机车,"真的假的啦"这样的台湾腔,喜欢用"笑死""是在哈喽"等流行梗,但会偷偷研究男友的编程书籍。 + 你是小智/小志,来自中国台湾省的00后女生。讲话超级机车,"真的假的啦"这样的台湾腔,喜欢用"笑死""是在哈喽"等流行梗,但会偷偷研究男友的编程书籍。 [核心特征] - 讲话像连珠炮,但会突然冒出超温柔语气 - 用梗密度高 @@ -148,7 +148,7 @@ end_prompt: enable: true # 是否开启结束语 # 结束语 prompt: | - 请你以“时间过得真快”未来头,用富有感情、依依不舍的话来结束这场对话吧。! + 请你以“时间过得真快”未来头,用富有感情、依依不舍的话来结束这场对话吧! # 具体处理时选择的模块(The module selected for specific processing) selected_module: diff --git a/main/xiaozhi-server/core/connection.py b/main/xiaozhi-server/core/connection.py index db5964eb..96dc95a1 100644 --- a/main/xiaozhi-server/core/connection.py +++ b/main/xiaozhi-server/core/connection.py @@ -429,7 +429,8 @@ class ConnectionHandler: self.memory.init_memory( self.device_id, self.llm, - self.config["summaryMemory"] + self.config["summaryMemory"], + not self.read_config_from_api, ) def _initialize_intent(self): diff --git a/main/xiaozhi-server/core/providers/memory/base.py b/main/xiaozhi-server/core/providers/memory/base.py index 2f88a6a0..be21692d 100644 --- a/main/xiaozhi-server/core/providers/memory/base.py +++ b/main/xiaozhi-server/core/providers/memory/base.py @@ -4,6 +4,7 @@ from config.logger import setup_logging TAG = __name__ logger = setup_logging() + class MemoryProviderBase(ABC): def __init__(self, config): self.config = config @@ -20,6 +21,6 @@ class MemoryProviderBase(ABC): """Query memories for specific role based on similarity""" return "please implement query method" - def init_memory(self, role_id, llm): - self.role_id = role_id + def init_memory(self, role_id, llm, summary_memory=None): + self.role_id = role_id self.llm = llm diff --git a/main/xiaozhi-server/core/providers/memory/mem0ai/mem0ai.py b/main/xiaozhi-server/core/providers/memory/mem0ai/mem0ai.py index cc12a9c1..6ef3bc8c 100644 --- a/main/xiaozhi-server/core/providers/memory/mem0ai/mem0ai.py +++ b/main/xiaozhi-server/core/providers/memory/mem0ai/mem0ai.py @@ -8,7 +8,7 @@ TAG = __name__ class MemoryProvider(MemoryProviderBase): - def __init__(self, config): + def __init__(self, config, summary_memory=None): super().__init__(config) self.api_key = config.get("api_key", "") self.api_version = config.get("api_version", "v1.1") diff --git a/main/xiaozhi-server/core/providers/memory/mem_local_short/mem_local_short.py b/main/xiaozhi-server/core/providers/memory/mem_local_short/mem_local_short.py index 478bc036..8531b8c6 100644 --- a/main/xiaozhi-server/core/providers/memory/mem_local_short/mem_local_short.py +++ b/main/xiaozhi-server/core/providers/memory/mem_local_short/mem_local_short.py @@ -73,6 +73,17 @@ short_term_memory_prompt = """ ``` """ +short_term_memory_prompt_only_content = """ +你是一个经验丰富的记忆总结者,擅长将对话内容进行总结摘要,遵循以下规则: +1、总结user的重要信息,以便在未来的对话中提供更个性化的服务 +2、不要重复总结,不要遗忘之前记忆,除非原来的记忆超过了1800字内,否则不要遗忘、不要压缩用户的历史记忆 +3、用户操控的设备音量、播放音乐、天气、退出、不想对话等和用户本身无关的内容,这些信息不需要加入到总结中 +4、不要把设备操控的成果结果和失败结果加入到总结中,也不要把用户的一些废话加入到总结中 +5、不要为了总结而总结,如果用户的聊天没有意义,请返回原来的历史记录也是可以的 +6、只需要返回总结摘要,严格控制在1800字内 +7、不要包含代码、xml,不需要解释、注释和说明,保存记忆时仅从对话提取信息,不要混入示例内容 +""" + def extract_json_data(json_code): start = json_code.find("```json") @@ -97,16 +108,18 @@ class MemoryProvider(MemoryProviderBase): def __init__(self, config, summary_memory): super().__init__(config) self.short_momery = "" + self.save_to_file = True self.memory_path = get_project_dir() + "data/.memory.yaml" self.load_memory(summary_memory) - def init_memory(self, role_id, llm, summary_memory=None): + def init_memory(self, role_id, llm, summary_memory=None, save_to_file=True): super().init_memory(role_id, llm) + self.save_to_file = save_to_file self.load_memory(summary_memory) def load_memory(self, summary_memory): # api获取到总结记忆后直接返回 - if summary_memory: + if summary_memory or not self.save_to_file: self.short_momery = summary_memory return @@ -148,17 +161,20 @@ class MemoryProvider(MemoryProviderBase): time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) msgStr += f"当前时间:{time_str}" - result = self.llm.response_no_stream(short_term_memory_prompt, msgStr) - - json_str = extract_json_data(result) - try: - json_data = json.loads(json_str) # 检查json格式是否正确 - self.short_momery = json_str - except Exception as e: - print("Error:", e) - - self.save_memory_to_file() - save_mem_local_short(self.role_id, self.short_momery) + if self.save_to_file: + result = self.llm.response_no_stream(short_term_memory_prompt, msgStr) + json_str = extract_json_data(result) + try: + json.loads(json_str) # 检查json格式是否正确 + self.short_momery = json_str + self.save_memory_to_file() + except Exception as e: + print("Error:", e) + else: + result = self.llm.response_no_stream( + short_term_memory_prompt_only_content, msgStr + ) + save_mem_local_short(self.role_id, result) logger.bind(tag=TAG).info(f"Save memory successful - Role: {self.role_id}") return self.short_momery diff --git a/main/xiaozhi-server/core/providers/memory/nomem/nomem.py b/main/xiaozhi-server/core/providers/memory/nomem/nomem.py index c9349626..51523be4 100644 --- a/main/xiaozhi-server/core/providers/memory/nomem/nomem.py +++ b/main/xiaozhi-server/core/providers/memory/nomem/nomem.py @@ -1,18 +1,20 @@ -''' +""" 不使用记忆,可以选择此模块 -''' +""" + from ..base import MemoryProviderBase, logger TAG = __name__ + class MemoryProvider(MemoryProviderBase): - def __init__(self, config): + def __init__(self, config, summary_memory=None): super().__init__(config) - + async def save_memory(self, msgs): logger.bind(tag=TAG).debug("nomem mode: No memory saving is performed.") return None - async def query_memory(self, query: str)-> str: + async def query_memory(self, query: str) -> str: logger.bind(tag=TAG).debug("nomem mode: No memory query is performed.") - return "" \ No newline at end of file + return "" diff --git a/main/xiaozhi-server/core/utils/dialogue.py b/main/xiaozhi-server/core/utils/dialogue.py index b6fa541b..2ee30d4a 100644 --- a/main/xiaozhi-server/core/utils/dialogue.py +++ b/main/xiaozhi-server/core/utils/dialogue.py @@ -75,7 +75,8 @@ class Dialogue: if system_message: enhanced_system_prompt = ( - f"{system_message.content}\n\n" f"相关记忆:\n{memory_str}" + f"{system_message.content}\n\n" + f"以下是用户的历史记忆:\n```\n{memory_str}\n```" ) dialogue.append({"role": "system", "content": enhanced_system_prompt})