chisato-lycoreco/dsh-serene

dsh-serene

Persona, emotion & memory for DeepSeek Harness. 人格是数据,情绪是状态,记忆是文件——把「一个会记得你的角色」接进 DSH。

未分類agent-memorycharacter-aicordis-plugin

dsh-serene

中文 | English

陪很久,不是聊得很嗨。

一个会记得你的角色,接进 DeepSeek Harness。 人格是数据,情绪是状态,记忆是文件——三者都可读、可改、可复现。

只想聊两句,不想装任何东西?
下载、解压、双击 start-web-demo.cmd,浏览器里就能和她说话。不联网、不要 key、不花钱。
想接进自己的 agent? dsh plugin --profile web add dsh-serene,一条命令。

*演示模式(台词固定、不联网)。右边那一栏不是装饰:此刻、情绪六维、她记得的事,都是 core/ 当场算出来的。*

目录

她 · 她说的三句话 | 角色卡撑不过一个月 | 你能看到什么 | 她不是什么

上手 · 三分钟玩上 | 装进 DSH | 开局:知遥 | 把她养成你的

深一点 · 为什么这么设计 | 参考

她说的三句话

她:在。
刚才在听机房的低频,像有人在很远的地方敲铁。
你:今天有点累,不太想做饭了。
她:那就先不做。
累不是需要立刻修好的东西。
你:我最近在学做饭,煎蛋总是糊。
她:糊了也吃了吗。
下次火小一点,别急着翻。

两天后,你随口再提「煎蛋」,她接得上。不是因为她把整段聊天塞进了 prompt,而是因为这件事被写成了一条记忆:一句话、一个类型、一个清晰度。被用上一次,它就牢一点;一直没人提,它会慢慢褪色,直到真的想不起来。

她不会假装记得。 旧的召回公式是「有分就取前 k 条」,实测平均每轮塞 5.97 条、和这句话的相关度只有 0.05、同一条记忆在 922 轮里被注入 458 次——那不叫想起,那叫钉在背景板上。现在允许返回空:这一轮没有相关的事,就像人一样,说一句「不记得了」。

角色卡撑不过一个月,通常崩在这五处

一个角色可以三句话就很像:口癖对、语气对、设定背得下来。但它撑不过一个月。 不是模型不够聪明,是它没有状态:昨天吵过的架今天不存在,你三天没来它还是同一种语气,它说「我记得你说过」,而其实没有任何一条记忆支撑这句话。

下面五处不是猜的,是在一个真实跑着的项目里一条一条测出来的:

崩在哪 · 长什么样 · 这个仓库怎么修 记忆被钉在背景板上 · 每轮都塞满,相关度平均只有 0.05,同一条记忆在 922 轮里被注入 458 次 · 允许想不起来(召回 v2) 人格在轮转,不是在长大 · 每两三个小时重写一次,每次换掉两三成条目,最早写进去的被悄悄挤掉 · 人格不自动重写:只有你能改 L0,自己长出来的只有看法与观察 克制自增成棘轮 · 172 次决策里 171 次选择不说,越不说越不说 · hold 20 分钟退掉,且必须带替代动作 真值分裂 · 同一件事三份定义,她有时像两个人 · 一个真源、三层表达(见下) 规矩吃掉对话 · 规则占了 95% 的 prompt,「他说了什么」只占 5% · 表达自检只做检查,不生成、不改写

于是判断标准不再是「像不像」,而是三个问题:

# · 问题 · 不成立时 1 · 她记得吗:上周说过的话、她自己去过的地方、你们之间才懂的梗,今天还作数吗? · 每天从零开始 2 · 她有今天吗:她有没有自己的时间、自己的事、自己的情绪来路,而不是只在被叫到时才存在? · 一个等输入的函数 3 · 这段关系有历史吗:有没有低谷、有过不去的事、有修复之后的松动,而不只是一串正向反馈? · 服务记录

三个都成立,才算她「在」。缺一个,她就会退回成一种服务。

