dsh-persona-slot:为 DeepSeek Harness 提供「每会话一人设」

前言

在 DeepSeek Harness(DSH)里给模型定角色,常见做法是用 @deepseek-ai/dsh-persona:整个人设绑在一个 preset 上,该 preset 下所有会话共用同一套人设。若要在同一窗口里让「这个会话是猫、那个会话是律师」,或在对话进行中临时改人设,preset 级方案覆盖不到。

dsh-persona-slot(维护者 Zylog82568,社区分类「趣味换装」)针对的是会话级人设:每个会话恰好保留一个人设槽位,另有一条全局人设供未单独配置的会话继承;可通过 /persona 命令或在 Web GUI 的 Plugins → Installed 面板编辑。下文按安装、配置、用法与注意事项说明。

这是什么

一句话:dsh-persona-slot 是 DSH 的 per-session persona 插件——写入新人设会替换旧值而非叠加;全局人设覆盖所有没有会话专属记录的会话;变更在下一步模型调用时通过 agent 范围的 system-prompt/assemble 钩子生效,不同会话互不可见。

与官方 dsh-persona 的分工:preset 级统一角色仍用 dsh-persona;需要按会话区分或在运行中改人设时用本插件。

核心功能

每会话一人设

这是实现保证,不是约定:

  • 会话存储是单值,set 即覆盖,不会拼接多条人设。
  • 解析在第一个有记录的层级停止,同一会话不会同时带上「精确会话人设」和「全局人设」两段。

三层解析顺序

第一个有记录的层级生效:

顺序 层级 存放位置
1 精确 session id config.sessions["<id>"] 或运行时 store
2 通配符 "*" config.sessions["*"] 或运行时 store
3 global config.global 或运行时 store

记录可以是文本(作为人设),或显式空白。默认 blankOverrides: true 时,空白会终止查找,会话可「静音」而不删部署默认;blankOverrides: false 时空白会继续落到下一层。

/persona 命令

在会话里可直接读写人设,文本原样保留(含多行)。常用形式:

/persona                             显示本会话解析后的人设
/persona show [this|global|all]      显示指定目标
/persona set <text>                  设置本会话人设
/persona set global <text>           设置全局人设
/persona set all <text>              设置通配符层级人设
/persona set for <id> <text>         为指定 session id 设置人设
/persona clear [target]              删除记录,目标回退到下一层
/persona mute [target]               写入空白以阻止回退
/persona list                        列出运行时覆盖
/persona mode append|replace|config  选择人设如何进入 prompt
/persona reset                       清除所有运行时覆盖

for 之后的字符串才当作 session id;例如 /persona set 你是猫娘 会把人设设为「你是猫娘」,不会误解析为 id。

Installed 页面板

在 Web GUI 打开 Plugins → Installed,找到 dsh-persona-slot,展开 persona-slot 行可进入插件专属页:

  • Global persona(总人设):多行编辑器,保存后对所有无会话专属人设的会话生效(下一步模型调用起)。
  • Wildcard persona:无专属人设的会话使用的通配层级。
  • Placement:在部署人设之后追加(append)、替换部署人设(replace),或跟随 profile 配置。
  • Live sessions:各活跃会话当前解析结果、来源,以及对持有专属人设的会话提供 Clear。

面板约每 10 秒刷新,未保存的输入不会被覆盖。数据经 /persona-slot/state 与 /persona-slot/update 读写,与 /persona set 写入同一份文档。无 HTTP 界面的 headless / TUI 组合只能依赖 /persona。

运行时状态位置

用户通过命令或面板写入的内容落在:

$DSH_HOME/persona-slot/personas.json

Profile 里的 YAML 是部署默认值;上述文件是运行时覆盖,升级插件或重建 profile 不会清掉会话里写的人设。文件损坏会被挪为 personas.json.corrupt,插件以空状态启动而非直接失败。

对模型与 Token 的影响

append 模式下人设作为 persona-slot:session 段接在部署人设之后;replace 模式下改写部署人设段本身。人设文本 interpolate: false,字面量 {{anything}} 不会在组装时被当变量展开。人设不变时前缀稳定,有利于 provider 侧 prompt caching;中途 /persona set 会从该段起使 KV cache 失效,这是换身份的预期代价。

安装与启用

官方安装命令(将 <profile> 换为你的 profile 名):

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

本地开发可链接目录:

dsh plugin --profile <profile> add link:/absolute/path/to/dsh-persona-slot

bundle patch 会挂载一行 persona-slot。package.json 标明版本 1.2.0、MIT 许可证;引擎要求 Node ^22.19.0 || >=24.0.0,DSH 版本需在 README/package 声明的范围内。安装前建议阅读仓库源码与许可证——插件以当前 DSH 进程权限运行,人设本身是操作者编写的 prompt 文本,不是安全边界,不能替代工具限制、沙箱或审批策略。

Profile 配置示例(字段含义以 README 为准):

- id: persona-slot
  config:
    global: "You are a terse systems engineer. Answer in short commands."
    sessions:
      "<session-id>": "You are a cat. Every sentence ends with 喵."
      "*": "Answer in Simplified Chinese."
    enabled: true
    mode: append
    prefix: ""
    suffix: ""
    blankOverrides: true
    includeSubagents: true
字段 默认 含义
global "" 无会话专属记录时会话继承的人设
sessions {} 按 session;"*" 为通配层级
enabled true 总开关;false 时不注入但仍保留已存文本
mode append append 追加段,replace 替换部署人设
prefix / suffix "" 人设上下包裹文本
blankOverrides true 空白是否终止该层查找
includeSubagents true 子 agent 会话是否也解析人设

运行时也可用 /persona mode 切换 mode。

典型用法

  1. 在 profile 里写好 global 与 sessions["*"],作为默认中文或角色基调。
  2. 某次对话需要临时角色:在会话中执行 /persona set …,下一步起模型按新身份回复。
  3. 多会话并行、人设不同:分别为各 session 用 /persona set for <id> … 或在面板 Live sessions 中查看来源并清理。
  4. 某会话不想吃全局人设:对该会话 /persona mute 或 clear,配合 blankOverrides 控制是否继续继承下层。

人设长度无上限;过长的人设会在每次请求中占用上下文,需自行控制篇幅。

适用场景与注意

适合:同一 DSH 实例下多会话并行、人设要分开;对话中途换角色;希望通过 GUI 编辑长人设(角色设定表),而不只依赖单行 settings 表单。

局限(README 已说明):

  • 人设不限制工具与策略,不能当权限机制用。
  • 面板依赖 ctx.webServer 的 HTTP 路由;纯 TUI/headless 仅命令行。
  • 解析与覆盖按 session id,不是会话标题。
  • 社区目录页与 GitHub 由维护者发布;DSH 生态是「一切皆插件」,SkillHub 等目录站点与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-persona-slot 把「全局一条 + 每会话一条 + 运行时可改」收进一个 persona 槽位和统一的 prompt 钩子,与 preset 级的 dsh-persona 互补。需要安装或源码时,可访问社区目录页与 GitHub 仓库:

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

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

Xiaoye