dsh-memu-memory

memorytested: passnpmMIT

Memory for long-form RP and companion chats: three fading layers, per-turn recall, source labels, character and world boundaries, a relationship graph, image attachments and a WebUI.

下载量 / Downloads
2,350
依赖体积 / node_modules
33.04 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

Install

dsh plugin --profile web add dsh-memu-memory

Sandbox test results

StageResult
1 install✓
2 list✓
3 mount✓
4 boot—

Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).

README

<p align="center">

<img src="assets/icon-256.png" width="88" height="88" alt="dsh-memu-memory">

</p>

<h1 align="center">dsh-memu-memory</h1>

<p align="center">

给 <b>DeepSeek Harness</b> 的本地优先记忆插件 —— 按文件夹共享、按对话绑定、由 agent 自己写、

在后台整理,并且对「它不知道的事」保持诚实。

</p>

<p align="center">

<a href="https://www.npmjs.com/package/dsh-memu-memory"><img alt="npm version" src="https://img.shields.io/npm/v/dsh-memu-memory?color=4d6bfe"></a>

<a href="https://www.npmjs.com/package/dsh-memu-memory"><img alt="npm monthly downloads" src="https://img.shields.io/npm/dm/dsh-memu-memory?color=4d6bfe"></a>

<a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/npm/l/dsh-memu-memory?color=4d6bfe"></a>

<a href="package.json"><img alt="DSH: >=0.2.0-rc.1" src="https://img.shields.io/badge/DSH-%E2%89%A50.2.0--rc.1-4d6bfe"></a>

<a href="package.json"><img alt="Node: >=20.9" src="https://img.shields.io/badge/Node-%E2%89%A520.9-4d6bfe"></a>

</p>

<p align="center">

<a href="README.md">English</a> | 中文

</p>


dsh-memu-memory 面向长篇 RP 与陪伴对话,给 DSH 一份「像记忆」的记忆,而不是一本日志:三种留存层会淡;首轮有锚点,之后每个用户回合最多召回一次;来源不能被悄悄从「我推断」升级成「对方说过」;互相矛盾的记忆会挂起等待裁决,明确标成同一事实的两个版本则并排保留并给出冲突卡,而不是被悄悄合并;几乎相同的事实只入一条、召回时同簇只占一席;关系可以是一条带证据的边。说话人、角色、世界线与剧情分支构成硬边界,角色「知道什么」与实际发生过什么分开保存。

默认本地优先。agent 后端把完整正文放在 JSON 索引里、用词法检索——不需要 Python、embedding 服务或 API key。api 后端才把检索交给可选的、锁定版本的 MemU 引擎(向量)。MemU 是「想要就用」的后端,不是插件能否启动的前提。

