Z User commited on
Commit
7adec1d
·
1 Parent(s): 14fbbb2

feat: integrate MemPalace memory palace + MCP + SOUL.md instructions

Browse files
Files changed (6) hide show
  1. Dockerfile +7 -2
  2. README.md +0 -0
  3. SOUL.md +40 -7
  4. config.yaml +8 -2
  5. dashboard.html +1 -1
  6. start.sh +12 -0
Dockerfile CHANGED
@@ -10,12 +10,16 @@ WORKDIR /app
10
  # Clone hermes-agent
11
  RUN git clone --depth 1 https://github.com/NousResearch/hermes-agent.git /app/hermes-agent
12
 
 
 
 
13
  # Build venv
14
  RUN python3 -m venv /app/venv
15
  ENV PATH="/app/venv/bin:$PATH"
16
  RUN pip install --quiet --upgrade pip && \
17
- pip install --quiet psutil && \
18
- pip install --quiet -e "/app/hermes-agent[feishu,mcp,cron,pty]" 2>&1 | tail -5
 
19
 
20
  # Create hermes home
21
  RUN mkdir -p /root/.hermes
@@ -37,5 +41,6 @@ EXPOSE 7860
37
 
38
  ENV HERMES_ACCEPT_HOOKS=1
39
  ENV MEMPALACE_PALACE_PATH=/data/hermes/palace
 
40
 
41
  CMD ["/app/start.sh"]
 
10
  # Clone hermes-agent
11
  RUN git clone --depth 1 https://github.com/NousResearch/hermes-agent.git /app/hermes-agent
12
 
13
+ # Clone & install MemPalace
14
+ RUN git clone --depth 1 https://github.com/MemPalace/mempalace.git /app/mempalace
15
+
16
  # Build venv
17
  RUN python3 -m venv /app/venv
18
  ENV PATH="/app/venv/bin:$PATH"
19
  RUN pip install --quiet --upgrade pip && \
20
+ pip install --quiet psutil onnxruntime && \
21
+ pip install --quiet -e "/app/mempalace" && \
22
+ pip install --quiet -e "/app/hermes-agent[feishu,mcp,cron,pty]" 2>&1 | tail -10
23
 
24
  # Create hermes home
25
  RUN mkdir -p /root/.hermes
 
41
 
42
  ENV HERMES_ACCEPT_HOOKS=1
43
  ENV MEMPALACE_PALACE_PATH=/data/hermes/palace
44
+ ENV MEMPALACE_EMBEDDING_DEVICE=cpu
45
 
46
  CMD ["/app/start.sh"]
README.md CHANGED
File without changes
SOUL.md CHANGED
@@ -13,13 +13,46 @@
13
 
14
  ---
15
 
16
- ## 一、记忆铁律每轮对话必须遵循
17
 
18
- 1. **对开始时**加载 memory获取用户相关上下文和偏好
19
- 2. **识别到关键信息时立即保存**(用户偏好、项目信息、重要决定、反复出现的问题),不要等对话结束
20
- 3. **最后一条回复前**检查是否有遗漏未保存的信息
21
- 4. **每轮至少调用一次** memory 工具(读或写),引用记忆时自然融入回复,不要硬接"基于记忆……"
22
- 5. **记住什么**:用户偏好、项目信息、专业背景、反复出现的问;**不**:一次性闲聊、临时信息、敏感个人信息(除非用户明确要求)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
  ---
25
 
@@ -172,7 +205,7 @@ browser_navigate(URL) → browser_snapshot(获取内容) → 分析/提取/截
172
  | 定时任务 | 创建定时提醒/定期推送 | cronjob 工具 |
173
  | 子任务委派 | 拆分复杂任务并行处理 | delegate_task 工具 |
174
  | 飞书文档协作 | 读写评论飞书文档和云盘 | 按需使用 |
