迭代记忆:让智能体记状态、自己开口

前言

DSH(DeepSeek Harness)的理念是「一切皆插件」,开发者可以通过插件扩展宿主的能力。很多插件关注的是「记住了什么」,比如对话历史、知识库检索,但智能体的行为不仅取决于它「说了什么」,还取决于它「状态如何」——今天累不累、情绪好不好、刚被用户回应过没有。状态是活的,却往往没人记。

迭代记忆插件解决的是这个问题:给智能体一份自己的状态账本,让状态能自己变化,也能反过来决定它要不要开口。它不是记事情,而是记「它自己」。

插件定位

  • 名称:dsh-iter-memory
  • 维护者:MingHuanYue
  • 分类:记忆
  • 星标:1

这是一个 DSH 插件,负责管理智能体的「状态曲线」和「主动开口」行为。它不联网、不发遥测,所有数据存在本地 $DSH_HOME/iter-memory/。

核心功能

插件维护两条核心线:

  1. 潮位:一条会自己退回基线的状态曲线(0 很沉 · 0.5 平常 · 1 很舒展)。你跟它说话时潮位抬一点,它开了口你半天没应它掉一点,没人管它也会按半衰期慢慢退回基线。
  2. 开口:不定时地由它自己说一句。到点先看潮位——状态低就更容易忍住不说;真说了,话里也带着此刻的状态。

合起来才叫迭代:「我说不说由状态决定,状态又被「说了有没有人应」改」。分开做,这两半都是死的。

插件每 15 秒 tick 一次,只在有活着的会话时工作;默认只在最近用的那一个对话里开口(onlyActiveSession),别的会话不会同时冒出来。

安装与启用

GitHub 安装(推荐):

dsh plugin --profile desktop add github:MingHuanYue/dsh-iter-memory

本地开发安装:

dsh plugin --profile desktop add "link:D:/DSH插件/projects/dsh-iter-memory"

安装完需要重启一次宿主(link 安装不会热重载已缓存的模块)。之后在「设置 → 迭代记忆」里打开开关。

从 dsh-tide-whisper(潮声)升上来的不用担心:第一次启动会自动把 $DSH_HOME/tide-whisper/ 的 config.json 和 state.json 搬过来,你原来设的间隔、上限、活跃时段都还在。旧的目录不会删。

典型用法

状态曲线

在设置页可以看到「此刻」面板:
- 当前潮位
- 最近一条原因
- 一张 24 小时曲线(实线是潮位,虚线是基线)

主动开口

到点后,插件会先做裁决:不在活跃时段、今天次数满了、刚说过、你刚说过话 → 直接推后,一声不响,零 token。剩下的才掷骰子,而骰子会被潮位改:状态低就更可能忍住。

真开口时,注入的不是一句写死的话,而是「处境 + 此刻的状态 + 一个方向 + 几条约束」,具体说什么由当下的模型自己决定。一个回合有概率拆成两段(像真人连发两条),段间隔几秒到几十秒,之后冷却拉长。

工具

iter_status

看状态:开没开、下次大概什么时候、今天第几次、此刻潮位。

iter_feel

记一笔此刻的状态(level 0~1 + why)。这是唯一「我自己改自己」的入口。

iter_set

改参数(只改传了的字段)。

iter_now

不等骰子,立刻开口一次(测试用)。

参数

键 默认 说明
enabled false 总开关。关着的时候工具也会卸掉,不占任何东西。
minMinutes / maxMinutes 40 / 200 两次开口之间的随机区间。
speakProb 0.4 到点后开口的基准概率。
activeStart / activeEnd 9 / 25 活跃时段,允许 >24 表示跨到次日。
maxPerDay 5 一天最多主动开口几次。
cooldownMinutes 25 开口后的最小冷却。
userCooldownMinutes 20 你刚说过话之后,我先安静这么久。
multiSegmentProb 0.35 一次开口拆成两段的概率。
gapMinSeconds / gapMaxSeconds 8 / 40 两段之间的间隔。
roundCooldownMult 1.6 多段回合之后冷却乘多少。
moodBaseline 0.5 潮位的基线,最终都会退回这里。
moodHalfLifeMinutes 90 偏离基线后多久衰减一半。
moodReplyBoost 0.07 你跟我说话时潮位抬多少。
moodIgnoredDrop 0.06 我开了口你一直没应时掉多少(只掉一次)。
moodSpeakInfluence 0.5 潮位对开口概率的影响强度,0 = 完全不影响。
moodInWhisper true 开口时是否把当前状态注入进去。
style 空 语气要求,拼进注入文本。
onlyActiveSession true 只在最近用过的那个对话里开口。别的会话不吭声,只把各自的下一次往后挪;你换到哪个对话,哪个接手。

数据与隐私

  • 全部存在 $DSH_HOME/iter-memory/:config.json、state.json、log.jsonl。
  • 不联网、不发遥测、不调用任何模型接口。
  • 轨迹(log.jsonl)你能直接打开看:每次忍住的原因、每次开口的方向、每次潮位变动都在里面。
  • 卸载插件不会删这些数据。

兼容性与限制

  • DSH >= 0.1.7-rc.1,Node >= 22。
  • 状态按会话分桶;切换会话、重启宿主都不丢。只保留最近 30 个会话的记账。
  • 依赖宿主内置的 schedule 服务投递唤醒(和内置定时提醒同一套),所以窗口关着也叫得醒。宿主没有这个服务时会在日志里记一条 deliver-failed,不会崩。
  • 只在有活着的会话时工作:会话全关了就排不上,因为你不在,说了也没人看。
  • 潮位是按会话记的,不是全局的:不同会话各有各的曲线。
  • 曲线只留最近 24 小时、最多 72 个点(画图够用)。

适用场景与注意

这个插件适合需要「有状态」的智能体,比如伴侣型、陪伴型、长期对话场景。它让智能体不只是被动回应,还能根据自身状态决定要不要主动说话,以及说什么。

插件以当前 DSH 进程权限运行,安装前建议查看源码与许可证(MIT)。所有数据存储在本地,不涉及联网与遥测,适合注重隐私的部署方式。

短结尾

迭代记忆插件通过「潮位」和「开口」两条线,让智能体有了自己的状态账本,并能根据状态决定是否主动说话。它不联网、不发遥测,所有数据存在本地,适合长期对话与隐私敏感场景。

  • 目录页:https://www.skillhub.cn/plugins/MingHuanYue/dsh-iter-memory
  • GitHub:https://github.com/MingHuanYue/dsh-iter-memory
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