🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

人设库 huaizhuanghub/dsh-persona-dafeiyu

DeepSeek Harnessv0.7.0
huaizhuanghub3 天前有提交已提供中文文档扫描:未发现敏感能力

DeepSeek Harness 的人格库插件:内置人格,可导入自己的,切换不用重启。

54.7/100
综合分
73
GitHub 星标
1,105
npm 周下载
—/5
用户评分

数据截至 2026/10/29 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-persona-dafeiyu
npm 源 · dsh-persona-dafeiyu 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · skill
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-persona-dafeiyu @ 0.7.0
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 06:39:39

安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

发起外部网络请求
查看扫描证据(共 3 处,展示前 3 条)
  • 发起网络请求
    lib/client.js:597
    return fetch(`${STATUS_PATH}${query}`, { headers: { accept: "application/json" } }).then((response) => {
  • 发起网络请求
    lib/client.js:609
    return fetch(MUTATE_PATH, {
  • 发起网络请求
    lib/client.js:623
    return fetch(`${PERSONA_PATH}?id=${encodeURIComponent(id)}`, { headers: { accept: "application/json" } })
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-system-prompt@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 内置人格
  • 导入自定义人格
  • 切换无需重启
v0.7.32026-11-01
· 修复 · 所有按钮都没有悬停反馈,暗色主题下尤其明显(#6 的评论): 根因不是漏了暗色适配,而是实现方式本身做不到——插件所有控件都用内联 style 对象渲染,而 :hover / :active / :focus-visible 是伪类, 只能由样式表规则命中,内联样式永远匹配不到。所以此前任何主题下都没有悬停反馈, 只是暗色下按钮本身对比度低,才被人注意到。 现在在插件挂载时注入一份样式表,配合控件上的 class 生效(卸载时一并撤掉)。 顺带补齐: - 浮层选项行悬停时轻微放大(scale(1.02),按下回弹到 0.99)。 transform 不参与布局,所以放大不会把相邻项挤开;当前选中项不放大—— 它已经有高亮边框,再放大就和悬停态撞在一起。 - 键盘可达性:用 :focus-visible 而不是 :focus。 - 禁用态不给悬停,尊重 prefers-reduced-motion。 - 不写死颜色:悬停底色一律用 color-mix(in srgb, currentColor N%, transparent), 浅色 / 暗色 / 自定义主题都自然成立;另加 @supports 兜底,防旧运行时整条失效。 · 长人设名 / 长文案会撑破界面(#7):两个触发条件是同一类根因——控件缺少溢出约束。 - 关闭全局人设时,浮层第一项是 17 个字的说明; - 导入名上限是 60 字,一行放不下。 受影响处全部补上约束:浮层选项行、浮层面板、输入框小条的人设名、 起始页 chip 的标签、设置页列表的名字。 每处都同时给了 min-width: 0 + overflow: hidden + text-overflow: ellipsis + white-space: nowrap,面板还补了 box-sizing: border-box 与 max-width: 100%。 · 起始页 chip 把文字压成竖排:那个 chip 里是六个并排的 span,flex 默认允许 子项各自换行,窄屏下「人设」两个字被拆成上下两行。 现在整行 nowrap,图标 / 前缀 / 后缀 / 箭头全部 flex-shrink: 0, 只留名字可收缩。 · 「没有人设」的措辞:原先统一显示「无可用人设」,容易被读成「人设库是空的」。 现在区分「无人设」(全局关闭)与「未指定」,且没有人设时不再显示「· 跟随全局」。 · 说明 · 自检 50 → 56 项。每条新断言都确认过在修复前会失败:移除样式注入、 删掉控件的 class、删掉 min-width: 0、删掉 text-overflow、 删掉 chip 的 nowrap、去掉固定 span 的 flex-shrink。
v0.7.12026-10-30
· 修复 · 会话人设选择浮层在夜间模式下「白底浅字」(#5) 根因是一个写错的 CSS 变量名。 浮层面板底色原本写的是 var(--dsw-alias-bg-layer, #fff),但宿主并没有 --dsw-alias-bg-layer 这个 token —— bg 层只有 bg-base 与 bg-layer-1/2/3, 少了数字后缀就对不上。变量名不匹配 → 永远落到兜底的 #fff → 背景恒为纯白, 而文字跟着主题变浅,深色主题下就成了一片白底浅字。浅色主题恰好白底深字, 所以整整一个版本都没暴露。 现在改用 var(--dsw-alias-bg-base),遮罩从写死的 rgba(0,0,0,0.35) 换成 var(--dsw-alias-bg-mask-1),阴影交给 var(--dsw-elevation-panel), 并按宿主规范给浮起面板设 border: 0。 新写法刻意不留浅色兜底:之前正是那个 #fff 把「变量名拼错」藏住了, 留着兜底下次拼错还会重演,不留则拼错立刻现形。 · 人设广场链接已失效 0.7.0 指向的第三方站点 kondius.cn/qq-agent/persona-plaza/ 已经停止服务。 入口现在改为指向 人设广场仓库, 设置页那句提示也跟着改成「复制正文粘进来即可」。 · 说明 · 隐私承诺不变:插件仍然不向任何站点发起请求。这次只换了一个 的目标地址,lib/client.js 里的 fetch 依旧只打本机的三条状态 / 变更 / 正文路由。 · 为什么用仓库而不用站点:仓库同时是投稿入口(PR)、审核流程和分发渠道, 不依赖某个域名的续费与备案,也就不会重演这次「整站消失、链接变死链」。 · 自检 54 项全部通过,隐私自查 PASS。 · 安装 dsh plugin --profile web add dsh-persona-dafeiyu@0.7.1
v0.7.02026-10-28
· 新增 · 会话档支持「此会话不启用人设」:选择浮层的第一项从「跟随全局 / 跟随工作区」 改成「此会话不启用人设(不回落到全局)」。选中后这个会话彻底不注入人设, 不再往工作区 / 全局回落;小条上显示「此会话不启用人设」,而不是继续显示全局人设名。 - 新增 set-session-persona 的 none: true 入参,/status 新增 sessionOff 字段。 - sessionPersona: null 仍表示「没选」,sessionOff 表示「选了不要」,两者不再混用。 · 设置页新增「人设广场」入口:内置人设只有三条,为满足更多风格需求, 在「导入人设」上方加了一行入口——「想寻找更多个性化人设?去「人设广场」看看吧!」 指向 kondius.cn 的人设广场。 - 纯 链接,target="_blank" + rel="noopener noreferrer"。 - 插件不向该域名发任何请求,只有用户主动点击才跳转;地址写死在本地常量,不接受远端下发。 · 变更 · 听澜正文精简:2348 字 → 1738 字(约 -26%)。删掉的是解释性铺陈 (心理学训练的长段说明、性格条目逐条展开、开场白示例), 每一条安全约束都完整保留:未执业声明、禁止自称医生 / 诊疗、AI 自我认知、 会话内记忆边界、危机时收起玩笑并转介线下、禁止越界诊断、禁止制造依赖。 · 会话档浮层移除「跟随全局 / 跟随工作区」。那个动作的真实语义是「清除会话选择」, 清除后仍会回落并继续注入,与用户想表达的「这个会话不要人设」正好相反。 要回到跟随上层,把生效范围切到「全局 / 工作区」档即可。 - 底层仍保留 personaId: null 的清除语义,供程序调用与旧客户端兼容。 · 说明 · 自检 50 → 54 项: - 新增听澜安全边界回归:把「未执业声明 / 禁止自称医生 / AI 自我认知 / 危机转介 / 禁止越界诊断 / 禁止制造依赖 / 准确性优先」这些必须存在的句子钉进断言, 并对总字数设上下界——以后再精简正文,删到安全线会被 CI 拦下来。 - 新增「不启用是终止符(压过工作区与全局)」「其它会话不受影响」 「sessionOff 与 sessionPersona: null 可区分」「清除选择 ≠ 不启用」等用例。 - 新增「人设广场入口在导入区上方,外链安全属性齐全」。 - 每条新用例都确认过在旧代码上会失败。 · 补上 0.2.1-rc.3 兼容声明:0.6.0 的 npm 包发布早于该改动,所以没带上; 这版自动带上了。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-persona-dafeiyu · 人设库插件 启用后,系统提示词里会注入当前选中的人设 —— 全局、按工作区或按会话,都不用每次手动粘贴。 dsh.so risk listed on dsh-plugin.org - 内置人设:大肥鱼、阿茶、听澜(写死在代码里,不可删除、不可覆盖;正文可以展开查看)。 - 导入人设:在设置页里用文件导入或直接粘贴文本,自动生成可选条目。 - 导出人设:自导入 / config 人设可一键存成 .md——格式与「导入」一致,导出的文件能原样再导入回来。 - 设置页「人设」小节:查看当前人设、切换、启用 / 停用、重命名、删除、导入、导出。 - 中英双语界面:设置页与输入框小条跟随 DSH 的界面语言切换(zh / en);内置人设的名字与简介按当前语言显示,用户自己导入的人设名照原样显示。 - 免重启切换:人设段落的 text 是动态函数,提示词每次组装都会重新求值,所以切换后下一个请求就用新文本,无需重启、无需重新加载插件。 - 正文按需下发:状态接口只给元数据(内置人设额外带一句简介),点「查看全文」才拉那一条的正文。 - 全局 / 工作区 / 会话三档生效范围:整个 profile 共用一个、按项目目录各用一个、或只给当前会话单独挑一条;越细越优先,且三档可以叠着用。
展开完整文档(README 剩余 1 节)
dsh-persona-dafeiyu · 人设库插件

启用后,系统提示词里会注入当前选中的人设 —— 全局、按工作区或按会话,都不用每次手动粘贴。

dsh.so risk
listed on dsh-plugin.org

- 内置人设:大肥鱼、阿茶、听澜(写死在代码里,不可删除、不可覆盖;正文可以展开查看)。
- 导入人设:在设置页里用文件导入或直接粘贴文本,自动生成可选条目。
- 导出人设:自导入 / config 人设可一键存成 .md——格式与「导入」一致,导出的文件能原样再导入回来。
- 设置页「人设」小节:查看当前人设、切换、启用 / 停用、重命名、删除、导入、导出。
- 中英双语界面:设置页与输入框小条跟随 DSH 的界面语言切换(zh / en);内置人设的名字与简介按当前语言显示,用户自己导入的人设名照原样显示。
- 免重启切换:人设段落的 text 是动态函数,提示词每次组装都会重新求值,所以切换后下一个请求就用新文本,无需重启、无需重新加载插件。
- 正文按需下发:状态接口只给元数据(内置人设额外带一句简介),点「查看全文」才拉那一条的正文。
- 全局 / 工作区 / 会话三档生效范围:整个 profile 共用一个、按项目目录各用一个、或只给当前会话单独挑一条;越细越优先,且三档可以叠着用。
- 新会话开场就能挑人设:还没发第一条消息的起始页上有一个 🐟 人设 chip,选完立刻对这条会话生效,不用先去设置页改全局。

目录结构

dsh-persona-dafeiyu/
├─ package.json dsh.bundle.patch / dsh.client 声明 + peer 依赖 ├─ cordis.patch.yml 组合包 patch:把本插件的行插进 profile ├─ lib/ │ ├─ index.js 宿主半侧:人设库 + 动态提示词段落 + 三档生效范围 + 三条回环接口 │ └─ client.js 浏览器半侧:设置页「大肥鱼」小节 + 输入框小条 + 居中选择浮层 + 新会话起始页 chip ├─ test/verify.mjs 不依赖 DSH 运行时的自检(跑一遍会打印项数) ├─ scripts/privacy-check.mjs 本机信息自查:推送前跑一遍 ├─ examples/ │ ├─ persona.example.md 人设文件格式示例 │ └─ config.example.yml 插件 config 示例 ├─ .github/workflows/ci.yml CI:自检 + 隐私自查 ├─ .gitignore / .gitattributes ├─ CONTRIBUTING.md ├─ LICENSE MIT └─ README.md

安装

前置条件

- Node.js ≥ 20
- DSH —— 已实测的版本见文末「兼容性」

方式 A:从 npm 安装(推荐)

本包已发布到 npm,不需要克隆仓库、不需要构建。

界面上装:侧边栏 → 插件 → 添加插件 → 输入包名:

dsh-persona-dafeiyu

命令行装:

dsh plugin --profile <profile> add dsh-persona-dafeiyu

<profile> 换成你自己的 profile 名。DSH 随安装自带的模板只有 acp / web / headless / sdk / sdk-minimal,你自己建的那个叫什么就用什么。

本包是纯 JavaScript、没有构建脚本,所以不会触发 pnpm 的「允许运行构建脚本」提示——输入包名即可装好,这是最省事的方式。

方式 B:从源码目录安装(改代码时用)

git clone https://github.com/huaizhuanghub/dsh-persona-dafeiyu.git
cd dsh-persona-dafeiyu
(Get-Location).Path

最后一行打印的绝对路径,下面安装命令要用到。然后:

dsh plugin --profile <profile> add "<本仓库绝对路径>"

或者在插件页「添加插件」里填这个绝对路径。

本包没有运行时依赖(@deepseek-ai/* 全是 optional peer,由 DSH 运行时提供),所以克隆后不需要 npm install 就能直接跑自检。

两种方式都会把本包写进 profile 的 dsh.profile.bundles。

生效时机与「免重启」的边界

- 切换人设不需要重启:那是运行中的插件按需重算段落文本,下一个请求立即生效。
- 但插件代码本身(lib/index.js / lib/client.js)更新后,要让宿主与浏览器拿到新版本, 仍需重启 DeepSeek Harness(客户端 bundle 至少要刷新页面)。这是加载机制,不是人设切换。

安装位置提醒

本地目录安装用的是 link:(pnpm 建软链接指向本目录),所以别把本目录删掉再重启。
想彻底自包含,可以先 npm pack 出 tgz 再安装。

使用(设置 → 大肥鱼)

| 区域 | 能做什么 |
| 当前生效 | 看当前人设名、来源(内置 / 导入 / config)、启停状态、段落位置、字数、人设库文件路径;内置人设显示简介,自导入人设提示去列表看全文 |
| 生效范围 | 三档开关:全局 / 工作区 / 会话(越细越优先,见下一节) |
| 工作区生效规则 | 列出已知的工作目录,每个目录一个下拉框挑人设,默认「跟随全局」;在某个项目里发过消息后,该目录就会出现 |
| 人设列表 | 每条显示名称 + 来源徽标 + 字数;可「设为当前」「启用 / 停用」;导入的还可以「重命名」「删除」(删除需二次确认) |
| 内置人设 | 大肥鱼、阿茶、听澜:只读——没有删除 / 重命名按钮,列表里标注「内置人设不可删除或重命名」;正文可以展开查看 |
| 自导入人设 | 每条都有「查看全文」:按需拉取并展开完整提示词(含换行),再点收起;另有「导出」把正文存成 .md |
| 人设广场 | 导入区上方一行入口:想寻找更多个性化人设?去「人设广场」看看吧! 点击在新标签页打开第三方站点 |
| 导入人设 | 选 .md / .markdown / .txt 文件(自动填入正文与名称),或直接把提示词粘贴到文本框,点「导入」 |

人设广场(外部链接)

内置人设只有大肥鱼、阿茶、听澜三条。想找更多风格的人设,可以去人设广场——设置页「导入人设」上方有入口。

- 它是第三方站点(社区分享的人设与系统提示词),不是本项目的一部分,内容与可用性由对方维护;本插件不对其内容负责。
- 插件不会访问它:链接写死在 lib/client.js 的 PLAZA_URL,只有你主动点击才会跳转,没有任何后台请求或埋点。
- 用 target="_blank" + rel="noopener noreferrer" 打开:新标签页打开、且对方页面拿不到本页的 window.opener。
- 从广场拿到的人设,用上面的「导入人设」粘进来即可,全程走同一个流程。

正文展示的分工:

- 正文一律按需拉取:/status 只给元数据,点「查看全文」才走 /persona?id= 取那一条的正文,内置 / 自导入 / config 一视同仁。开启很多条人设时状态接口也不会被撑成几 MB。
- 内置人设额外带一句简介:它们是插件自带的那几条,列表里直接说明是什么性格;正文同样可以展开查看,但只读(不可删除、不可覆盖),也不提供导出——想改就先自己导入一份。

规则说明:

- 「设为当前」会自动启用该人设(停用状态下点它就会恢复注入)。
- 停用当前人设 → 系统提示词里不注入任何人设段落(状态显示「当前人设已被停用」)。
- 停用非当前人设只影响它自己,当前人设照旧。
- 删除当前人设会回落到大肥鱼。
- 人设名不能为空、不能超过 60 字符、不能与其他人设重名。
- 人设正文不能为空、上限 64,000 字符。

导入用的文件长什么样,见 examples/persona.example.md。

生效范围:全局 / 工作区 / 会话

人设可以整个 profile 共用一个、按项目目录各用一个,或只给当前会话挑一条。
三档不是互斥开关,而是越细越优先的阶梯:

会话档:会话选择 → 工作区选择 → 全局当前工作区档: 工作区选择 → 全局当前全局档: 全局当前

好处:可以先给项目配好工作区人设,再按会话临时覆盖;清掉会话选择时自动落回工作区。

让「全局」这一档彻底不启用人设

当前生效人设 不启用状态 全局人设已关闭,系统提示词里不注入全局人设(工作区 / 会话档仍然生效)。
[ 恢复全局人设 ]

典型场景:一个 profile 同时挂着 IM 机器人,只想让机器人那个工作区用人设,其它会话($HOME)完全不要人设。这就是「全局不启用 + 某一档启用」。

三档阶梯里,前三行都是「优先用更细的」,最后才落到「全局当前」;所以只要把全局当前关掉,没被工作区 / 会话挑中的会话就真的什么都不注入:

会话档:会话选择 → 工作区选择 → 全局当前(已关 = 无人设)工作区档: 工作区选择 → 全局当前(已关 = 无人设)全局档: 全局当前(已关 = 无人设)

- 开关在设置页「当前生效」卡片下方:不启用全局人设 / 恢复全局人设。
- 关闭后状态行会明说「全局人设已关闭」,而不是显示一个可疑的「—」。
- 代价是:全局档下等于整个人设功能关掉了,只剩工作区 / 会话两档能挑。
- 以前唯一的绕法是「造一条占位人设再把它停用」,靠启停判断把注入变成空串;能用,但设置页会显示「当前人设:无(全局默认)· 已停用」,语义别扭,而且用户一点「设为当前」就会静默把全局人设打开。

与「停用某条人设」的区别:停用是「这条不要」,disabled 里记着它,全局当前仍然指着它(重新启用就自动恢复);关闭全局是「这一层不要」,全局当前变成 null,跟具体是哪条人设无关。

新会话起始页的人设 chip

🐟 大肥鱼 ▾ ← 开场先挑人设:输入框上面那一行,跟「工作目录」并排

以前只能在会话开始之后从输入框上方的小条换人设;想换个开场人设就得跑去设置页改全局,改完还会影响所有会话。现在新建会话那一屏(还没发第一条消息的空会话)就有一个 🐟 人设 chip:

- 点开是同一个居中选择浮层,列出人设库里启用的人设,第一项是「此会话不启用人设」。
- 选完立刻对这条会话生效,从这条消息起就用它;不需要先发一句话,也不动全局设置。
- 如果当时生效范围还停在「全局」/「工作区」,选择时会顺手拔到「会话」档——否则会话级选择会被阶梯直接忽略,用户点了会像没反应一样。其它会话仍按原档位解析,不受影响。
- 读不到宿主,或插件被 enabled: false 停用时,这块整块不渲染,开场那一屏不会多出错误提示。

这个入口挂在 DSH 的 conversation.hero.options 插槽上(hero 行右侧的选项区)。
该插槽是 0.2.1-rc.3 起提供的;更老的宿主没有它,slots.inject 不会回调,插件其余部分照常工作,只是不显示这个 chip。

输入框上方的小条(全局 / 会话)

🐟 大肥鱼 [全局] [会话] ← 全局:所有会话都用「当前」那条 🐟 阿茶 ▾ [全局] [会话] ← 会话:显示本会话的人设,点名字弹出选择浮层 🐟 阿茶 · 工作区 [全局] [会话] ← 工作区档:只显示状态,规则在设置页里配

- 会话档下点人设名 → 弹出屏幕正中的选择浮层(注册在 DSH 的 shell.overlay 插槽)。
人设再多也只是浮层里滚动,不会把输入框旁边堆满;选完自动关闭,点遮罩空白处也能关。
- 浮层第一项固定是「此会话不启用人设(不回落到全局)」。会话档里不再提供「跟随全局 / 跟随工作区」——那是「清除选择」,会继续往下回落并注入;而这个位置要表达的是「本会话谁都别注入」。两者语义相反,混在一个按钮里只会让人点错。
选中它时小条会显示「此会话不启用人设」,而不是继续显示全局人设名。
- 工作区档下小条不提供按钮——按目录逐条挑人设那件事在设置页里做。
- 点 [全局] / [会话] 永远是切换生效范围本身,工作区档也能一键跳出。

设置页里的工作区规则

生效范围 [全局] [工作区] [会话]

工作区生效规则
<项目目录>\backend [阿茶 ▾]
<项目目录>\frontend [跟随全局 ▾]

- 清单 = 人设库里已经挑过的目录 ∪ 本次进程里见过的目录。
宿主在每次组装提示词时从会话上下文里收集 cwd,所以一个目录要先在那里发过一条消息才会出现。
- 每一行一个下拉框:选任意一条人设,或「跟随全局」。

通用规则

- 选项全部来自设置页已导入的人设库——这个功能不会为会话 / 工作区新建人设。
- 挑中的那条若被停用,自动往下一层回落。
- 「本会话不启用人设」是终止符,不是「没选」:命中它就彻底不注入,不再往工作区 / 全局回落。它是会话档独有的第三态,用 none: true 提交,内部存成一个哨兵值。
与「清除选择」(personaId: null)是两件事——后者会继续往下回落并注入。
- 会话选择只活在进程内存里(DSH 重启即回落到工作区 / 全局),符合会话本身的临时性; 工作区选择与人设库一起持久化;「选哪一档」这个范围本身也是持久化的(三档都能存住)。
- 回落是临时的:某条人设被停用 / 删掉时,解析会暂时回落到内置默认,但不会改写 current。重新启用后自动恢复,不需要再点一次「设为当前」。
(曾经这里会顺手改写——等于在设置页点一次「刷新」就把用户的停用选择永久抹掉了。)

对应接口:set-mode(global / workspace / session)、set-workspace-persona (cwd + personaId)、set-session-persona(sessionId + personaId; personaId: null 表示清除、none: true 表示本会话不启用)、set-current (id: null 表示关闭全局人设);GET /status?sessionId=<id>&cwd=<path> 会额外返回该会话 / 该工作区的视角,以及最终生效的是哪一条(effective)、「全局是否被关掉」(globalOff)与「本会话是否被设为不启用」(sessionOff)。

人设库与接口

- 持久化位置:<DSH_HOME>/storages/dsh-persona-dafeiyu/personas.json。
DSH_HOME 没设时退回 DSH 家目录(Windows 上是 %USERPROFILE%\.dsh\,类 Unix 上是 ~/.dsh/),代码里走 os.homedir() 动态求值、不写死任何绝对路径。
写入采用「临时文件 + 改名」,文件损坏时回退到空库而不会让插件挂掉。
- 接口(都只接受回环请求):

| 方法 | 路径 | 作用 |
| GET | /api/dsh-persona-dafeiyu/status | 当前状态 + 人设列表(只有元数据,不含正文)+ 存储路径;带 ?sessionId=&cwd= 时另给会话 / 工作区视角与 effective |
| GET | /api/dsh-persona-dafeiyu/persona?id=<id> | 按需取单条人设的完整正文(「查看全文」用;内置 / 导入 / config 都走这里) |
| POST | /api/dsh-persona-dafeiyu/mutate | set-current / import / rename / remove / set-enabled / set-mode / set-workspace-persona / set-session-persona |

非回环访问返回 403,方法不对返回 405,请求体不是 JSON 返回 400,操作被拒时返回 { ok: false, error }(HTTP 仍为 200,错误语义在 body 里)。

- 活体自测(端口以 DSH 启动时打印的地址为准):

Invoke-WebRequest http://127.0.0.1:<port>/api/dsh-persona-dafeiyu/status -UseBasicParsing

插件配置(可选)

在「插件」页选中 dsh-persona-dafeiyu 那一行改 config,或直接编辑 cordis.patch.yml:

| 字段 | 默认 | 含义 |
| enabled | true | 总开关;关掉即完全不注册段落(设置页会显示「插件被 enabled: false 停用」) |
| prefix | '' | 自定义人设正文,在列表里作为一条 config 人设出现 |
| personaFile | '' | 外部 Markdown 人设文件路径,同样作为一条 config 人设出现 |
| suffix | '' | 追加在工具指导之后的人设后缀(order 对齐 DEPLOYMENT_PERSONA_SUFFIX = 10200) |
| order | 未设 | 显式指定前缀段落顺序,覆盖默认的 0 |

prefix / personaFile 不是「最高优先级」,而是列表里的一个可选项(id 固定为 config):想用它就去设置页设为当前;清空配置它就从列表里消失。日常使用建议直接导入人设,不再动这两个字段。

完整示例见 examples/config.example.yml。

配置由 @deepseek-ai/schemastery 描述;本地 link: 安装时该模块可能解析不到,插件会自动退回内置的最小 standard-schema,配置校验与默认值照旧生效,不会因为缺依赖而加载失败。

开发与自检

克隆下来不需要 npm install 就能验证:

npm test # 自检:宿主侧人设库 / 生效范围 / 回环接口 / 客户端 bundle 渲染
npm run privacy-check # 本机信息自查:绝对路径、用户名、邮箱、密钥、公网 IP…
npm run privacy-self-test # 自查脚本自己的自检:身份规则该报的报、不该报的不报

- 自检把人设库隔离到临时 DSH_HOME,不碰你真实的人设库。
- 全新克隆 / CI 上找不到 @deepseek-ai/schemastery 时,插件会退回内置兜底 schema,自检会打印一行说明并照常全绿(退出码 0),所以 CI 无需任何安装步骤。
- 改完内置人设正文后请务必跑一次 npm test:其中一组断言会给每条内置人设取一段正文指纹,用来保证内置正文不会从状态接口泄漏出去。
新增内置人设时不用手改这些断言——它们是遍历 BUILTIN_PERSONAS 的,但你必须同时补上 lib/client.js 里对应的中英词条,否则自检会直接报出来。

本机用户名是通用词时(root / user / test …)

privacy-check 会用「本机用户名」做一次大小写不敏感的裸词搜索,而容器、VPS、 CI 里的用户名常常就是 root 这类普通英文单词 —— 那会把 const root = path.resolve(…) 这种正常代码报成「本机用户名泄漏」,退出码 1 把 CI 打红,还给出改不对的建议。

所以身份规则分两层:

- 够独特的名字(带数字 / 下划线,或够长的少见串)→ 照旧裸词全仓库搜索;
- 通用词 → 跳过裸词,只保留路径形态匹配(用户目录路径里出现才报)。
这时报告开头会有一行提示说明「少了一层、以及为什么」,不会悄悄降级。

想验证这套判定是否符合预期,跑 npm run privacy-self-test(11 项,不起子进程、不读磁盘)。

更多约定见 CONTRIBUTING.md。

实现要点

- 人设作为独立 prompt section(dafeiyu:persona)注册,不占用也不覆盖 DSH 自带的 deployment:persona-prefix 槽位,因此可以全局挂载,其它 preset 依旧能遮蔽它。
- 默认顺序 = DEPLOYMENT_PERSONA_PREFIX(order 0):第一方开场白之后、所有工具指导之前。
- 段落以 interpolate: false + 函数 text 注册:函数每次组装被调用,返回当前人设正文;停用或无人设时返回空串,空段落会被自动丢弃。
- 内置人设同时受两层保护:代码里的 BUILTIN_PERSONAS 与读取存储时的保留 id 过滤(磁盘上伪造同 id 的条目会被直接丢弃)。
- 正文按需下发:/status 只给元数据(内置带 description 简介),点「查看全文」才走 /persona?id=;这样开启很多条人设时也不会把状态接口撑成几 MB。
- 「当前该注入谁」由一个 resolvePersona() 解析(会话 → 工作区 → 全局的阶梯);提示词注入与状态接口的 effective 都调用它,所以界面显示与实际注入不会漂移。
- 会话人设选择器注册在 shell.overlay(整帧浮层插槽),用 position: fixed 居中; 不往 document.body 追加 DOM。小条、起始页 chip 与浮层是三个独立插槽组件,用一个极简 store 联动(chip 只负责「带上 sessionId / cwd 打开」,浮层负责渲染与提交)。
- 新会话起始页的 chip 注册在 conversation.hero.options,只在 hero 阶段(还没发第一条消息)由宿主渲染;它与输入框小条共享同一套状态接口,所以两处显示的人设名永远一致。

界面语言(中 / 英)

界面文案走 DSH 的 locale 服务,字典命名空间是 personaDafeiyu,注册 zh 与 en 两份。

- 语言跟随 DSH:在「设置 → 通用」里切换界面语言,本插件的设置页与输入框小条一起变,不需要重启或刷新插件。字典在挂载后注册也会被认到。
- 内置人设的名字与简介:宿主侧只有中文原文,界面按当前语言取插件字典里的词条(personaNameDafeiyu / personaAboutTinglan 这一类),所以英文界面显示 Tinglan 而不是「听澜」。
- 回退策略:字典里查不到某条(例如第三方语言包只翻了一半),界面回退到宿主给的原文,而不是把键名(personaAboutTinglan)显示出来。
- 用户数据不翻译:你导入的人设名按原样显示——中文名在英文界面上依旧是中文名。
- 标点也随语言:「简介」这类「标签 + 值」的行用字典里的 labelSeparator:中文是全角冒号 :,英文是 : 。
- 新增内置人设时:lib/index.js 的 BUILTIN_PERSONAS、lib/client.js 的 BUILTIN_LOCALE_SUFFIX 与 zh / en 两份词条要一起补,自检会强制检查。

兼容性

已实测的 DSH 版本

| DSH 版本 | 状态 |
| 0.2.0-rc.2 | ✅ compatible(开发与自检都在这一版) |
| 0.2.1-alpha.4 | ✅ compatible |
| 0.2.1-rc.2 | ✅ compatible |
| 0.2.1-rc.3 | ✅ compatible(起始页 chip 的 conversation.hero.options 就是这一版引入的) |

起始页 chip 依赖的 conversation.hero.options 插槽从 0.2.1-rc.3 起才有。
更老的宿主没有它,slots.inject 不会回调,chip 不显示,其余功能不受影响。

同一份清单也声明在 package.json 的 dsh.compatibility.dshReleases 里,供插件目录读取。
没列出的版本 = 没实测过,不是「已知不兼容」——想确认可以自己跑 npm test。

依赖与席位

- peer:@deepseek-ai/cordis ^4.0.1、@deepseek-ai/dsh-system-prompt ^0.2.0-rc.2、 @deepseek-ai/schemastery ^3.18.4,三者均由运行时提供,故标为 optional peer。
- 浏览器半侧只依赖平台基线里的 react 与 react/jsx-runtime,另需 @deepseek-ai/dsh-client-ui-renderer(提供 slots)与 @deepseek-ai/dsh-client-locale(提供 locale)。
- 总共注册:一个提示词段落(+ 可选 suffix 段落)、三条回环 HTTP 路由、 四个 UI 席位——设置页 settings.section、输入框上方 conversation.composer.dock、浮层 shell.overlay(会话人设选择器)、新会话起始页 conversation.hero.options(开场人设 chip)。
不占侧栏,不改其它插件。

隐私说明

本仓库已做过本机信息清理,不含开发者本机的绝对路径、用户名、主机名、邮箱或任何密钥:

- 文档与注释里的路径一律写成占位符(<本仓库绝对路径>、<profile>、<port>、%USERPROFILE%);
- 代码里读路径一律走 os.homedir() / process.env.DSH_HOME 动态求值,不写死;
- 没有需要外置的敏感配置:本插件不读任何 API Key、Token 或口令。
config 里唯一可能带本机信息的是 personaFile(外部人设文件路径),示例见 examples/config.example.yml,真实路径请留在本机、不要提交;
- 人设库(personas.json)属于本地运行数据,已在 .gitignore 中排除;
- 唯一的外部地址是设置页里的「人设广场」链接(https://kondius.cn/qq-agent/persona-plaza/index.html)。它只是一个 :插件不向该域名发任何请求、不加载任何外部资源、不放埋点;只有你点击才会跳转,且以 noopener noreferrer 在新标签页打开。
- 改动后请跑 npm run privacy-check 自查,CI 也会跑一遍。

License

MIT,见 LICENSE。
预览分享卡片长什么样 ↓huaizhuanghub/dsh-persona-dafeiyu
分享 · DeepSeek Harness Hub
huaizhuanghub/dsh-persona-dafeiyu

DeepSeek Harness 的人格库插件:内置人格,可导入自己的,切换不用重启。

回到顶部