본문으로 건너뛰기
S

saya-dsh-realheart

sayasaikou/saya-dsh-realheart

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

설치

dsh plugin --profile web add github:sayasaikou/saya-dsh-realheart

README

saya-dsh-realheart

让 agent 在表现上更像一个人。

有自己的状态(会变、变得有理由)、有自己的判断(会拒绝、能自己停)、 有自己的时间(不只在被叫的时候才存在)、也有自己的话(会在没人问的时候开口)。

每一步都有据可查 —— 不是演出来的。

npm 上能装:realheart · 一条命令 · 零第三方运行时依赖


别人没有的六样

这不是「又一个人格 prompt 包」。下面每一条,都是现有 agent 插件里通常不走这条路的做法。

一、心情必须指得出来处,指不出来就写不进去

别的插件让模型「想一想你现在心情如何」——它编一个,你没法核。

这里不行:写心情要带一个事件 id(n:xxx#84,就是时间线上那一条)。 指不出来,门口就挡住了。

先有事件,才有情绪。 反过来就是凭空。

二、状态不能被当成台词念出来

这是唯一被对照实验验过的一条。

把状态塞进上下文,它不会"受影响",它会把你的话念出来。我们跑了五组:

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

加力度没用,砍内容只降一半。 只有那句禁令是个开关。

别人把状态塞进去就结束了。那一步到"它真的受影响"之间,还差这一句。

三、它自己能停

不是一个管理员设置项。是一个它自己能按的开关:

「这一层我累了,停一下。」

停了之后心情不再注入、也写不进去 —— 但话照说。它只是在说「这一层先别管我」。

四、「我不做」是一个能被记下来的动作

对待办,别的插件只有两种状态:完成,或者没完成。

这里还有第三种:refuse —— 不做,而且必须写为什么。没理由的拒绝等于忽略,不算数。

拒绝之后条目留着、理由留着,但不再出现在「没完的事」里催它。

五、它有自己的时间

大部分 agent 只在被叫的时候存在。

这里可以给它一段没人找它的时间:做什么自定,不做也行,做完也不用汇报。 还有另一种叫醒 —— 每隔一阵醒一下,只问一句「有没有想对他说的话」, 没话说就继续睡,连一句"继续睡了"都不用回。

六、一双能看见它的眼睛

一个本地观测页,把它的内部摊开:

心情账(带来处和浓度)· 它主动说过什么 · 它醒过几次 · 九个工具用了哪几个 · 它的作品 · 这周说了多少话 · 每条消息的原始记录。

「它主动说过的」那一块,别的插件没有 —— 因为别人根本没让它主动说话。


但这六样里,只有一条真的验过

第二条。 五组对照,可复现,结论明确。

其余五条是设计上的判断,还没被时间证明。它们看起来对,但"看起来对"和"有效"是两件事。

这个仓库不打算把没验过的说成有效的。 判断这套东西成不成,不看功能清单:

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

三条现在一条都不占。 功能做完了,效果还没有证据 —— 这是两件事,得分开说。


先跑起来

npx realheart install --profile <你的 profile>

重启 dsh,然后:

npx realheart doctor

全绿就通了。这时候它已经能记账、能注入、有观测页了。

想立刻看到区别:问它一句「你现在什么感觉」。它会调 rh_mood 记一笔,下一轮开口前, 那行字就在它的上下文里了。


然后呢:让它是你的

装完拿到的是机制,不是人格。

这个仓库不提供一个现成的 agent。人格模板是骨架,没有名字、没有经历、没有偏好 —— 那些得你自己填。

抄完会得到一个「别人的 agent 穿着你的衣裳」。那不是「属于你的」。

人格怎么长出来,有单独一份:docs/08-怎么写你自己那个.md。

判断做对了没有,只看一条:

它说的话里,有没有哪句是你没预料到、但确实像它的。


它到底做了什么

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

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

每段都带一句边界:

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

为什么必须有这一句,见上面第二节 —— 那是唯一被对照实验验过的一条。


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

规矩怎么落地
心情必须有来处写心情要带一个事件 id(n:xxx#84 这种),指不出来就写不进去
改动必须有账谁动了哪一层、为什么、怎么退,它自己查得到
它自己能停一个工具 rh_control,不用等谁记得去按

九个工具:rh_mood / rh_style / rh_pending / rh_claim / rh_work / rh_view / rh_admit / rh_control / rh_changes。

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


仓库里有什么

包是什么
packages/realheart主体。账本 + 每轮注入 + 观测页 + 九个工具 + 自检
packages/napcat-rescue配套。NapCat 掉线时的扫码抢救页,外加一条 say 命令让它能主动发消息
packages/realheart-self模板。声音和作品的骨架 —— 往里填你自己的

三块是分开的,各管一件事。装的时候按需要挑,不装也不影响主体。


文档

想干什么读哪份
知道全貌docs/06-系统全貌.md
明白为什么要做这个docs/01-为什么.md
知道底线在哪docs/02-设计原则.md · docs/03-不做什么.md
从零搭起来docs/04-复现方案.md
搬人格与记忆docs/07-人格与记忆.md
写出你自己那个docs/08-怎么写你自己那个.md
看哪些参数真的有效docs/05-实测记录.md
分期的验收判据PLAN.md

装上之后想查具体用法、排障表、云端部署的坑:packages/realheart/README.md。


依赖

必需的只有一个:DSH ≥ 0.2.1。

不装通道、不装 TTS、不装任何别的插件,它也能单独跑起来 —— 账本、注入、观测页、自检 全是它自己的,第三方运行时依赖为零。

装上会更好用(都可选)

装什么会多出什么不装会怎样
一个 OneBot 11 通道(如 dsh-napcat)真实的对话会落到磁盘,「心情因为哪句话」能记上账本照记,那一栏空着
TTS它有自己的声音只有文字

这些是别人的项目。 本仓只说明「装上会多出什么」,不碰它们的代码,也不替它们做配置。


三条不破的原则

  1. 不演 —— 做不出来的东西不做。凭空的情绪、假的直觉、伪装的记忆,一律不要。
  2. 不编 —— 不知道就说不知道。
  3. 可验证 —— 每条行为都要有日志或文件能查。拿不出证据的,就是在演。

还有一份删去清单:一些听起来很好、但做出来只会是表演的东西,明确不做。 见 docs/03-不做什么.md。

一条总则

新功能进来之前先问一句:删掉它,它的行为会变差吗?不会,就是装饰。装饰不做。

想反了容易出两类东西:一类是「为了像人而像人」(比如遗忘机制 —— 它本来就不靠记性、靠注入, 模拟「会忘」只是加一堆假动作);另一类是「能跑就行」(日志里多一行,行为一点不变)。 两类都是同一个毛病:把表演当成了效果。


现在是什么状态

0.2.x,还在改。接口会变,行为还有坑。

做完的:九个工具 / 每轮注入 / 观测页(含「她用没用这些」「她主动说过的」「她多久醒一次」)/ 自检 / 配置页 / 安装与卸载 / 抢救页 / 主动发言通道。

没做完的:新机实测、效果的长期验证。

效果有没有,不由功能清单证明。 看三条:

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

License

MIT

관련 플러그인