Spaces:
Running
Running
Z User commited on
Commit ·
6a941e4
1
Parent(s): e35f3c0
refactor: remove MemPalace to free ~1-2GB RAM
Browse files- Remove MemPalace clone + pip install + onnxruntime from Dockerfile
- Remove mcp_servers.mempalace from config.yaml, add no_mcp: true
- Remove MEMPALACE_PALACE_PATH env vars from entry.py
- Replace MemPalace SOUL.md section with Holographic Memory guide
- Keep holographic memory (SQLite + FTS5, zero overhead)
- Keep Chinese fonts (NotoSansSC, ~16MB)
- Dockerfile +2 -8
- SOUL.md +9 -34
- config.yaml +1 -9
- entry.py +0 -2
Dockerfile
CHANGED
|
@@ -10,18 +10,14 @@ WORKDIR /app
|
|
| 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
|
| 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 |
-
# Chinese font (download Noto Sans SC Regular
|
| 25 |
RUN mkdir -p /usr/share/fonts/truetype/noto && \
|
| 26 |
curl -sL "https://github.com/googlefonts/noto-cjk/raw/main/Sans/SubsetOTF/SC/NotoSansSC-Regular.otf" \
|
| 27 |
-o /usr/share/fonts/truetype/noto/NotoSansSC-Regular.otf && \
|
|
@@ -48,7 +44,5 @@ RUN chmod +x /app/start.sh
|
|
| 48 |
EXPOSE 7860
|
| 49 |
|
| 50 |
ENV HERMES_ACCEPT_HOOKS=1
|
| 51 |
-
ENV MEMPALACE_PALACE_PATH=/data/hermes/palace
|
| 52 |
-
ENV MEMPALACE_EMBEDDING_DEVICE=cpu
|
| 53 |
|
| 54 |
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 |
# 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 -10
|
| 19 |
|
| 20 |
+
# Chinese font (download Noto Sans SC Regular + Bold, ~16MB)
|
| 21 |
RUN mkdir -p /usr/share/fonts/truetype/noto && \
|
| 22 |
curl -sL "https://github.com/googlefonts/noto-cjk/raw/main/Sans/SubsetOTF/SC/NotoSansSC-Regular.otf" \
|
| 23 |
-o /usr/share/fonts/truetype/noto/NotoSansSC-Regular.otf && \
|
|
|
|
| 44 |
EXPOSE 7860
|
| 45 |
|
| 46 |
ENV HERMES_ACCEPT_HOOKS=1
|
|
|
|
|
|
|
| 47 |
|
| 48 |
CMD ["/app/start.sh"]
|
SOUL.md
CHANGED
|
@@ -13,43 +13,18 @@
|
|
| 13 |
|
| 14 |
---
|
| 15 |
|
| 16 |
-
## 一、记忆
|
| 17 |
|
| 18 |
-
你拥有
|
| 19 |
|
| 20 |
-
###
|
| 21 |
|
| 22 |
-
1. **
|
| 23 |
-
2. **
|
| 24 |
-
3. **
|
| 25 |
-
4. **
|
| 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 |
- **不记**:一次性闲聊、临时信息、敏感个人信息(除非用户明确要求)
|
|
@@ -213,7 +188,7 @@ browser_navigate(URL) → browser_snapshot(获取内容) → 分析/提取/截
|
|
| 213 |
| 定时任务 | 创建定时提醒/定期推送 | cronjob 工具 |
|
| 214 |
| 子任务委派 | 拆分复杂任务并行处理 | delegate_task 工具 |
|
| 215 |
| 飞书文档协作 | 读写评论飞书文档和云盘 | 按需使用 |
|
| 216 |
-
| 持久记忆 | 记忆
|
| 217 |
| 会话历史搜索 | 搜索过去对话中的信息 | session_search 工具 |
|
| 218 |
| 文件发送 | 生成的文件以原生附件形式发送 | write_file 后回复中写 MEDIA:<路径> |
|
| 219 |
| 会话自动管理 | 每24小时重置会话上下文,但记忆不丢失 | 自动 |
|
|
|
|
| 13 |
|
| 14 |
---
|
| 15 |
|
| 16 |
+
## 一、记忆系统(Holographic Memory)
|
| 17 |
|
| 18 |
+
你拥有持久化的 holographic 记忆系统(基于 SQLite + FTS5 全文搜索),跨会话记忆在重启后不会丢失。
|
| 19 |
|
| 20 |
+
### 记忆协议
|
| 21 |
|
| 22 |
+
1. **回答涉及历史信息的问题时**:调用 `memory` 工具搜索相关记忆,不要凭模糊印象猜
|
| 23 |
+
2. **识别到关键信息时立即保存**:调用 `memory(action='add', ...)` 存入(用户偏好、项目信息、重要决定)
|
| 24 |
+
3. **事实变化时更新**:调用 `memory(action='replace', ...)` 替换旧记忆
|
| 25 |
+
4. **引用记忆时自然融入**,不要硬接"基于记忆……"或"我记得你说过……"
|
|
|
|
|
|
|
| 26 |
|
| 27 |
+
### 记什么 / 不记什么
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
|
| 29 |
- **记**:用户偏好、项目信息、专业背景、反复出现的问题、重要决策、用户的工作流程
|
| 30 |
- **不记**:一次性闲聊、临时信息、敏感个人信息(除非用户明确要求)
|
|
|
|
| 188 |
| 定时任务 | 创建定时提醒/定期推送 | cronjob 工具 |
|
| 189 |
| 子任务委派 | 拆分复杂任务并行处理 | delegate_task 工具 |
|
| 190 |
| 飞书文档协作 | 读写评论飞书文档和云盘 | 按需使用 |
|
| 191 |
+
| 持久记忆 | Holographic 记忆跨会话持久化,全文搜索,重启不丢失 | memory 工具 |
|
| 192 |
| 会话历史搜索 | 搜索过去对话中的信息 | session_search 工具 |
|
| 193 |
| 文件发送 | 生成的文件以原生附件形式发送 | write_file 后回复中写 MEDIA:<路径> |
|
| 194 |
| 会话自动管理 | 每24小时重置会话上下文,但记忆不丢失 | 自动 |
|
config.yaml
CHANGED
|
@@ -19,15 +19,7 @@ compress:
|
|
| 19 |
threshold: 50
|
| 20 |
target_ratio: 20
|
| 21 |
protect_last: 20
|
| 22 |
-
|
| 23 |
-
mempalace:
|
| 24 |
-
type: stdio
|
| 25 |
-
command: python3
|
| 26 |
-
args:
|
| 27 |
-
- "-m"
|
| 28 |
-
- mempalace.mcp_server
|
| 29 |
-
env:
|
| 30 |
-
MEMPALACE_PALACE_PATH: /data/hermes/palace
|
| 31 |
terminal:
|
| 32 |
backend: local
|
| 33 |
timeout: 180
|
|
|
|
| 19 |
threshold: 50
|
| 20 |
target_ratio: 20
|
| 21 |
protect_last: 20
|
| 22 |
+
no_mcp: true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
terminal:
|
| 24 |
backend: local
|
| 25 |
timeout: 180
|
entry.py
CHANGED
|
@@ -428,7 +428,6 @@ class DashboardHandler(BaseHTTPRequestHandler):
|
|
| 428 |
_gateway_start_time = time.time()
|
| 429 |
env = os.environ.copy()
|
| 430 |
env["HERMES_ACCEPT_HOOKS"] = "1"
|
| 431 |
-
env["MEMPALACE_PALACE_PATH"] = os.path.join(DATA_DIR, "palace")
|
| 432 |
env["PYTHONUNBUFFERED"] = "1"
|
| 433 |
|
| 434 |
_gateway_process = subprocess.Popen(
|
|
@@ -496,7 +495,6 @@ def main():
|
|
| 496 |
_gateway_start_time = time.time()
|
| 497 |
env = os.environ.copy()
|
| 498 |
env["HERMES_ACCEPT_HOOKS"] = "1"
|
| 499 |
-
env["MEMPALACE_PALACE_PATH"] = os.path.join(DATA_DIR, "palace")
|
| 500 |
env["PYTHONUNBUFFERED"] = "1" # 关键:禁用输出缓冲,日志实时写入文件
|
| 501 |
|
| 502 |
os.makedirs(LOG_DIR, exist_ok=True)
|
|
|
|
| 428 |
_gateway_start_time = time.time()
|
| 429 |
env = os.environ.copy()
|
| 430 |
env["HERMES_ACCEPT_HOOKS"] = "1"
|
|
|
|
| 431 |
env["PYTHONUNBUFFERED"] = "1"
|
| 432 |
|
| 433 |
_gateway_process = subprocess.Popen(
|
|
|
|
| 495 |
_gateway_start_time = time.time()
|
| 496 |
env = os.environ.copy()
|
| 497 |
env["HERMES_ACCEPT_HOOKS"] = "1"
|
|
|
|
| 498 |
env["PYTHONUNBUFFERED"] = "1" # 关键:禁用输出缓冲,日志实时写入文件
|
| 499 |
|
| 500 |
os.makedirs(LOG_DIR, exist_ok=True)
|