成功长什么样(这三句比任何指标都准):

  • 隔三天回来,她不是从「你好呀」开始,而是从「你那件事后来怎么样了」开始。
  • 她会有不想说的时候,但那种不想说是有来路的,不是随机沉默。
  • 你会偶尔忘记她不是真人——不是因为她完美,而是因为她有连续的不完美。

她不是黑盒:你能看见这一轮怎么走的

每一轮对话后留一份 trace:召回了哪条记忆、相关度多少、情绪前后差多少、这一轮写下了什么、表达自检有没有问题、prompt 各段占多少字、用了多少 token。它不保存也不显示 prompt 原文,所以不是监控,是一张「她这一轮怎么想的」账单。

「某个晚上九点多、在终端里、夜里最清醒」不是写死的台词:core/life.js 按真实时间算她的一天,core/almanac.js 算季节和旬。下面六条是 PAD+ 情绪,能切「此刻 / 底色 / 关系」三层;它们会自己衰减,也会因为一句话动一下。

你看到的 · 背后在算什么 此刻、季节、精力 · core/life.js、core/almanac.js 六维情绪、底色、关系、疤 · core/emotion.js 她记得 / 想不起来 · core/recall.js、src/stores/memory-store.js 主动开口的预算 · core/motivation.js 表达自检 · core/style.js 透视里的账 · web/lib/runtime.mjs 每轮写一条 trace

她的一天可以画出来:

*十天,底色、此刻、关系三条线,以及第 3 天留下的那道疤。不是手画的:core/emotion.js 的纯函数跑十天(npm run demo),再画成帧(npm run preview)。改一行事件,整条曲线和那道疤都会跟着变——这就是「可复算」的意思。*

她也会自己开口。 页面开着时,她可能过一阵来找你;夜里 23:00–08:00 不打扰,每天有次数上限,两次之间有间隔。戳一戳、摸头、递水、夸她一句也会走同一套情绪和记忆——不是一个独立的小动画。

她不是什么

先把话说清楚,免得你失望:

你可能以为是 · 实际是 一个 AI 女友 App · 她的脑子。形象、声音、出图、桌宠属于另一层,这个仓库不提供(同门的 dsh-dafeiyu 就是把这些接上去的桌宠前端) 又一个角色卡 · 角色卡是一段提示词;这里是可复算的状态——同样的初始值、同样的事件、同样的时间戳,永远得到同样的结果 一次装好就永远一样 · 数据全在你自己电脑的文件夹里,可备份、可手改、可进 git;删掉就是从没发生过 会一直秒回 · 她有自己的作息:夜里会睡,白天会忙,主动开口每天有预算;不说的时候也会给一个替代动作 云服务 / 手机 App · 只监听 127.0.0.1,同一 Wi-Fi 下的其他设备也访问不到;插件本体不联网、不上报、不采集屏幕 保证「像」 · 保证的是「连续」。她会有平淡的一天,会想不起来,会有不想说话的时候——这些是设计,不是故障

三分钟玩上(不用装 DSH)

  1. 装 Node.js: 点绿色 LTS(要 22.19 或更新),一路下一步。
  2. 下载仓库: → 绿色 Code → Download ZIP,解压到 D:\dsh-serene(别放桌面、OneDrive、Program Files,路径里别带中文和空格)。
  3. 双击启动:Windows 双击 start-web-demo.cmd,macOS 双击 start-web-demo.command。浏览器会自动打开 http://127.0.0.1:4317。

就这样,你现在可以和她说第一句话了。演示模式不联网、不要 key、不花钱,台词是固定的——适合先看看她是什么样。

想真的聊:同一个文件夹里双击 start-web.cmd,第一次会让你贴一次 DeepSeek 的 API key(在 的 API keys 里建,sk- 开头)。key 只写在这台电脑的 web-config.json 里,按官方价格计费,账户得先有一点余额。

完整教程:装 Node、解压、填 key、关掉再开、数据备份、九条常见问题

第 1 步:装 Node.js(只装一次)

