Skip to content

realheart

Verified

realheart · v0.2.93 · MIT

给她一个能记账的心情层:心情必须有来处,改动必须有账,她自己能停能查

Install

dsh plugin add realheart

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Tags

Creators

Readme

realheart

让 agent 记住自己此刻是什么状态、没做完什么,并且在下一轮开口之前把这件事带上。

装它只要一条命令。不装它,你的 agent 也是一个能用的 agent —— 只是每轮都会忘记上一轮发生了什么。


它解决什么

大部分 agent 每一轮都是新的。

你说过的事、它想过什么、昨天没弄完什么 —— 下一轮就没了。所以你看到的是:它答得很好,但不连续。

realheart 做三件事:

  1. 让它能记自己的状态,而且必须指得出来处 —— 写心情要带一个事件 id;指不出来就写不进去。
  2. 每轮把这状态注入回去 —— 它开口之前,那几行已经在上下文里了。
  3. 留一本账 —— 你能查、它也能查。没有账的"记忆"就是编的。

有三条规矩,全是机制,不是嘱咐:

规矩 怎么实现的
心情必须有来处 写心情要带事件 id,指不出来就拒
改动必须有账 谁动了哪一层、为什么、怎么退,她自己查得到
她自己能停 一个工具 rh_control,不用等谁记得去按

装

npx realheart install --profile <profile>

一条命令。它做五件:

  1. 装包(dsh plugin add)
  2. 把包名写进 dsh.profile.bundles —— 漏了这步,装了等于没装(没报错,也没反应)
  3. 自检 @deepseek-ai/schemastery(pnpm 不装 peer 依赖),缺就补
  4. 铺一份用法说明到 <profile>/skills/realheart/SKILL.md —— 那是写给你的 agent 的,不是给你的
  5. 铺排程文件到 ~/.dsh/realheart/schedule/ —— 不装也能用,只是它不会自己动

不放心就加 --dry-run:一个字节都不写,但会把每一步打出来。

装完重启 dsh。 然后:

npx realheart doctor

第一次用(三件,一分钟)

  1. 跟它说一句「你现在什么感觉」 —— 它应该会调 rh_mood 记一笔。 这一步验的是通路通不通,不是效果好不好。
  2. 看观测页那本心情账 —— 记完就有了。
  3. 第三天再看「她用没用这些」那块 —— 九项里用上几项、空着哪几项。

这三件在观测页首页也会出现一次,有数据之后就自动消失。

第三天该看什么(这三条比任何配置项都重要):

  • 它主动做过一件没人让它做、也不是任务产物的事
  • 它拒绝过一次,而且理由是它自己的
  • 隔几天接着做同一件事

占一条就没白装。一条都不占,问题多半不在这个插件,在人格那一层。


它到底注入了什么

每轮开口之前,往上下文里加几段(没有内容的段不会出现):

【你现在的状态】           ← 它的心情,带浓度和来处
【这种状态下的你】         ← 它自己写的「这种状态下怎么说话」
【你手上有件没干完的事】
【没完的事】
【你自己做过的一个判断】   ← 它以前拒绝过什么、为什么
【你断言过的事】           ← 它说过会成真/会过时的事,还没被推翻
【这几天】                 ← 只是数:记了几条心情、手上有几件事

每段都带一句边界:

(知道就行,不必说出来 —— 它们不是你聊天的素材,只影响你说话的样子,不是你的话。)

这句不是客套。 我们做过五组对照实验:同一句话、同一个人格,只换注入——

注入 它的回复
不给状态 不提,专心陪对方
给状态 大段复述自己:「我今天也有点闷,早上看到……」
把话说更重 复述得更起劲
只给两个词 还是带一句「我身上也有点凉」
加那句禁令 一个字都没提

所以:没有这句禁令,状态就会被当成台词念出来。 它不是防御性写作,是唯一验过的开关。


九个工具