[!WARNING]
早期版本提示。 本插件仍处于早期阶段,可能存在无法预见的错误、bug 或不兼容变更。请先备份数据;欢迎提交 Issue 或 PR 帮助改进。
状态: 1.2.8。首个公开发布版本为 1.0.0。细节文档已迁到 [docs/](docs/),[AGENTS.md](AGENTS.md) 只做索引。升级前请备份 ~/.dsh/dsh-memu-memory;如果要存无法重建的数据,请先读[兼容性与边界](#兼容性与边界)。

基准测试

公开的 chat-memory-benchmark 714 题完整卷(2026-11-06,dys-router / deepseek-v4.1-flash,high 思考强度)通过 653 / 714(91.46%)。同一轮实测记忆成本为 ¥16.05;包含非记忆开销的总成本为 ¥24.45(总 token 75,517,851,谷价),均为端到端实测,不是按单次会话外推。

界面

以下截图均为真实 WebUI 在隔离示例数据上的画面,不是任何人的真实记忆。

<table>

<tr>

<td align="center"><img src="assets/screenshots/webui-memory.jpg" width="470" alt="记忆墙"><br/><em>MemU WebUI · 跨库记忆墙</em></td>

<td align="center"><img src="assets/screenshots/drawer.jpg" width="470" alt="原地详情"><br/><em>不离开记忆墙就能编辑、归档、恢复</em></td>

</tr>

<tr>

<td align="center"><img src="assets/screenshots/relations.jpg" width="470" alt="关系图与邻接列表"><br/><em>关系图与邻接列表在同一视图里</em></td>

<td align="center"><img src="assets/screenshots/settings.jpg" width="470" alt="设置"><br/><em>注入、预算、留存与自动化</em></td>

</tr>

<tr>

<td align="center"><img src="assets/screenshots/stats.jpg" width="470" alt="统计"><br/><em>每日活跃、命中分布与归档候选</em></td>

<td align="center"><img src="assets/screenshots/webui-dark.jpg" width="470" alt="深色主题"><br/><em>深色主题 · 同一套层次与动效</em></td>

</tr>

<tr>

<td align="center" colspan="2"><img src="assets/screenshots/mobile.jpg" width="360" alt="窄屏"><br/><em>窄屏 · 侧栏折成横向标签</em></td>

</tr>

</table>

它记住什么

  • 三层,一条时间线。 short_term 草稿默认 72 小时到期;long_term 是记忆主体;must_remember 需要理由与来源,按 365 天半衰并带 0.35 强度地板,可以边缘化,但不会为腾名额被自动删除。
  • 召回是一个瞬间,不是一次倾倒。 新会话或压缩后的第一个回合得到锚点块(pin / core / global 分段预算);之后每个用户回合最多一次召回。去重与 token 预算由代码执行,不交给提示词自觉。
  • 日期要么是纪念日,要么是一天。 MM-DD 每年复发(生日);YYYY-MM-DD 在前一天和当天各响一次,之后就算用过了。说「今天 / 明天 / 下周X / 月底」的相对日期会按这一轮的场景时间换算成绝对日期再存;说「明天」的记忆存成带年份的日期,不会变成每年都冒出来的周年。
  • 记忆会不均匀地淡。 新近、访问次数、峰终、首因、习惯化、闪光灯记忆的准确度共同参与强度。情绪用四项构成(joy / anger / sorrow / fear,和为 1)加唤醒度 arousal(强度)与掌控感 dominance 描述;「嫉妒」这类复合情绪是四项的具名混合比例,不是新维度。情绪只影响召回排序:不进注入文本,也不改记忆正文。门控是三条独立条件的 OR——主导项占比 ≥ 0.35、|arousal − 0.35| ≥ 0.1、|dominance| ≥ 0.25;三条都不满足时两项乘数恒为 1。旧条目没有 emotion 时继续走原来的 valence 路径,不从旧 valence 反推四轴。一条生动但可能记错的记忆会显示「细节未必准」,而不是假装确定。
  • 来源是事实,不是文风。 每条记忆带 source / source_kind(user_said / assistant_said / told / imagined / inferred / tool)、speaker_id、confidence、accuracy 与说出口径。模糊的推断不能冒充原话,助手自己的承诺和计划也不能记成用户说的。
  • 矛盾不会被悄悄合并。 普通矛盾仍进入 pending_review:不注入、不召回,只出现在复核队列,等人或整理作业裁决。写入方明确把两种说法标成同一事实的版本(conflicts_with)时,两条都保持 active、一起召回并注入一张冲突卡;显式 supersedes 才退休旧条,正文不删。
  • 秘密不进自动召回。 secret、群聊频道、角色、世界线、剧情分支与 knownBy 共同约束读写;secret 永远不会被自动注入,但同文件夹里主动检索仍然读得到——它挡的是「自己冒出来」,不是保险箱。真正把同一文件夹里的两段对话隔开的是 context 作用域(channelId / characterId / worldId / branchId);两边都没填就是同一个作用域,这正是「文件夹」的含义。旧的 visibility: 'session' 级别已删除:读到就按 shared 处理、context 原样保留,仍存着该级别的库用 node scripts/migrate-visibility.mjs 重写(--apply 才写,先备份)。
  • 人与故事是有结构的。 群聊用稳定的 speakerId / channelId,不拿显示名当身份;RP 用 characterId / worldId / branchId 隔离知识。关系边有理由和置信度,实体改名不动记忆正文,关系当前状态(熟悉、信任、温度、边界、承诺)是带证据和历史快照。
  • 图片是指针加描述,不是假装能看图。 附件按 SHA-256 去重、有配额、分三级留存;没有描述时只记「收到一张图片」,绝不编造画面。
  • 整理在后台。 整理跑在种子 fork 子会话里,不会在你的待发区多出一轮;失败退避重试,不伪记成功。

主动记忆:实测触发与月开销

空闲整理不是“每个安静会话都 fork”。进 fork 前会先给上次游标之后的证据打分:真人回合 H、内容量 C(真人文字 + 助手正文 + 去重后的成功工具结果,单结果最多 2000 字符)、有效工具工作单元 U,score = 0.35min(H/3,2) + 0.45min(C/4000,2) + 0.20*min(U/20,2),默认门槛 0.8。空闲 15 分钟时,只有小会话能凭饥饿直接唤醒;2000 条事件以上的 transcript 必须分数达标,因为宿主会种完整前缀。近期整理过或注入过记忆的会话不 fork。

整理不是越勤越好:大 transcript 的薄回合会被守卫跳过(同一批用例上约 −37% prompt token,代价是被跳过的那几个用例里约 1/22 条标签晚一点进记忆),但待整理区间超过 600 事件时无条件是检查一次,避免长会话早期的决定永远进不了记忆。

用本机 4 个真实长会话做只读回放(不开新对话),统计合格回合:

会话 · 事件数 · 回合数 · 分数触发 · 未达分数 · 游标后新真人回合

62056bff… · 5,913 · 12 · 6 · 6 · 0

adedb9ac… · 5,766 · 23 · 16 · 7 · 0

e38a0de0… · 85 · 2 · 0 · 2 · 0

edf7dc5c… · 78 · 4 · 0 · 4 · 0

两条小会话的未达分数回合仍可能因饥饿唤醒;2000 条事件以上的大会话不会。四个会话在真实游标之后都没有新的真人输入,因此不会立即再 fork。

714 题完整卷的通过率与实测成本见[基准测试](#基准测试)。

一个 WebUI

侧边栏只留一个入口:MemU WebUI。记忆墙与全部设置在同一套导航内,支持深链,如 #/settings/memories、#/settings/folders、#/settings/stats。

私有 / 全局分组与多选。 「MemU 记忆」页按 私有 / 全局 分块(默认私有),私有块支持多选:批量归档、恢复、彻底删除(两段确认),一条失败不影响其余成果。「全局记忆」页每条记忆带「查看此记忆」,点击直达 MemU 记忆页对应条目。

原地操作。 点记忆卡片会从右侧滑出详情抽屉:完整正文,以及决定它行为的字段——标题、正文、标签、说出口径、置信度、未了之事——外加保存、归档、恢复,以及需要重编辑时的「在记忆浏览中打开」。已归档的记忆可以直接在抽屉里删除:第一次点击只是准备,第二次才真正删除。全局记忆在抽屉里只读,并给出跳转。筛选条件与滚动位置保持不动。带图片的卡片会把第一张可用附件作为封面,抽屉里展开

…(truncated)

Rendered from the README published on npm. Formatted only, not edited.

Versions

Published on npm::13,最后更新 2026-11-06

Links

GitHub · Homepage · npm

Same category