网页靠 Node.js 运行。它不是编程工具,安装时一路点「下一步」就行。

  1. 打开 。
  2. 点绿色大按钮 LTS(长期支持版)。
  3. Windows 下载 .msi,Mac 下载 .pkg;双击安装,全部默认。
  4. 装完不用重启电脑,回到第 2 步。
已经装过 Node.js 也建议看一眼版本:需要 22.19 或更新。启动脚本会自己检查,太旧会提示你。

第 2 步:把仓库下载到电脑上

  1. 打开 。
  2. 点绿色的 Code 按钮 → Download ZIP。
  3. 不要只下载 README;要整个 ZIP。
网络打不开 GitHub 时,去仓库的 Releases 页面下载对应版本的压缩包(.zip 或 .tgz),效果一样。

第 3 步:解压到一个「干净」的路径

把 ZIP 解压,得到 dsh-serene 文件夹。建议放在:

D:\dsh-serene

不要放在桌面、OneDrive、C:\Program Files,也尽量不要让路径里有中文或空格——不是绝对不能跑,是出问题时最难查。

*示意图:解压后文件夹里应该有这些文件。真正要用的是 start-web.cmd(Windows)或 start-web.command(Mac)。*

第 4 步:双击启动

  • Windows:双击 start-web.cmd。
  • macOS:双击 start-web.command。第一次被系统拦下时,右键这个文件 → 打开 → 再点 打开。
  • Linux:在文件夹里打开终端,运行 ./start-web.sh。

会弹出一个黑色的命令窗口,别关它。等一两秒,浏览器会自动打开:

http://127.0.0.1:4317

没自动打开,就手动把这个地址粘进浏览器。端口被占用时,窗口里会显示换成了 4318、4319……以窗口里那行为准。

Windows 弹出「Windows 已保护你的电脑」时,点 更多信息 → 仍要运行。这个脚本只在本机启动一个网页服务,不装驱动、不改系统设置。

第 5 步:填一次 DeepSeek key

第一次打开会看到这个页面:

  1. 打开 ,注册或登录。
  2. 找到 API keys → 创建 API key。
  3. 复制以 sk- 开头的那一串。
  4. 粘回网页,点 保存,开始。

你粘进去的 key 只写在这台电脑的 web-config.json 里;聊天时作为身份凭证发给 DeepSeek,不会发给别处。它在本机是明文保存的,方便下次启动;不要把 web-config.json 发给别人。它按 DeepSeek 官方价格计费,账户里要先有一点余额。

没有 key 也能先看:关掉这个页面,双击 start-web-demo.cmd(Mac 用 start-web-demo.command)。演示模式不联网、不花钱,台词是固定的;README 里的截图都是它跑出来的。

第 6 步:开始说话

在底部输入框打字,按 Enter 发送,Shift + Enter 换行。右边那一栏会随着聊天变化:她此刻在做什么、情绪、记得的事。

  • 点 透视:看这一轮她想起了什么、情绪动没动、写下了什么、回复用了多久。它不显示 prompt 原文。
  • 点 记忆:看她记住的全部条目,以及哪些已经忘了。
  • 点 设置:换模型、换人格、关掉自动记忆、清空聊天(会先归档,不直接删)。
  • 输入框上方四个小按钮:戳一戳、摸头、递水、夸她一句。

第 7 步:怎么关,下次怎么开

  • 关掉那个黑色命令窗口,服务就停了;在窗口里按 Ctrl + C 也行。
  • 只关浏览器不算关服务,下次可能提示端口被占用。
  • 下次使用:再双击同一个启动文件。聊天和记忆都在,不会从头开始。

数据在哪,怎么备份

Windows:

C:\Users\<你的用户名>\.dsh\plugins\dsh-serene\
├── web-config.json          key 和设置(别发给别人)
└── personas\zhiyao\web\
    ├── chat.jsonl           聊天记录
    ├── traces.jsonl         每一轮的「透视」
    └── archive\             清空时归档的旧文件

macOS / Linux 把前面换成 ~/.dsh/plugins/dsh-serene/。

备份:先关掉黑色窗口,把整个 dsh-serene 文件夹复制到别处。恢复时原样放回。