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})