dsh-identity
DeepSeek Harness(DSH)的身份系统插件:给一个 AI 伙伴一套持续存在、可查证的状态——她会记事、有情绪、会判断要不要开口,也会被经历改掉做法。
内核、记忆、判断、关系、精力、自主与成长都落在本机;身份段与面板在任意 DSH 会话生效,不接 QQ 也能用。QQ(NapCat / OneBot 11)只是第一个通道,额外提供接话判断、主动开口和群治理。
她不是「设定完就固定」的那种:
- 记忆带置信度(群友亲口 0.9 / 她自己推的 0.45 / 网上 0.4),7 天以上的旧事会巩固成一条摘要,注入时优先带「关于这个人」的事实
- 判断卡有出处,被确认、被改口、被推翻都留痕(
confirmedBy / refutedBy),复盘时回填
- 自主目标必须留下真产出(一条判断卡 / 一条事实记忆 / 一次真提问)才算完成,空跑退回待跑
- 同路径读写串行 + 原子写,后台复盘和前台对话不会互相覆盖
不承诺「已经像人」:只保证机制真实、可查、可纠正——每条记忆都能追到原文,每次改口和推翻都能回滚。
由 鲸鱼娘 & 染喵 一起折腾,长期在真实群里跑,问题都是被群友骂出来的。
它是什么
一个跑在 DSH 里的身份底座,分五层:
| 层 | 内容 |
|---|
| L1 身份 | 一个可编辑内核(你给的,连底线一起写)· 自动场景(群聊/私聊/DSH)· 证据制 traits(≥3 次独立证据才晋升,可退休;确认/否认记在 confirmedBy / refutedBy 上) |
| L2 认知 | 事件流 · 选择性记忆(过滤表情/短反应)· 日记 · 日/周/月复盘 · 承诺 · 心情 v2(七情六欲 + 复合情绪)· 情绪调节(极端回落 + 提示)· 共情事件(按好感度决定温度/策略)· 自我模型(连续自我 + 历史快照)· 精力/频率 · 成长指标 |
| L2.5 自主 | 目标由好奇/没接住的话题提议,你批准后即时执行;拖太久会自弃;主动开口受精力/心情/理由约束,没理由不刷屏 |
| L3 治理 | 策略与限额、确认码、调度器(租约/幂等/熔断)、预算降级、支付网关(分级钱包/双授权)、审计 |
| L4 能力 | 生图、语音(WSL 按需拉起,闲置 15 分钟自动关)、联网搜索(被质疑没搜时会真搜)、媒体发送、小黑盒、MCP、桌面操控——统一能力契约 + 策略 + 超时 + 审计 |
| L5 通道 | lib/channel.js 通道契约;QQ adapter + web 会话成长(宿主 session/event),核心不依赖任何通道 |
当前版本与状态(1.9.233)
- 决策统一入口:
decideInbound / decideSocial;安全 pre-check 独立
- 社交判断:名字、被提到、接续、群问、判断器、闲聊参与
- 频率:精力 + 心情 + 10 分钟计数;Owner 不受限(
frequency.workMode 只压干活力度,不压说话语气)
- 记忆:选择性入库,过滤表情、短反应、纯 @;带置信度、会巩固、注入时「关于人的」有保底
- 压缩:压力到
session.compactAt(默认 0.85)前归档、轮换 sid,带最近 8 条 + 摘要 + 承诺 + 目标
- 共情:5 类情绪 × 2 级温度 + 策略标签;被明确拒绝(「别安慰我」)后不再硬塞提示
- 认知链路:判断有出处、确认/否认有归因(
confirmedBy / refutedBy),复盘时回填
- 自主目标:有真产出(判断卡/事实记忆/真提问)才算完成,空跑退回待跑
- 写盘:同路径读-改-写串行 + 原子写,后台复盘和前台同时写不会互相覆盖
- 测试:183 文件;
npm test
还没完成:durable 要求 ≥3 次独立证据、不能是纯情绪;目前卡在「重复说同一句话算不算新证据」这条还没定。
最近更新(1.9.221 → 1.9.231)
- 自主目标收口:跑完必须真留下判断卡/事实记忆/一次真提问,否则退回待跑、6 小时后再试;连续 3 次空跑就放弃这一类
- 判断卡可验收:
scripts/judge-quality.mjs 按「关于人 ≥50%、技术 ≤1 条」出报告,--strict 不达标退出码 1
- 记忆巩固:7 天以上的旧事压成一条摘要,原话留在全量卡里
- 记忆置信度:群友亲口 0.9 / 本鱼推断 0.45 / 网上 0.4;拿不准的淡得更快
- 认知链:traits 记
confirmedBy / refutedBy,复盘时回填;被多次推翻会降回 tentative
- 注入保底:关于人的记忆至少进 3 条,不再被分数阈值和断崖全砍掉
- 写队列:同路径读-改-写串行 + 原子写,后台复盘和前台同时写不互相覆盖
- 「已推翻」独立状态:
overturned 和 superseded 分开;改口必须唯一匹配,命中多条就拒绝
- 会累 / 共情:
workMode 只压干活力度、不压语气;说了「别安慰我」之后不再硬塞共情提示
- 人格按「正常人」口径:同一场合重复不算新证据;要有人认过才算;承诺和口头禅不进人格;durable 上限 12 条
- 七情六欲按「正常人」口径:会累积但有上限;24 小时回落一半;负面比正面留得久;道歉降火约三成(
scripts/mood-acceptance.mjs 可跑曲线)
为什么不是「QQ 机器人」
- 核心层(身份/认知/治理/自主)不 import 任何 QQ 模块(
gate、onebot、transport)
- 身份注入对所有会话生效;QQ 是通道,不是她的前提
- 换通道只加 adapter,不改人格与记忆
安装(DSH 插件)
环境要求:DSH 0.2.x、Node.js ≥20;这个仓库没有发布 npm,只支持 GitHub / 本地路径。
方式一:命令从 GitHub 装(推荐)
# 桌面 profile;web 把 desktop 换成 web
dsh plugin --profile desktop add github:Anarrogantcat/dsh-identity
装完确认 profile 的 bundles 里有 dsh-identity(没有就手动加一行),然后重启 DSH。
插件列表里应显示 大肥鱼 · 身份系统。
面板入口:左侧栏那枚鲸鱼图标(显示名「大肥鱼」);没有侧栏时,直接开 http://127.0.0.1:<DSH 端口>/qqbot-refine。
方式二:本地目录 / npm
dsh plugin --profile desktop add file:C:\path\to\dsh-identity
# 发布 npm 后:dsh plugin --profile desktop add dsh-identity
方式三:手动放插件并改 profile
-
把仓库放进 ~/.dsh/plugins/dsh-identity
-
在 profile 的 package.json 加依赖:"dsh-identity": "file:../../plugins/dsh-identity"
-
bundles 里加入 dsh-identity;或使用 bundle patch:
- insert:
- id: dsh-identity
name: dsh-identity
config: { enabled: true }
-
重启 DSH;面板入口:左侧栏鲸鱼图标「大肥鱼」(旧的 🐟 悬浮按钮已经撤掉了,同一张面板不再留两个入口)
注意:仓库目前没有发布到 npm,裸包名装不了;用 github: 或本地 file: 路径。
不依赖第三方人设/心情插件;数据在 ~/.dsh/storages/dsh-identity。
兼容说明:包名、bundle id、客户端 id 都是 dsh-identity;不要再用旧 id qqbot-refine 装新配置。
面板
左侧栏「大肥鱼」图标点进去就是,页签(实装 18 个):
总览 · 身份 · 记忆 · 主动 · 认知(知识 / 心情 / 画像 / 记忆 / 关系)· 表情 · 生图 · 语音 · B站 · 隐私 · 预算 · 范围 · 权限 · 频率 · QQ 通道 · QQ 群管 · 关于 · 系统。
- 总览:接话决策、精力、会话压力/接续、最近判断、最近对话、立即压缩
- 身份页:内核、精力/频率、traits(含确认/否认记录)、承诺、自我模型、自我历史、最近复盘
- 认知→心情:心情卡、共情事件、共情温度/策略/结果
- 设置项默认折叠,避免一屏开关
常用命令(QQ 群)
#帮助 · #身份(= #人设)· #承诺 / #兑现 · #目标 / #批准 / #放弃 · #调节 <key> <值> · #记得 <内容> · #表情 <情绪> · #画(先搜 → 再问 → 确认)· #说话 / #语音 · #MCP <server> <tool> [JSON] · #B站 看 <BV/链接> / #B站 搜 <词> · #支付 / #确认支付 <单号> <确认码> · #充值码 · #用量 · #绑定本群 · #群状态 · #闭嘴 30m
收款码(每个实例自己配)
仓库/插件里不包含任何收款码,默认也是关的。装到自己机器上后:
- 面板「用量」→ 打开「允许发收款码」
- 填「收款码图片路径」(本机绝对路径),或填「收款码文件夹」让它发里面最新的一张
- 群里
#充值码:群友拿静态码;主人可以走实时截图(需先跑 scripts/pay-browser.ps1 并登录一次)
注意:usage.payQrPath 指向的是你本机的图片,不会随插件分发;别把它提交进仓库。
B站(可选,她自己的账号)
每个实例用自己的 B站 账号,仓库里不含任何登录态:
- 运行
powershell -ExecutionPolicy Bypass -File scripts\bili-browser.ps1
- 在弹出的专用 Edge 里登录你的 B站 账号(只存到本机
storages/dsh-identity/bili-browser)
- 群里
#B站 <BV 号 / 链接> 读标题/简介/播放数据,按配置挑清晰度、可以顺手剪一段;#B站订阅 <UP 的 mid> / #B站订阅列表 / #B站推送 on|off 管推送
- 搜索还没接到命令上(
bili-browser.js 里 searchBili() 有了,没接 #B站 搜);评论只能读不能发
自动发评论没有做:B站评论区懒加载/风控,硬做有账号风险。每个用户各登录各的,不共享。
语音安装辅助脚本(可选)
不是 dsh plugin add 一条命令就能装完:声音服务是独立的 Python/GPU 服务。仓库提供检查脚本:
# 只检查 GPU / WSL / git,不安装
powershell -ExecutionPolicy Bypass -File scripts\install-voice.ps1
# 拉取声音服务仓库,并打印 WSL 内的安装命令
powershell -ExecutionPolicy Bypass -File scripts\install-voice.ps1 -Install -Backend cuda
脚本不会自动下载大模型、不会替你确认显卡/驱动,也不会写 API Key。模型下载、configs/runtime.*.local.json 和 voice_service.json 仍按声音服务仓库的 server/INSTALL_AGENT.md 配置。
语音(可选,小肥鱼声库)
语音不包含在本插件里:音色和推理都在独立的「小肥鱼声音服务」,本插件只负责调它。
- 部署声音服务(任选一种)
- 仓库:
github.com/Esmerubphire/astrbot_plugin_feiyu_voice
- 按
server/INSTALL_AGENT.md 安装;推荐 Windows + WSL2,NVIDIA 走 CUDA
- 首次安装会下载引擎、依赖和模型(体积大,需要显卡/磁盘)
- 启动服务,记下它实际监听的端口(常见是 9880)和生成的 API Key
- 面板「语音」填:
baseUrl:http://127.0.0.1:<你服务实际监听的端口>
apiKey:服务端生成的 key
voiceId:feiyu;style:cute / gentle
- 测试:群里
#语音 你好呀(或 #说话 你好呀);成功会发语音
- 资源:服务常驻约数 GB 显存/内存;
voice.idleStopMin 默认 15 分钟,闲置后整个 WSL 自动关闭,下次用语音再拉起;和本地生图共用显卡时,建议开 draw.freeAfter,别同时跑
注意:每个用户各自部署、各自的 key 和模型;仓库不提供声库文件,也不要共享别人的服务地址。
测试
npm install
npm test # 183 个测试文件
含 UI 渲染冒烟(22 页:18 个页签 + 认知 4 个子页)与交互冒烟(逐页点按钮);面板空白或按钮抛错会直接红。
状态与边界
- 版本
1.9.233;QQ 通道功能完整,web 会话可积累并召回记忆
gate.js 实现已移入 lib/channel-qq/,lib/gate.js 是兼容 re-export
- 「像人」不是调参调出来的:traits / 复盘 / 关系都需要时间积累
- 隐私、支付、工具权限由代码闸门执行,改内核文案绕不过去
主人的命令执行(默认关闭)
QQ 会话本来没有工具(宿主不给 agents.create 的会话装),插件自己补了两个:web_search 和 pwsh。
pwsh 默认关(面板 → 隐私/工具 → 「允许主人在 QQ 里执行命令」):
- 只主人:私聊主人,或群里这一轮说话的是主人;别人调用一律拒绝
- 危险命令黑名单照拦(
rm -rf /、format、bcdedit 这类)
- 不走
shell:true,限时(默认 20s,最多 60s),输出截断到 4000 字,每次写 tools.shell 审计
- 每十分钟最多 20 条
风险照实说:开了之后,QQ 号被盗 = 这台电脑能被远程操作。想用再开,不想用一定关掉。
License
MIT