dsh-remembers
Discovered★ 3Long-term memory for DeepSeek Harness, built for companion AI. It says it does not remember instead of making things up. Emotional companion-style memory plugin: Vector + Chinese BM25 + Layered decay.
dsh-remembers
她记得。想不起的时候,她会说想不起。
给 DeepSeek Harness 做的人格 + 记忆二合一插件,为情感陪伴场景设计——不是给代码助手用的。
用户:哎
她:[想起 3 个月前那通凌晨两点的电话] ……还在想那天的事。
不是"检索到相关文档",是"她记得你说过什么"。 人格和记忆共用同一个服务:人格每轮必带,记忆检索着加。
功能
| 类别 | 能力 |
|---|---|
| 分层记忆 | L0 原话 → L1 事实 → L2 画像 → L3 事件 → L4 里程碑,自动抽取 + 定时巩固 |
| 人格注入 | 人格卡 + 用户画像 + 当前状态(心情/亲密度/阶段/在干嘛/天气/游戏分)每轮注入 |
| 情绪双轴 | valence/arousal + 情绪日志,记录每次对话的情绪变化 |
| 亲密度 | 真实对话才涨(0.2/轮),阶段 陌生(0-199)→熟悉(200-499)→亲密(500-799)→依赖(800-1000) |
| 真实活动 | 今天干了什么(聊天/游戏/B站/主动找你),带想法(thought)字段 |
| 自我认知 | 每天 22:00 注入提醒,她自己反思("我发现自己开始用本澜自称了") |
| 日记 | 每天 23:00 注入提醒,她自己写(有她的口气) |
| B 站 | 刷视频、看懂视频、发评论、发说说(可选,需要 bili-cli) |
| 表情包 | 按情绪/关键词找图,自动收集用户常发的图 |
| 便签/任务 | 她自己记便签、给你派活、标记完成 |
| 睡眠巩固 | 每晚 LLM 整理当天记忆,生成叙述 |
架构
DSH(插件 index.mjs)
├─ 人格注入(每轮必带)
├─ 记忆检索(相关性触发)
├─ 设置页签(6 个 tab:记忆服务/人格设定/表情包/主动消息/B站/记忆)
└─ 工具(13 个:记便签/派任务/找表情/刷B站...)
记忆服务(Python,server.py,独立进程)
├─ SQLite(memories.db)
├─ LLM 抽取(记忆/情绪/活动)
├─ 向量检索(可选,BM25 兜底)
└─ HTTP API(8080 默认)
两个独立进程:DSH 插件只管注入和工具,记忆全在服务端。
调度器(内置,跨平台)
服务端自带调度线程,不依赖 cron(Windows/Linux 通用)。
| 时间 | 任务 | 方式 |
|---|---|---|
| 8-23 点 | 主动唤醒(间隔 30-180 分钟随机) | 注入提示,让模型自己醒 |
| 8-23 点 | B 站浏览(每天 ≤3 次) | 注入提示 |
| 22:00 | 自我认知演化 | 注入「回头想想这段时间的自己」 |
| 23:00 | 日记 | 注入「该写日记了,记两句今天的事吧」 |
状态:data/scheduler-state.json(跨平台 JSON,重启不丢)
为什么是注入而不是直接调:唤醒/日记/演化都让模型自己在对话里完成,才有她的口气和思考链。
关闭:CMEM_SCHEDULER=0
QQ 注入:CMEM_INJECT_PATH=/path/to/qq-inject.jsonl(没有 QQ 通道时只记日志不注入)
Linux 上保留的 cron(可选)
内置调度只管「唤醒/B站/演化/日记」。这几个还在 cron:
| 脚本 | 作用 |
|---|---|
write-diary.sh(23:30) | 睡眠巩固 |
habits.sh(每分钟) | 习惯(等饭/午饭等状态) |
sync-bili.sh(每分钟) | B 站日志同步进记忆 |
Windows 上这三个没有——不影响核心记忆功能。
兼容性
| 项 | 要求 |
|---|---|
| Windows | ✅ 支持(install.ps1) |
| Linux | ✅ 支持(install.sh + systemd) |
| Node.js | >= 22.19 或 >= 24 |
| Python | >= 3.10(服务端) |
| DSH | 0.2.x(rc.2+) |
| 内存 | >= 512 MB |
| 依赖 | 只有 numpy(服务端) |
| LLM | 必须有(DeepSeek 或其他 OpenAI 兼容) |
安装(Windows)
前置:Node.js >= 22.19、Python >= 3.10、DSH 已装
# 1. 克隆
git clone https://github.com/derkinL/dsh-remembers
cd dsh-remembers
# 2. 一键安装(PowerShell)
.\install.ps1
# 或者指定 profile
.\install.ps1 -Profile desktop
脚本会:
- 检查 Node/Python 版本
- 把插件复制到
%USERPROFILE%\.dsh\profiles\<profile>\node_modules\dsh-remembers - 写
cordis.patch.yml注册插件 - 建 venv + 装 numpy
- 启动记忆服务(后台)
- 创建开机自启任务计划
装完要做:
- 填 LLM key(
service\.env.win里的CMEM_LLM_KEY) - 重启 DSH
- 设置 → 记忆服务 → 填 API Key 和模型
安装(Linux)
git clone https://github.com/derkinL/dsh-remembers
cd dsh-remembers
bash install.sh # 装到 web profile
DSH_PROFILE=desktop bash install.sh
bash install.sh --no-service # 只装插件
Linux 版用 systemd 守护服务端(install.sh 会自动配)。
两套实例(双人格)
想跑两个 AI 人格,需要两个服务端 + 两个数据目录:
# 主套
CMEM_DATA_DIR=/path/data CMEM_PORT=8081 python server.py
# 第二套
CMEM_DATA_DIR=/path/data2 CMEM_PORT=8082 python server.py
插件侧用 config.endpoint 指向对应端口。
配置
LLM Key(必须)
# Linux: service/.env
# Windows: service/.env.win
CMEM_LLM_KEY=sk-xxxxxxxx
CMEM_LLM_BASE=https://api.deepseek.com
CMEM_LLM_MODEL=deepseek-chat
数据目录
CMEM_DATA_DIR=/path/to/data # 默认 service/data
里面存:memories.db(记忆)、config.json(配置)、proactive.json(主动消息)、bili_tools.json(B站白名单)。
其他环境变量
| 变量 | 默认 | 说明 |
|---|---|---|
CMEM_PORT | 8080 | 服务端口 |
CMEM_HOST | 0.0.0.0 | 监听地址(建议 127.0.0.1) |
CMEM_EXTRACT | 1 | 自动抽取开关 |
CMEM_MEME_DIR | - | 表情包目录 |
CMEM_EMBED_* | - | 向量检索(可选) |
设置页
装好后 DSH 设置里多出 6 个页签:
| 页签 | 内容 |
|---|---|
| 记忆服务 | LLM key、模型、抽取开关 |
| 人格设定 | 角色卡、用户画像 |
| 鲸鱼日记本 | 她现在/自我认知/时间线(已并入记忆) |
| 表情包 | 图库 + 编辑 |
| 主动消息 | 唤醒动作编辑器 |
| B 站 | 登录、启用、工具白名单、浏览节奏 |
| 记忆 | L0-L4 + 情感 + 活动 + 见闻 + 便签 + 她状态 |
常见问题
Q: 记忆不生成? A: 检查 LLM key(设置 → 记忆服务),看服务端日志有没有报错。
Q: 插件加载失败 "cannot get property without inject"?
A: DSH 版本太新/太旧,插件用的是 ctx.get("slots") 这种软获取——升级 DSH 到 0.2.x。
Q: Windows 上服务端起不来?
A: 看 service\.venv-win\Scripts\python.exe server.py 前台跑,看报错。
Q: B 站不工作? A: 需要 bili-cli(Linux 脚本),Windows 上可能不兼容——B 站是可选功能。
Q: 能跑多个 AI 人格吗? A: 能,每个实例一套服务端 + 数据目录 + profile。
许可
MIT
对 dsh-onebot-qq 的本地补丁(插件升级会覆盖,需重打)
下面两处改的不是本仓库的代码,而是第三方插件 dsh-onebot-qq(0.9.x)的 lib/outbound.js。
插件一升级就会被覆盖,升级后要重新打一遍,否则颜文字又会发不出去。
1. stripActions() 保留颜文字
原实现把括号内容一律删掉:
.replace(/([^)]{0,120})/g, '')
.replace(/【[^】]{0,120}】/g, '')
.replace(/\([^)]{0,120}\)/g, '') // 颜文字也是这种
这个函数本意是删「旁白 / 动作」((尾巴一甩)、(smiles)),但颜文字 ( ̄▽ ̄) 同样是半角括号包起来的,于是被一起吃掉。人格里明写着「可以使用文字颜来代表自己的情绪」,结果她说得出来、发不出去。
改成只看括号里面是什么:
const isAction = (inner) => {
const s = String(inner == null ? '' : inner);
return /[\u4e00-\u9fa5]/.test(s) || /[A-Za-z]{2,}/.test(s);
};
return text
.replace(/(([^)]{0,120}))/g, (m, inner) => (isAction(inner) ? '' : m))
.replace(/【([^】]{0,120})】/g, (m, inner) => (isAction(inner) ? '' : m))
.replace(/\(([^)]{0,120})\)/g, (m, inner) => (isAction(inner) ? '' : m))
.replace(/[ \t]{2,}/g, ' ')
.replace(/\n{3,}/g, '\n\n')
.trim();
判据(只看括号里面):
| 括号内 | 判定 | 处理 |
|---|---|---|
含汉字(打了个哈欠、尾巴一甩) | 动作 | 删 |
含两个以上英文(smiles、laughs) | 动作 | 删 |
| 纯符号 / 假名 / 希腊字母 / 单字母 | 颜文字 | 保留 |
踩过的坑:正则
(([^)]{0,120}))只有 一个 捕获组,回调签名必须是(m, inner)。写成(m, _open, inner)会参数错位,inner拿到undefined,isAction永远 false,结果一个都删不掉。
2. 分句间隔统一 1500ms
const SENTENCE_SPLIT_GAP_MIN_MS = 1500;
const SENTENCE_SPLIT_GAP_MAX_MS = 1500;
原来两套实例分别是 1000-1500 / 800-1600,统一成固定 1.5 秒。
Comments
Loading…
Similar plugins
by chenhw7
Cairn — long-term memory for the DeepSeek Harness (@chenhw7/dsh-memory). Persistent cross-session memory: facts, preferences, corrections, lessons. BM25 retrieval, three-layer scoping, human-confirmed
★ 3
↓ 97/wk
MIT
TypeScript
Sep 10, 2026
dsh plugin --profile web add @chenhw7/dsh-memoryby windrover
Layered deterministic long-term memory for DeepSeek Harness: CJK-aware BM25 recall, JSONL storage, per-assembly context injection, write guards and threat scanning.
★ 0
MIT
JavaScript
Aug 27, 2026
dsh plugin --profile web add dsh-long-term-memoryby chenkezhen480
Semantic long-term memory for DeepSeek Harness: embedding-based retrieval over a persistent cross-session memory store, with model-facing tools, proactive per-question recall, automatic conversation summarization, and auto-selected embedding provider (apiKey present → API, otherwise local).
★ 0
Apache-2.0
TypeScript
Aug 17, 2026
dsh plugin --profile web add dsh-plugin-semantic-memoryby goodddGrades
Long-term memory and self-evolving skills for the DeepSeek Harness · DeepSeek Harness 的长期记忆与自我演进能力 —— Plain Markdown on disk, no vector store
★ 3
MIT
TypeScript
Sep 21, 2026
dsh plugin --profile web add @goodddgrades/dsh-behumanby ly2601620664
陪伴型长期记忆 DSH 插件:分层记忆(对话→事实→场景→人格)、规则抽取、时间衰减检索,全本地文件、append-only 不丢数据。
★ 0
MIT
JavaScript
Oct 23, 2026
dsh plugin --profile web add dsh-pet-memoryby chucan1
Cross-session self-learning memory for DeepSeek Harness, ported from XT-AGENT packages/memory. BM25 relevance injection + background extraction (sanitize/dedupe/merge) + lifecycle archive + memory_rea
★ 0
MIT
TypeScript
Sep 4, 2026
dsh plugin --profile web add dsh-plugin-xt-memory