Spaces:
Running
Running
Z User commited on
Commit ·
7adec1d
1
Parent(s): 14fbbb2
feat: integrate MemPalace memory palace + MCP + SOUL.md instructions
Browse files- Dockerfile +7 -2
- README.md +0 -0
- SOUL.md +40 -7
- config.yaml +8 -2
- dashboard.html +1 -1
- 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/
|
|
|
|
| 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 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
---
|
| 25 |
|
|
@@ -172,7 +205,7 @@ browser_navigate(URL) → browser_snapshot(获取内容) → 分析/提取/截
|
|
| 172 |
| 定时任务 | 创建定时提醒/定期推送 | cronjob 工具 |
|
| 173 |
| 子任务委派 | 拆分复杂任务并行处理 | delegate_task 工具 |
|
| 174 |
| 飞书文档协作 | 读写评论飞书文档和云盘 | 按需使用 |
|
| 175 |
-
| 持久记忆 | 跨会话
|
| 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:
|
| 12 |
compress:
|
| 13 |
enabled: true
|
| 14 |
threshold: 50
|
| 15 |
target_ratio: 20
|
| 16 |
protect_last: 20
|
| 17 |
-
no_mcp:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|