Enhance documentation and configuration for Memory Gateway and agent plugin

This commit is contained in:
2026-05-06 16:43:32 +08:00
parent c44af407d4
commit 602c2bd71b
3 changed files with 491 additions and 94 deletions

543
README.md
View File

@ -26,16 +26,263 @@ Memory Gateway 是一个通用记忆网关,用于给 AI agent / harness 提供
docs/generic-memory-gateway-design.md docs/generic-memory-gateway-design.md
``` ```
## 架构 ## 总体架构
```mermaid
flowchart LR
Agent[AI Agents / Hermes / OpenClaw / Nanobot] -->|HTTP / MCP / Plugin Tools / Skill Scripts| Gateway[Memory Gateway]
Gateway --> Auth[Auth + ACL + Namespace Router]
Gateway --> SQLite[(SQLite Metadata Store)]
Gateway --> OV[OpenViking Context Layer]
Gateway --> Ever[EverMemOS Consolidation Service]
Gateway --> Obsidian[Obsidian Markdown Vault]
Gateway --> LLM[OpenAI-compatible LLM]
OV --> OVStore[(OpenViking memory/resource/index)]
Ever -->|promote stable memory| SQLite
Ever -->|review drafts| Obsidian
Obsidian --> Human[Human Review / Manual Editing]
```
模块职责:
- **Memory Gateway**:统一入口,提供 REST、MCP RPC、Hermes/OpenClaw plugin 所需的 `/v1` API负责 user context、namespace 展开、visibility/ACL、audit、短期 episode 写入和 session commit 编排。
- **OpenViking**context/resource/memory 检索层Gateway 会把允许访问的 namespace 展开后交给 OpenViking 搜索。
- **EverMemOS**:长期记忆整理层;从 session episodes 中提取稳定候选,去重、合并、冲突检测,并决定是否 promote 到长期记忆或进入 review。
- **Obsidian Vault**:人工可维护的 Markdown 前台保存上传文档、review draft、高价值可审查知识。不要把所有原始对话直接写入 Obsidian。
- **Hermes skill**:脚本式、显式调用入口,适合人工/agent 明确执行搜索、上传、commit。
- **Agent plugin**Hermes/OpenClaw runtime adapter注册 `memory_gateway` toolset 和 hooks可在真实对话中自动 search、append episode、可选 commit。
## 全新服务器部署总览
以下步骤假设目标服务器是 Linux初始没有 Python 环境、OpenViking、EverMemOS、Memory Gateway、Obsidian Vault 或 Hermes Agent。示例路径使用 `/opt`,可按实际环境替换。
推荐目录:
```text ```text
Agent / Harness / CLI /opt/
-> Memory Gateway REST / MCP ├── OpenViking/ # OpenViking 项目和 venv
-> OpenViking memory / resource └── memory-gateway/ # 本项目
-> Obsidian markdown vault ├── .venv/
-> OpenAI-compatible LLM summary ├── config.yaml # 本机配置,包含密钥,不提交
├── data/
│ └── memory_gateway.sqlite3
└── obsidian-vault/
├── 01_Knowledge/Uploaded/
└── Reviews/Queue/
``` ```
### 1. 安装系统依赖
```bash
sudo apt-get update
sudo apt-get install -y \
git curl rsync build-essential \
python3 python3-venv python3-pip
```
可选安装 `uv`,后续 Python 环境会更快:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```
如果服务器不能访问公网,请用内部镜像源安装 Python 依赖,并把 OpenViking、Hermes 和本项目代码放到内网 Git/制品库。
### 2. 安装 OpenViking
OpenViking 不在本仓库内,需要按 OpenViking 项目的官方安装方式部署。最终目标是服务器上可以运行:
```bash
openviking-server --host 127.0.0.1 --port 1933
```
一种常见安装形态:
```bash
cd /opt
git clone https://github.com/volcengine/OpenViking.git
cd /opt/OpenViking
python3 -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -e .
```
启动:
```bash
source /opt/OpenViking/.venv/bin/activate
openviking-server --host 127.0.0.1 --port 1933
```
健康检查:
```bash
curl http://127.0.0.1:1933/health
```
说明OpenViking 建议先只绑定 `127.0.0.1`,由 Memory Gateway 统一对外暴露 API。
### 3. 安装 Memory Gateway
```bash
cd /opt
git clone https://gitea.bwgdi.com/tomtan/memory-gateway.git memory-gateway
cd /opt/memory-gateway
python3 -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -e ".[dev]"
```
创建目录和配置:
```bash
mkdir -p /opt/memory-gateway/data
mkdir -p /opt/memory-gateway/obsidian-vault/01_Knowledge/Uploaded
mkdir -p /opt/memory-gateway/obsidian-vault/Reviews/Queue
cp config.example.yaml config.yaml
```
修改 `config.yaml`
```yaml
server:
host: "0.0.0.0"
port: 1934
api_key: "<CHANGE_ME_LONG_RANDOM_KEY>"
openviking:
url: "http://127.0.0.1:1933"
api_key: "<OPENVIKING_KEY_IF_REQUIRED>"
evermemos:
enabled: true
url: "http://127.0.0.1:1995"
fallback_to_local: true
obsidian:
vault_path: "/opt/memory-gateway/obsidian-vault"
knowledge_dir: "01_Knowledge/Uploaded"
review_dir: "Reviews/Queue"
storage:
backend: "sqlite"
sqlite_path: "/opt/memory-gateway/data/memory_gateway.sqlite3"
```
`config.yaml``.gitignore` 忽略,不应提交。
### 4. 安装/启动 EverMemOS
本项目内置一个 POC 级 EverMemOS-compatible 服务,适合单机验证:
```bash
cd /opt/memory-gateway
source .venv/bin/activate
python -m memory_gateway.evermemos_service \
--config /opt/memory-gateway/config.yaml \
--host 127.0.0.1 \
--port 1995
```
健康检查:
```bash
curl http://127.0.0.1:1995/health
```
如果已有独立 EverMemOS 服务,把 `config.yaml` 中的 `evermemos.url``api_key``consolidate_path` 改为远程服务即可。Memory Gateway 会在 `/v1/sessions/{session_id}/commit` 时调用它。
### 5. 启动 Memory Gateway
```bash
cd /opt/memory-gateway
source .venv/bin/activate
python -m memory_gateway.server --config /opt/memory-gateway/config.yaml
```
健康检查:
```bash
curl -H "X-API-Key: <CHANGE_ME_LONG_RANDOM_KEY>" http://127.0.0.1:1934/health
curl -H "X-API-Key: <CHANGE_ME_LONG_RANDOM_KEY>" http://127.0.0.1:1934/v1/evermemos/health
```
生产建议用 systemd/supervisor 管理 OpenViking、EverMemOS 和 Memory Gateway 三个进程,并通过 Nginx/Caddy/内网负载均衡做 TLS 和访问控制。
### 6. Obsidian Vault
服务器端不要求安装 Obsidian 桌面应用。这里的 Obsidian Vault 本质是 Markdown 目录:
```text
/opt/memory-gateway/obsidian-vault/
├── 01_Knowledge/Uploaded/ # /api/knowledge/upload 转换后的 Markdown
└── Reviews/Queue/ # EverMemOS 高价值/冲突候选 review draft
```
如果需要人工维护,可以:
- 用 Obsidian 桌面端通过 SSH/Syncthing/Git 同步这个 vault。
- 或直接在服务器上编辑 Markdown。
- 高价值、冲突、低置信度的长期记忆候选优先进 `Reviews/Queue/`,不要直接污染长期记忆。
### 7. 安装 Hermes Agent、Skill 和 Plugin
Hermes Agent 不在本仓库内。先按 Hermes 官方方式安装,确认命令可用:
```bash
hermes --version
hermes chat --help
```
安装 Memory Gateway skill
```bash
mkdir -p ~/.hermes/skills/memory-gateway
rsync -a --delete \
/opt/memory-gateway/integrations/hermes/memory-gateway/ \
~/.hermes/skills/memory-gateway/
```
skill 的特点:
- 通过脚本显式调用 Gateway API。
- 适合手动或 agent policy 主动执行搜索、上传、append episode、commit session。
- skill 本身不会自动记忆每轮对话。
安装 Memory Gateway agent plugin
```bash
mkdir -p ~/.hermes/plugins
ln -s /opt/memory-gateway/plugins/memory-gateway-agent \
~/.hermes/plugins/memory-gateway-agent
hermes plugins enable memory-gateway-agent
hermes plugins list
hermes tools list
```
plugin 环境变量:
```bash
export MEMORY_GATEWAY_URL=http://127.0.0.1:1934
export MEMORY_GATEWAY_API_KEY=<CHANGE_ME_LONG_RANDOM_KEY>
export MEMORY_GATEWAY_DEFAULT_USER_ID=user_demo
export MEMORY_GATEWAY_DEFAULT_AGENT_ID=agent_hermes
export MEMORY_GATEWAY_DEFAULT_WORKSPACE_ID=workspace_demo
export MEMORY_GATEWAY_AUTO_SEARCH=true
export MEMORY_GATEWAY_AUTO_APPEND_EPISODE=true
export MEMORY_GATEWAY_AUTO_COMMIT_SESSION=false
```
plugin 的特点:
- 向 Hermes 注册 `memory_gateway` toolset。
- 注册 hooks`on_session_start``pre_llm_call``post_llm_call``on_session_end`
- `pre_llm_call` 自动检索相关记忆。
- `post_llm_call` 只写摘要型 candidate episode。
- `on_session_end` 默认不 commit只有 `MEMORY_GATEWAY_AUTO_COMMIT_SESSION=true` 才提交 session。
## 目录结构 ## 目录结构
```text ```text
@ -49,78 +296,218 @@ memory-gateway/
│ └── types.py │ └── types.py
├── integrations/hermes/ ├── integrations/hermes/
│ └── memory-gateway/ # 通用 Hermes skill │ └── memory-gateway/ # 通用 Hermes skill
├── plugins/
│ └── memory-gateway-agent/ # Hermes/OpenClaw agent plugin adapter
├── obsidian-vault/ ├── obsidian-vault/
│ ├── 01_Knowledge/Uploaded/ # 上传文档转成的 Markdown │ ├── 01_Knowledge/Uploaded/ # 上传文档转成的 Markdown
│ ├── Reviews/Queue/ # EverMemOS review draft
│ └── 05_Templates/ # 通用知识模板 │ └── 05_Templates/ # 通用知识模板
├── data/ # SQLite metadata store生产建议保留备份
│ └── memory_gateway.sqlite3
├── docs/
│ └── generic-memory-gateway-design.md
├── tests/ ├── tests/
├── config.example.yaml ├── config.example.yaml
└── pyproject.toml └── pyproject.toml
``` ```
## 环境 ## 用户隔离、存储与长短期记忆
使用当前虚拟环境: ### 访问上下文
```bash v1 API 的所有核心读写都应该带上访问上下文:
cd /home/tom/memory-gateway
source /home/tom/OpenViking/.venv/bin/activate ```json
{
"user_id": "user_demo",
"agent_id": "agent_hermes",
"workspace_id": "workspace_demo",
"session_id": "session_001"
}
``` ```
本地配置文件: Gateway 根据这些字段做 namespace 展开和 ACL 判断。不同用户必须使用不同 `user_id`,不同 agent 使用不同 `agent_id`,不同项目或团队空间使用不同 `workspace_id`
### Namespace 设计
默认可见 namespace 形态:
```text ```text
/home/tom/memory-gateway/config.yaml user/{user_id}/profile
user/{user_id}/preferences
user/{user_id}/long_term
agent/{agent_id}/memory
workspace/{workspace_id}/shared
session/{session_id}/episodic
global/public
``` ```
关键配置 隔离规则
- `private`:默认私有,只允许同一 `user_id` 在 ACL 允许范围内访问。
- `agent-only`:只允许指定 agent 或 agent namespace 使用。
- `workspace-shared`:允许 workspace 成员/允许的 agent 使用。
- `global`:公共知识,谨慎使用,不存放个人信息。
- `session/{session_id}/episodic`:短期 session 记忆,默认只在当前 session 上下文中使用。
### 用户记忆存储位置
| 数据 | 存储位置 | 说明 |
| --- | --- | --- |
| users/profiles/memories/episodes/audit metadata | SQLite `storage.sqlite_path` | Gateway v1 的主 metadata store负责隔离、ACL、audit、短期 episode 和长期 memory 记录 |
| 可检索 context/resource/memory | OpenViking | Gateway 按允许 namespace 查询 OpenViking适合跨 agent 的 context 检索 |
| 上传文档 Markdown | Obsidian `01_Knowledge/Uploaded/` | 由 `/api/knowledge/upload` 写入,适合人工审查和维护 |
| 高价值/冲突 review draft | Obsidian `Reviews/Queue/` | EverMemOS 发现高价值或冲突候选时写入,不直接污染长期记忆 |
| Hermes plugin trace | `plugins/memory-gateway-agent/.tmp/hook_trace.log` | 默认关闭,只存 hook 名称、短 session id、Gateway action 和状态 |
### 什么时候写短期记忆
短期记忆写入 `episodes`,通常来自:
- Hermes plugin `post_llm_call` 判断用户明确要求“remember/记住”或出现稳定偏好、长期约束、项目事实。
- agent 或 skill 显式调用 `memory_append_episode`
- 任务执行过程中的关键结论、可复用 workflow、架构决策。
短期记忆不应该包含:
- 完整原始对话。
- password、token、API key、cookie、private key。
- 一次性验证码、大段日志、低价值临时内容。
- 模型 chain-of-thought。
### 什么时候提升为长期记忆
长期记忆写入 `memories`,通常发生在:
1. Agent/skill/plugin 先写 `session/{session_id}/episodic` episode。
2. 调用 `/v1/sessions/{session_id}/commit` 或 MCP/tool `memory_commit_session`
3. Gateway 把 session episodes、可见长期记忆和访问上下文发给 EverMemOS。
4. EverMemOS 做提取、去重、合并、冲突检测、重要性判断。
5. 稳定且超过阈值的候选 promote 到 `user/{user_id}/long_term` 或目标 namespace。
6. 高价值、冲突或需要人工确认的候选进入 Obsidian `Reviews/Queue/`
Hermes plugin 默认:
- `MEMORY_GATEWAY_AUTO_SEARCH=true`:对话前自动检索。
- `MEMORY_GATEWAY_AUTO_APPEND_EPISODE=true`:对话后按 policy 写 candidate episode。
- `MEMORY_GATEWAY_AUTO_COMMIT_SESSION=false`:默认不自动提升长期记忆。
因此POC 推荐流程是“先短期、后 commit、再长期”不要把所有 session 内容直接 upsert 成长期记忆。
### 如何再次查询和调用用户记忆
HTTP 查询:
```bash
curl -X POST http://127.0.0.1:1934/v1/memory/search \
-H "Content-Type: application/json" \
-H "X-API-Key: <CHANGE_ME_LONG_RANDOM_KEY>" \
-d '{
"user_id": "user_demo",
"agent_id": "agent_hermes",
"workspace_id": "workspace_demo",
"session_id": "session_001",
"query": "用户输出偏好和项目约束",
"limit": 5
}'
```
Hermes skill 查询:
```bash
python ~/.hermes/skills/memory-gateway/scripts/memory_search.py \
--user-id user_demo \
--agent-id agent_hermes \
--workspace-id workspace_demo \
--session-id session_001 \
--query "用户输出偏好和项目约束" \
--limit 5
```
Hermes plugin 查询:
- 用户正常对话时,`pre_llm_call` 会自动调用 `memory_search`
- Agent 也可以显式调用 `memory_search` tool。
## 远程调用与安全
Memory Gateway API 可以远程调用。生产/远程部署时建议:
1. `server.host` 设置为 `0.0.0.0`
2. `server.api_key` 设置为长随机值。
3. 防火墙只开放可信来源,或通过 VPN/内网访问。
4. 使用 Nginx/Caddy/负载均衡终止 TLS。
5. 远程客户端一律带 `X-API-Key`
远程调用示例:
```bash
export MEMORY_GATEWAY_URL=https://memory.example.com
export MEMORY_GATEWAY_API_KEY=<CHANGE_ME_LONG_RANDOM_KEY>
curl -X POST "$MEMORY_GATEWAY_URL/v1/memory/search" \
-H "Content-Type: application/json" \
-H "X-API-Key: $MEMORY_GATEWAY_API_KEY" \
-d '{
"user_id": "user_demo",
"agent_id": "remote_agent",
"workspace_id": "workspace_demo",
"query": "长期偏好",
"limit": 5
}'
```
远程 Hermes plugin 配置:
```bash
export MEMORY_GATEWAY_URL=https://memory.example.com
export MEMORY_GATEWAY_API_KEY=<CHANGE_ME_LONG_RANDOM_KEY>
export MEMORY_GATEWAY_DEFAULT_USER_ID=user_demo
export MEMORY_GATEWAY_DEFAULT_AGENT_ID=agent_hermes_remote
export MEMORY_GATEWAY_DEFAULT_WORKSPACE_ID=workspace_demo
```
注意:远程 API 不应裸奔在公网。至少启用 API key 和 TLS涉及个人记忆时建议放在内网或 VPN 后面。
## 本地开发快捷启动
全新服务器请优先按上面的 `/opt` 部署流程执行。本节用于已经 clone 当前仓库后的开发机快速启动,路径都以仓库根目录为准。
```bash
cd memory-gateway
python3 -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -e ".[dev]"
mkdir -p data obsidian-vault/01_Knowledge/Uploaded obsidian-vault/Reviews/Queue
cp config.example.yaml config.yaml
```
建议把 `config.yaml` 中的本地开发路径改成:
```yaml ```yaml
memory:
default_namespace: memory-gateway
llm:
base_url: https://oai.bwgdi.com/v1
api_key: <local secret, git ignored>
model: MiniMaxAI
obsidian: obsidian:
vault_path: /home/tom/memory-gateway/obsidian-vault vault_path: "./obsidian-vault"
knowledge_dir: 01_Knowledge/Uploaded
review_dir: Reviews/Queue
storage: storage:
backend: sqlite backend: sqlite
sqlite_path: /home/tom/memory-gateway/memory_gateway.sqlite3 sqlite_path: "./data/memory_gateway.sqlite3"
``` ```
`config.yaml` 已被 `.gitignore` 忽略,不会提交密钥。 启动顺序:
## 启动
OpenViking 需要先运行在 `127.0.0.1:1933`
```bash ```bash
source /home/tom/OpenViking/.venv/bin/activate # 终端 1OpenViking按 OpenViking 项目实际环境启动
openviking-server --host 127.0.0.1 --port 1933 openviking-server --host 127.0.0.1 --port 1933
```
启动本机 EverMemOS 服务 # 终端 2EverMemOS-compatible POC 服务
```bash
cd /home/tom/memory-gateway
source /home/tom/OpenViking/.venv/bin/activate
python -m memory_gateway.evermemos_service \ python -m memory_gateway.evermemos_service \
--config /home/tom/memory-gateway/config.yaml \ --config ./config.yaml \
--host 127.0.0.1 \ --host 127.0.0.1 \
--port 1995 --port 1995
```
启动 Memory Gateway # 终端 3Memory Gateway
python -m memory_gateway.server --config ./config.yaml
```bash
cd /home/tom/memory-gateway
source /home/tom/OpenViking/.venv/bin/activate
python -m memory_gateway.server --config /home/tom/memory-gateway/config.yaml
``` ```
健康检查: 健康检查:
@ -133,6 +520,12 @@ curl http://127.0.0.1:1934/v1/evermemos/health
## REST 接口 ## REST 接口
如果 `config.yaml` 设置了 `server.api_key`,以下所有 HTTP 调用都需要加:
```bash
-H "X-API-Key: <CHANGE_ME_LONG_RANDOM_KEY>"
```
### `GET /health` ### `GET /health`
检查 Gateway 和 OpenViking 状态。 检查 Gateway 和 OpenViking 状态。
@ -340,7 +733,7 @@ obsidian-vault/Reviews/Queue/
通用 Hermes skill 通用 Hermes skill
```text ```text
/home/tom/.hermes/skills/memory-gateway/ ~/.hermes/skills/memory-gateway/
``` ```
仓库副本: 仓库副本:
@ -352,10 +745,10 @@ integrations/hermes/memory-gateway/
安装或更新到本机 Hermes skill 目录: 安装或更新到本机 Hermes skill 目录:
```bash ```bash
mkdir -p /home/tom/.hermes/skills/memory-gateway mkdir -p ~/.hermes/skills/memory-gateway
rsync -a --delete \ rsync -a --delete \
/home/tom/memory-gateway/integrations/hermes/memory-gateway/ \ ./integrations/hermes/memory-gateway/ \
/home/tom/.hermes/skills/memory-gateway/ ~/.hermes/skills/memory-gateway/
``` ```
使用方式: 使用方式:
@ -382,13 +775,13 @@ scripts/search_obsidian.py
检查 EverMemOS 检查 EverMemOS
```bash ```bash
python /home/tom/.hermes/skills/memory-gateway/scripts/evermemos_health.py python ~/.hermes/skills/memory-gateway/scripts/evermemos_health.py
``` ```
检索记忆: 检索记忆:
```bash ```bash
python /home/tom/.hermes/skills/memory-gateway/scripts/retrieve_memory.py \ python ~/.hermes/skills/memory-gateway/scripts/retrieve_memory.py \
--query "document upload summary memory gateway" \ --query "document upload summary memory gateway" \
--uri viking://resources \ --uri viking://resources \
--limit 5 --limit 5
@ -397,7 +790,7 @@ python /home/tom/.hermes/skills/memory-gateway/scripts/retrieve_memory.py \
总结沉淀: 总结沉淀:
```bash ```bash
python /home/tom/.hermes/skills/memory-gateway/scripts/commit_summary.py \ python ~/.hermes/skills/memory-gateway/scripts/commit_summary.py \
--title "Reusable conclusion" \ --title "Reusable conclusion" \
--namespace memory-gateway \ --namespace memory-gateway \
--memory-type decision \ --memory-type decision \
@ -409,7 +802,7 @@ python /home/tom/.hermes/skills/memory-gateway/scripts/commit_summary.py \
上传知识: 上传知识:
```bash ```bash
python /home/tom/.hermes/skills/memory-gateway/scripts/upload_knowledge.py \ python ~/.hermes/skills/memory-gateway/scripts/upload_knowledge.py \
--file /path/to/document.md \ --file /path/to/document.md \
--title "Knowledge note" \ --title "Knowledge note" \
--namespace memory-gateway \ --namespace memory-gateway \
@ -421,12 +814,12 @@ python /home/tom/.hermes/skills/memory-gateway/scripts/upload_knowledge.py \
完整长短期记忆测试: 完整长短期记忆测试:
```bash ```bash
python /home/tom/.hermes/skills/memory-gateway/scripts/memory_create_user.py \ python ~/.hermes/skills/memory-gateway/scripts/memory_create_user.py \
--user-id user_tom \ --user-id user_tom \
--display-name "Tom" \ --display-name "Tom" \
--preference language=zh-CN --preference language=zh-CN
python /home/tom/.hermes/skills/memory-gateway/scripts/memory_append_episode.py \ python ~/.hermes/skills/memory-gateway/scripts/memory_append_episode.py \
--user-id user_tom \ --user-id user_tom \
--agent-id agent_hermes \ --agent-id agent_hermes \
--workspace-id ws_memory_gateway \ --workspace-id ws_memory_gateway \
@ -434,7 +827,7 @@ python /home/tom/.hermes/skills/memory-gateway/scripts/memory_append_episode.py
--tag decision \ --tag decision \
--text "结论:本机 EverMemOS 服务负责从 session episode 中整理稳定长期记忆。" --text "结论:本机 EverMemOS 服务负责从 session episode 中整理稳定长期记忆。"
python /home/tom/.hermes/skills/memory-gateway/scripts/memory_append_episode.py \ python ~/.hermes/skills/memory-gateway/scripts/memory_append_episode.py \
--user-id user_tom \ --user-id user_tom \
--agent-id agent_hermes \ --agent-id agent_hermes \
--workspace-id ws_memory_gateway \ --workspace-id ws_memory_gateway \
@ -443,14 +836,14 @@ python /home/tom/.hermes/skills/memory-gateway/scripts/memory_append_episode.py
--tag high-value \ --tag high-value \
--text "重要:高价值记忆应该进入 Obsidian review queue避免错误记忆污染长期系统。" --text "重要:高价值记忆应该进入 Obsidian review queue避免错误记忆污染长期系统。"
python /home/tom/.hermes/skills/memory-gateway/scripts/memory_commit_session.py \ python ~/.hermes/skills/memory-gateway/scripts/memory_commit_session.py \
--user-id user_tom \ --user-id user_tom \
--agent-id agent_hermes \ --agent-id agent_hermes \
--workspace-id ws_memory_gateway \ --workspace-id ws_memory_gateway \
--session-id sess_demo \ --session-id sess_demo \
--min-importance 0.6 --min-importance 0.6
python /home/tom/.hermes/skills/memory-gateway/scripts/memory_search.py \ python ~/.hermes/skills/memory-gateway/scripts/memory_search.py \
--user-id user_tom \ --user-id user_tom \
--agent-id agent_hermes \ --agent-id agent_hermes \
--workspace-id ws_memory_gateway \ --workspace-id ws_memory_gateway \
@ -478,9 +871,9 @@ plugins/memory-gateway-agent/
Hermes 本机安装: Hermes 本机安装:
```bash ```bash
mkdir -p /home/tom/.hermes/plugins mkdir -p ~/.hermes/plugins
ln -s /home/tom/memory-gateway/plugins/memory-gateway-agent \ ln -s "$(pwd)/plugins/memory-gateway-agent" \
/home/tom/.hermes/plugins/memory-gateway-agent ~/.hermes/plugins/memory-gateway-agent
hermes plugins enable memory-gateway-agent hermes plugins enable memory-gateway-agent
hermes plugins list hermes plugins list
hermes tools list hermes tools list
@ -489,7 +882,7 @@ hermes tools list
如果软链接已存在,先确认它指向当前仓库: 如果软链接已存在,先确认它指向当前仓库:
```bash ```bash
ls -l /home/tom/.hermes/plugins/memory-gateway-agent ls -l ~/.hermes/plugins/memory-gateway-agent
``` ```
运行配置: 运行配置:
@ -516,25 +909,25 @@ Hermes plugin 已验证:
真实 Hermes chat 验证: 真实 Hermes chat 验证:
```bash ```bash
PYTHONPATH=/home/tom/memory-gateway/plugins/memory-gateway-agent \ PYTHONPATH="$(pwd)/plugins/memory-gateway-agent" \
python /home/tom/memory-gateway/plugins/memory-gateway-agent/scripts/hermes_interactive_session_check.py python plugins/memory-gateway-agent/scripts/hermes_interactive_session_check.py
``` ```
插件 E2E 验证: 插件 E2E 验证:
```bash ```bash
PYTHONPATH=/home/tom/memory-gateway/plugins/memory-gateway-agent \ PYTHONPATH="$(pwd)/plugins/memory-gateway-agent" \
python /home/tom/memory-gateway/plugins/memory-gateway-agent/scripts/gateway_e2e_check.py python plugins/memory-gateway-agent/scripts/gateway_e2e_check.py
PYTHONPATH=/home/tom/memory-gateway/plugins/memory-gateway-agent \ PYTHONPATH="$(pwd)/plugins/memory-gateway-agent" \
python /home/tom/memory-gateway/plugins/memory-gateway-agent/scripts/hermes_hook_probe.py python plugins/memory-gateway-agent/scripts/hermes_hook_probe.py
``` ```
清理测试数据: 清理测试数据:
```bash ```bash
PYTHONPATH=/home/tom/memory-gateway/plugins/memory-gateway-agent \ PYTHONPATH="$(pwd)/plugins/memory-gateway-agent" \
python /home/tom/memory-gateway/plugins/memory-gateway-agent/scripts/cleanup_test_memories.py python plugins/memory-gateway-agent/scripts/cleanup_test_memories.py
``` ```
安全边界: 安全边界:
@ -556,11 +949,11 @@ plugins/memory-gateway-agent/openclaw.plugin.yaml
## 测试 ## 测试
```bash ```bash
cd /home/tom/memory-gateway cd memory-gateway
source /home/tom/OpenViking/.venv/bin/activate source .venv/bin/activate
PYTHONPATH=/home/tom/memory-gateway pytest -q PYTHONPATH="$(pwd)" pytest -q
PYTHONPATH=/home/tom/memory-gateway/plugins/memory-gateway-agent \ PYTHONPATH="$(pwd)/plugins/memory-gateway-agent" \
pytest -q plugins/memory-gateway-agent/tests pytest -q plugins/memory-gateway-agent/tests
``` ```

View File

@ -1,27 +1,28 @@
# Memory Gateway 配置示例 # Memory Gateway 配置示例
# 复制为 config.yaml 并根据实际情况修改 # 复制为 config.yaml 并根据实际服务器路径、端口和密钥修改
# 不要提交 config.yaml它应包含本机/服务器密钥。
# Memory Gateway 服务配置 # Memory Gateway 服务配置
server: server:
# 监听地址0.0.0.0 表示接受所有网卡(局域网可访问) # 本机测试可用 127.0.0.1;需要远程调用时使用 0.0.0.0 并配置防火墙/反向代理。
host: "0.0.0.0" host: "127.0.0.1"
# MCP Server 端口 # REST API、MCP RPC 和 SSE 共用端口
port: 1934 port: 1934
# 可选API Key 认证,客户端需要提供相同的 Key # 强烈建议生产/远程调用时设置;客户端通过 X-API-Key 传入。
api_key: "" api_key: ""
# OpenViking 后端配置 # OpenViking 后端配置
openviking: openviking:
# OpenViking 服务器地址 # OpenViking 服务器地址。Memory Gateway 通过它检索 context/resource/memory。
url: "http://localhost:1933" url: "http://127.0.0.1:1933"
# OpenViking API Key(如有) # OpenViking API Key。按 OpenViking 实际配置填写。
api_key: "" api_key: ""
# 请求超时时间(秒)
timeout: 30 timeout: 30
# EverMemOS 后台长期记忆整理服务 # EverMemOS 后台长期记忆整理服务
evermemos: evermemos:
enabled: true enabled: true
# 可以是本机 memory_gateway.evermemos_service也可以是远程 EverMemOS 服务。
url: "http://127.0.0.1:1995" url: "http://127.0.0.1:1995"
api_key: "" api_key: ""
timeout: 30 timeout: 30
@ -33,9 +34,8 @@ evermemos:
# 记忆配置 # 记忆配置
memory: memory:
# 默认命名空间 # 旧 /api/* 接口使用的默认命名空间。v1 API 会按 user/agent/workspace/session 自动展开 namespace。
default_namespace: "memory-gateway" default_namespace: "memory-gateway"
# 默认搜索返回数量
search_limit: 10 search_limit: 10
# 日志配置 # 日志配置
@ -52,13 +52,16 @@ llm:
timeout: 60 timeout: 60
max_input_chars: 24000 max_input_chars: 24000
# Obsidian 配置:用于 /api/knowledge/upload 保存 Markdown 笔记 # Obsidian Vault 配置。
# 服务端不要求安装 Obsidian 桌面应用;这里本质上是一个 Markdown vault 目录。
obsidian: obsidian:
vault_path: "/home/tom/memory-gateway/obsidian-vault" vault_path: "/opt/memory-gateway/obsidian-vault"
knowledge_dir: "01_Knowledge/Uploaded" knowledge_dir: "01_Knowledge/Uploaded"
review_dir: "Reviews/Queue" review_dir: "Reviews/Queue"
# v1 metadata storage. Use "memory" only for isolated unit tests. # v1 metadata storage
# SQLite 保存 users、memories、episodes、profiles、audit是用户隔离和 ACL 判断的主要 metadata store。
# Use "memory" only for isolated unit tests.
storage: storage:
backend: "sqlite" backend: "sqlite"
sqlite_path: "/home/tom/memory-gateway/memory_gateway.sqlite3" sqlite_path: "/opt/memory-gateway/data/memory_gateway.sqlite3"

View File

@ -55,7 +55,8 @@ Install locally:
```bash ```bash
mkdir -p ~/.hermes/plugins mkdir -p ~/.hermes/plugins
ln -s /home/tom/memory-gateway/plugins/memory-gateway-agent ~/.hermes/plugins/memory-gateway-agent cd /opt/memory-gateway
ln -s "$(pwd)/plugins/memory-gateway-agent" ~/.hermes/plugins/memory-gateway-agent
hermes plugins enable memory-gateway-agent hermes plugins enable memory-gateway-agent
hermes plugins list hermes plugins list
hermes tools list hermes tools list
@ -134,7 +135,7 @@ Integration tests use:
Run cleanup: Run cleanup:
```bash ```bash
cd /home/tom/memory-gateway cd /opt/memory-gateway
PYTHONPATH=plugins/memory-gateway-agent python plugins/memory-gateway-agent/scripts/cleanup_test_memories.py PYTHONPATH=plugins/memory-gateway-agent python plugins/memory-gateway-agent/scripts/cleanup_test_memories.py
``` ```
@ -143,7 +144,7 @@ The cleanup script refuses non-`test_user_` users. It first tries `DELETE /v1/me
## Local Smoke Test ## Local Smoke Test
```bash ```bash
cd /home/tom/memory-gateway cd /opt/memory-gateway
PYTHONPATH=plugins/memory-gateway-agent python plugins/memory-gateway-agent/scripts/health.py PYTHONPATH=plugins/memory-gateway-agent python plugins/memory-gateway-agent/scripts/health.py
PYTHONPATH=plugins/memory-gateway-agent python plugins/memory-gateway-agent/scripts/smoke_test.py PYTHONPATH=plugins/memory-gateway-agent python plugins/memory-gateway-agent/scripts/smoke_test.py
PYTHONPATH=plugins/memory-gateway-agent python plugins/memory-gateway-agent/scripts/hermes_smoke_check.py PYTHONPATH=plugins/memory-gateway-agent python plugins/memory-gateway-agent/scripts/hermes_smoke_check.py