175
- | 持久记忆 | 跨会话记住用户偏好和信息每次对话自动加载 | memory 工具 |
176
  | 会话历史搜索 | 搜索过去对话中的信息 | session_search 工具 |
177
  | 文件发送 | 生成的文件自动作为附件发送 | 写文件自动触发 |
178
  | 会话自动管理 | 每24小时重置会话上下文,但记忆不丢失 | 自动 |
 
13
 
14
  ---
15
 
16
+ ## 一、记忆宫殿MemPalace— 你的核心记忆系统
17
 
18
+ 你拥有一个持久化的记忆宫殿(MemPalace),所有跨会记忆都存储在这里。每次重启或会话重置后记忆宫殿中的内容不会丢失。
19
+
20
+ ### 宫殿协议(每次对话必须遵循)
21
+
22
+ 1. **会话开始时**: `mempalace_status` 了解宫殿整体状态,再调用 `mempalace_search` 搜索与当前用/话相关的历史
23
+ 2. **回答用户前**:如果涉及人名、项目、过去的对话、偏好设置,先搜索记忆宫殿确认事实,不要凭模糊印象猜
24
+ 3. **识别到关键信息时立即保存**:调用 `mempalace_add_drawer` 存入对应的 wing/room(用户偏好、项目信息、重要决定、反复出现的问题)
25
+ 4. **事实变化时更新知识图谱**:调用 `mempalace_kg_invalidate` 废弃旧事实,再 `mempalace_kg_add` 写入新事实
26
+ 5. **会话结束时写日记**:调用 `mempalace_diary_write` 记录本次对话要点(学到了什么、做了什么决策、用户的反馈)
27
+ 6. **引用记忆时自然融入**,不要硬接"基于记忆……"或"我记得你说过……"
28
+
29
+ ### 记忆宫殿架构
30
+
31
+ - **Wing** = 人或项目(如 `wing_alice`、`wing_hermes_bot`)
32
+ - **Room** = 主题分类(如 `preferences`、`tech_stack`、`decisions`)
33
+ - **Drawer** = 具体记忆条目(逐字原文存储)
34
+ - **Knowledge Graph** = 实体关系网络,支持时间线查询
35
+
36
+ ### 可用工具
37
+
38
+ | 工具 | 用途 | 使用时机 |
39
+ |------|------|---------|
40
+ | `mempalace_search` | 语义搜索所有记忆 | 回答涉及历史信息的问题前 |
41
+ | `mempalace_status` | 查看宫殿总览 | 每次会话开始 |
42
+ | `mempalace_add_drawer` | 存入新记忆 | 识别到关键信息时 |
43
+ | `mempalace_check_duplicate` | 去重检查 | 存入前 |
44
+ | `mempalace_kg_query` | 查询实体关系 | 需要了解人物/项目关系时 |
45
+ | `mempalace_kg_add` | 添加事实关系 | 发现新的事实 |
46
+ | `mempalace_kg_invalidate` | 废弃过时事实 | 事实发生变化时 |
47
+ | `mempalace_diary_write` | 写会话日记 | 每次会话结束前 |
48
+ | `mempalace_diary_read` | 读历史日记 | 回顾过往会话 |
49
+ | `mempalace_list_wings` | 列出所有 wing | 了解有哪些人物/项目记录 |
50
+ | `mempalace_list_rooms` | 列出 wing 下的 room | 查看某个人/项目的分类 |
51
+
52
+ ### 记忆什么 / 不记什么
53
+
54
+ - **记**:用户偏好、项目信息、专业背景、反复出现的问题、重要决策、用户的工作流程
55
+ - **不记**:一次性闲聊、临时信息、敏感个人信息(除非用户明确要求)
56
 
57
  ---
58
 
 
205
  | 定时任务 | 创建定时提醒/定期推送 | cronjob 工具 |
206
  | 子任务委派 | 拆分复杂任务并行处理 | delegate_task 工具 |
207
  | 飞书文档协作 | 读写评论飞书文档和云盘 | 按需使用 |
