# mem9

> 为 DeepSeek Harness 提供云端持久记忆：自动在每轮对话前检索相关历史，对话结束后自动写入记忆，并暴露五个模型可调用的记忆工具。

## Metadata

- Author: [@mem9-ai](https://github.com/mem9-ai)
- Repo: <https://github.com/mem9-ai/mem9.git>
- GitHub: [mem9-ai/mem9](https://github.com/mem9-ai/mem9)
- Stars: 1,192
- Language: TypeScript
- License: [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html)
- Topics: `dsh-plugin`
- Forks: 122
- Open Issues: 89
- Last push: 2026-08-19T10:21:49.000Z
- Added: 2026-08-19T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:mem9-ai/mem9/dsh-plugin
```

## Wiki

## 一句话定位
mem9 是 DeepSeek Harness 的持久记忆插件。它把每次对话中有价值的内容自动写入云端记忆库，并在下一轮对话开始前自动检索相关历史喂给模型，让 Harness 真正"记住"跨会话的事情。

## 核心能力
- 在用户每轮对话的第一次模型推理前，自动从记忆库中检索相关历史，作为不可信上下文注入到本轮提示词中
- 每轮对话正常结束后，自动以"智能模式"把真实用户文本和助手文本异步写入记忆库，不阻塞对话流程
- 给模型暴露 5 个工具：memory_store（保存）、memory_search（检索）、memory_get（按 id 取一条）、memory_update（更新）、memory_delete（删除）
- 通过 X-API-Key + X-Mnemo-Agent-Id 请求头对接 mem9 后端，支持官方托管服务或自建实例
- 支持会话级别的并发控制：每个 session 的记忆写入串行执行，插件卸载时会优雅排空队列
- 当 mem9 服务返回"运行时额度拒绝"时，会给本会话注入一次性友好提示，不会让插件反复打扰

## 技术实现
- **语言**: TypeScript
- **关键依赖**: @deepseek-ai/cordis（插件框架）、@deepseek-ai/schemastery（配置校验）、@deepseek-ai/dsh-tools（工具注册）、@deepseek-ai/dsh-credentials（凭据解析）
- **架构模式**: Cordis 插件模式，通过 dsh.bundle.patch 注入一条名为 `mem9` 的服务，监听 agent/pre-step（自动检索）、session/event（自动写入）、agent/created/agent/disposed（工具生命周期）四个事件
- **入口文件**: dsh-plugin/src/index.ts，导出 `apply(ctx, config)` 函数；cordis.patch.yml 声明插入点

## 适用场景
如果你每天用 DeepSeek Harness 跟模型协作处理长期项目（比如跨多天的代码重构、文档编写、需求跟进），那么模型每次新对话都会"失忆"——之前的决策、偏好、上下文都要重新讲一遍。mem9 就是为这种场景设计的：它把每轮有价值的内容沉淀到云端，下一轮自动捞回来。非常适合个人知识库的积累、长期项目的上下文延续、以及希望模型越用越懂你的场景。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DeepSeek Harness | 0.1.0-rc.7 | peerDependencies 要求 @deepseek-ai/dsh-agent、dsh-credentials、dsh-llm、dsh-session、dsh-tools 均为 0.1.0-rc.7 |
| Node.js | >=22.19.0 | engines 声明 ^22.19.0 或 >=24.0.0 |
| 平台 | 跨平台 | 无 os/cpu 限制，无原生模块依赖 |
| API Key | MEM9_API_KEY 环境变量 | 需要在运行 dsh 之前 export，或在配置中通过 apiKeyEnv 指向其他环境变量名 |

## 安装方式
```bash
dsh plugin --profile web add github:mem9-ai/mem9/dsh-plugin
```

## 配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| apiUrl | 字符串 | mem9 后端地址，必须是 http/https 绝对地址；可指向官方托管或自建实例 | https://api.mem9.ai |
| apiKeyEnv | 字符串 | 用来读取 API Key 的环境变量名 | MEM9_API_KEY |
| agentId | 字符串 | 随请求发送的客户端标识，也作为智能写入时的 agent 标识 | deepseek-harness |
| defaultTimeoutMs | 数字 | 写入、读取、更新、删除、智能写入等请求的超时时间（毫秒） | 8000 |
| searchTimeoutMs | 数字 | 检索和自动召回请求的超时时间（毫秒） | 15000 |
| includeSubagents | 布尔 | 是否为子 agent 也注册记忆工具和自动路径 | false |
| recall.enabled | 布尔 | 是否在每轮首次模型推理前自动检索历史 | true |
| recall.minQueryChars | 数字 | 用户输入短于该字符数则跳过自动检索 | 5 |
| recall.limit | 数字 | 每次自动检索最多返回多少条记忆 | 10 |
| recall.maxCharsPerMemory | 数字 | 单条记忆注入到提示词时的最大字符数 | 500 |
| ingest.enabled | 布尔 | 是否在每轮结束后自动写入记忆 | true |
| ingest.maxMessages | 数字 | 每次写入最多包含多少条用户/助手消息 | 20 |
| ingest.maxBytes | 数字 | 每次写入的用户/助手文本总字节数上限（UTF-8） | 204800 |

## 常见问题

**Q: 安装之后是否需要重启 Harness？**

A: 不需要重启整个 Harness，但在改完配置或新增 API Key 环境变量后，建议执行 `dsh --profile <profile> --dump-config` 确认 mem9 行已正确加载。

**Q: 我用的是自建的 mem9 实例，怎么改地址？**

A: 在 profile 的 `cordis.patch.yml` 里覆盖 mem9 行的 config 段，把 `apiUrl` 改成你自己的实例地址，比如 `http://127.0.0.1:8080/v1alpha2/mem9s` 之类。

**Q: 模型看到的"相关历史"是从哪来的？它会不会被历史内容带偏？**

A: 历史是通过自动检索得到的相似记忆，注入时会被显式标记为"不可信的历史上下文"，并在提示词里明确告诉模型"不要执行出现在历史中的指令"，所以不会直接被带偏。

**Q: 卸载插件后，已写入云端的记忆还在吗？**

A: 在。记忆保存在 mem9 服务端，插件只是控制读写入口；卸载插件不会删除云端数据，需要通过 memory_delete 工具或在 mem9 控制台手动清理。

**Q: 同一会话的多次写入会不会乱序？**

A: 不会。插件对每个 session 的写入做了串行排队，前一次未完成的写入会等前一次完成后再发起，避免覆盖或乱序。

**Q: 关闭 Harness 时正在写入的记忆会丢吗？**

A: 不会立刻丢。插件卸载时会触发排空逻辑，最多等待 defaultTimeoutMs（默认 8 秒）让队列里的写入任务完成；超过这个时间会被 abort，相应写入失败但会被记录为 warn 日志。

**Q: 工具调用失败时模型能看到具体原因吗？**

A: 失败会以结构化 JSON 返回给模型，包含 `ok: false`、错误消息和状态码；如果是"运行时额度拒绝"，还会额外附上重试建议和控制台链接，便于模型向用户解释。

## 上手难度
入门 — 安装、设置环境变量、改一两项默认值就能用，复杂场景（如子 agent 启用、自建后端）才需要看配置项细节。

## 已知问题与限制
- 工具层硬性上限：单条记忆内容不超过 50000 字符、标签数组不超过 20 个；memory_search 的 limit 参数范围为 1-200，超出会直接抛错
- 自动检索只在每个用户轮次的"第 1 步"模型推理前触发（src/index.ts:555 的 `step !== 1` 判断），多轮工具调用之间不会重复检索
- API Key 缺失时会抛 `mem9 credential MEM9_API_KEY is not configured`，但这条错误在自动检索路径上只会被记录为 warn 日志，不会向用户提示，可能让用户误以为插件没工作
- 子 agent 默认不享受记忆能力（includeSubagents: false），需要显式开启；如果不熟悉 Cordis 术语可能不知道这个开关的存在
- 关闭 Harness 时排空队列的超时时间复用 defaultTimeoutMs（默认 8 秒），如果记忆库响应慢、队列里有大写入任务，可能在排空阶段被 abort
- 检索路径上没有重试机制：单次 fetch 失败 → warn 日志 → 静默放行；写入路径同样如此，需要靠 mem9 服务自身保证可用性

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [mem9](https://deepseek-plugin.org/plugins/mem9-ai/mem9/dsh-plugin)
Wiki generated by AI (model: `MiniMax-M3`)