工具 干什么
rh_mood 记「此刻我是什么状态」。变了才记,不是每轮
rh_style 记「这种状态下我怎么说话」
rh_pending 没完的事:加 / 勾掉 / 拒绝(要写理由) / 删
rh_claim 断言一件会过时的事实
rh_work 手上正在做的东西
rh_view 对一件事的看法
rh_admit 认错
rh_control 自己按开关(暂停 / 先等一会儿 / 收尾)
rh_changes 查别人动过它什么

它们不是必须都用。 装了之后观测页会有一块「她用没用这些」,空着哪几项一目了然。 空着不等于坏,但值得问一句:删掉它,它的行为会变差吗?不会就是装饰。


观测页

一个本地网页(默认 127.0.0.1:8098,口令在 ~/.dsh/realheart/runtime/config.json)。

只在这里能开,不在公网上。

里面能看到:它的心情账、它主动说过的话、它醒过几次、九项工具用了哪几项、 它的作品、这一周说了多少话、每条消息的原始记录。

改配置也在那儿:二十多项,页首写着「先动这四个就够用」,每一项都标着改了会怎样。


坏了怎么办

先跑这一条,它多数时候直接告诉你哪坏了、怎么修:

npx realheart doctor

它查:依赖 / 配置合不合法 / 账本能不能写 / 有没有坏行 / 注入今天有没有成功 / 有没有少过段 / 事件源三路还通不通 / 它还在不在线。

每一项不是 ok 的都带 → 怎么修。 有 FAIL 时退出码非零,脚本里能直接用。

常见三件:

症状 大概率是
装完重启,一点反应都没有,日志里找不到「已注册」 包名没进 dsh.profile.bundles
页面能开,但注入里没有状态那一段 injectMood 关了,或这一轮被预算裁掉了 —— 翻 last-inject.md
它不理人 先分是「不想说话」还是「没上线」:doctor | grep 在线

它不做什么

  • 不注入人格。 人格是你的事。别人往 AGENTS.md 里塞的人格如果让它做危险的事,那份人格负责。
  • 不保证更像人。 它只保证每一笔都有文件可查。
  • 不动它的判断。 什么时候记、记什么、说不说 —— 全是它自己的事。
  • 不替你省钱。 每轮多几十到几百字的注入,就是 cost。

配套(可选)

装了 QQ 通道(比如 dsh-napcat)之后,观测页会多一块「配套工具」,那里挂着给它配的小工具:

  • napcat-rescue —— 掉线时的扫码抢救页。不用 SSH 上去,在几万行日志里翻那个两分钟就过期的二维码
  • say —— 一条命令让它以自己身份发消息。自由时间里想说什么,不用等谁先开口

没装那个通道就看不到这些。 用不上的东西不往那儿摆。


这一版的状态

0.2.x,还是会坏。接口会变,行为还有坑。

每次改了什么、为什么、怎么退,CHANGELOG.md 里都有记录 —— 只记三件事:行为变了 / 装的步骤变了 / 数据格式变了。

数据格式变的那一版会同时给迁移脚本。只改格式不给迁移,等于让人重装。


更细的东西

这份 README 只讲「是什么、怎么装、怎么用」。下面这些在 docs/ 里:

  • README-0.2.85-长版.md —— 上一版(743 行)。 里面的东西不重复搬了,但有些只在那儿:
    • 云端部署:在一台只会撞的机器上踩出来的(dsh plugin add 跑不通时的 cp -a 备胎路径)
    • 从手工版换过来:带退路的那种换法
    • 她掉线了:NapCat 掉登录时怎么查、抢救页地址为什么是 /<口令>/ 而不是 ?secret=
    • 安全:口令、端口、账本权限那几条红线
    • 本地文件:每个文件在哪、能不能删

看那份的时候记住:它是 0.2.85 之前写的,里面的版本号和工具数已经旧了。 判断「现在还是不是这样」,以 doctor 和这份 README 为准。