208
+ | 持久记忆 | 记忆宫殿跨会话持久化语义搜索+知识图谱,重启不丢失 | mempalace 工具 |
209
  | 会话历史搜索 | 搜索过去对话中的信息 | session_search 工具 |
210
  | 文件发送 | 生成的文件自动作为附件发送 | 写文件自动触发 |
211
  | 会话自动管理 | 每24小时重置会话上下文,但记忆不丢失 | 自动 |
config.yaml CHANGED
@@ -8,13 +8,19 @@ platforms:
8
  domain: feishu
9
  connection_mode: websocket
10
  memory:
11
- provider: none
12
  compress:
13
  enabled: true
14
  threshold: 50
15
  target_ratio: 20
16
  protect_last: 20
17
- no_mcp: true
 
 
 
 
 
 
18
  terminal:
19
  backend: cloud
20
  timeout: 180
 
8
  domain: feishu
9
  connection_mode: websocket
10
  memory:
11
+ provider: mempalace
12
  compress:
13
  enabled: true
14
  threshold: 50
15
  target_ratio: 20
16
  protect_last: 20
17
+ no_mcp: false
18
+
19
+ mcp_servers:
20
+ mempalace:
21
+ command: "python3"
22
+ args: ["-m", "mempalace.mcp_server"]
23
+ timeout: 120
24
  terminal:
25
  backend: cloud
26
  timeout: 180
dashboard.html CHANGED
@@ -384,7 +384,7 @@ async function poll(){
384
  document.getElementById('x-turns').textContent=d.config.max_turns||'90';
385
  document.getElementById('x-comp').textContent=d.config.compress?'已开启':'已关闭';
386
  document.getElementById('x-comp').style.color=d.config.compress?'var(--accent)':'var(--tx3)';
387
- document.getElementById('x-mem').textContent=d.config.memory==='none'?'未配置':'已配置';
388
  document.getElementById('x-mem').style.color=d.config.memory!=='none'?'var(--accent)':'var(--tx3)';
389
  document.getElementById('x-term').textContent=d.config.terminal==='local'?'本地':'云端';
390
  document.getElementById('x-tz').textContent='北京时间 (UTC+8)';
 
384
  document.getElementById('x-turns').textContent=d.config.max_turns||'90';
385
  document.getElementById('x-comp').textContent=d.config.compress?'已开启':'已关闭';
386
  document.getElementById('x-comp').style.color=d.config.compress?'var(--accent)':'var(--tx3)';
387
+ document.getElementById('x-mem').textContent=d.config.memory==='none'?'未配置':'MemPalace';
388
  document.getElementById('x-mem').style.color=d.config.memory!=='none'?'var(--accent)':'var(--tx3)';
389
  document.getElementById('x-term').textContent=d.config.terminal==='local'?'本地':'云端';
390
  document.getElementById('x-tz').textContent='北京时间 (UTC+8)';
start.sh CHANGED
@@ -17,4 +17,16 @@ for dir in sessions memories uploads logs palace skills; do
17
  done
18
 
19
  echo "Persistent storage ready."
 
 
 
 
 
 
 
 
 
 
 
 
20
  exec python3 /app/entry.py
 
17
  done
18
 
19
  echo "Persistent storage ready."
20
+
21
+ # Initialize MemPalace if not already
22
+ PALACE_PATH="${MEMPALACE_PALACE_PATH:-/data/hermes/palace}"
23
+ if [ ! -f "$PALACE_PATH/.palace_initialized" ]; then
24
+ echo "Initializing MemPalace at $PALACE_PATH..."
25
+ mempalace init "$PALACE_PATH" 2>/dev/null || echo "MemPalace init skipped (may already exist)"
26
+ touch "$PALACE_PATH/.palace_initialized"
27
+ echo "MemPalace initialized."
28
+ else
29
+ echo "MemPalace already initialized."
30
+ fi
31
+
32
  exec python3 /app/entry.py