前言¶
在 DeepSeek Harness(DSH)里做多角色协作时,常见做法是手动改系统提示、开多个会话,或把人格写死在 AGENT.md 里。换一个人就要改配置或换窗口,历史消息也很难对得上「当时是哪个角色在答」。若你希望同一个窗口里用一句话切换语气与人设,并给每个人格单独的头像与正文,又不想为增删角色去改插件源码,dsh-multi-persona 针对的就是这条路径。
这是什么¶
dsh-multi-persona(npm 包名;曾用名 dsh-persona-router)由维护者 Darwin-2002 发布,在 SkillHub 分类为趣味换装,当前 GitHub 仓库星标为 0。插件在同窗口内按你对助手的称呼路由人格,支持多人同台接话;每个人格对应独立正文与头像,人格数据以文件夹形式存放在 <DSH_HOME>/personas/。包版本 1.11.5,许可证 MIT,要求 Node.js ≥ 20。
内部仍使用路由前缀 /persona-router、数据目录 <DSH_HOME>/persona-router/ 与上下文段名 persona-router:*,与 2026-11-10 起的包名「dsh-multi-persona」、面板标题「多人格切换」并存,便于沿用已有状态文件。
核心机制¶
下面介绍一轮请求从判定到展示的链路。
| 环节 | 做法 |
|---|---|
| 判定 | agent/pre-step 读取本轮最后一条用户消息,在称呼位上匹配别名 |
| 记账 | <DSH_HOME>/persona-router/state.json,按 session 分开记录 |
| 注入 | ctx.systemPrompt.context(),order: 250,interpolate: false |
| 头像 | 壁纸引擎开启时改写其头像节点;关闭时自绘一层;同一时刻仅一份 |
| 底座 | ~/.dsh/AGENT.md 写成中性协作规则与「兜底人格」;插件失效时退回兜底 |
判定规则刻意保守:别名须贴在句首、标点或空白边界;别名后可跟「在不在」「在吗」等称呼尾词;正文中顺带提到的名字不会触发切换;一轮未点名则沿用会话上次人格;从未切换时按会话 → 工作区 → 全局三档阶梯解析。
典型单人切换示例:
「普拉娜,帮我看看这段 C 盘日志」 → 这一句起换成普拉娜
「阿罗娜,刚才那个再说一遍」 → 这一句起换成阿罗娜
「那这份文献呢」 → 沿用上一个(不会乱切)
多角色同台¶
一轮消息里在称呼位点上 ≥2 位人格时,插件让它们共用同一段记忆、在同一模型调用内依次接话(并非多个独立 AI)。先开口者为消息里第一个被叫到的名字,其余按点名顺序接话,每段以「【名字】」起头。
「诺亚、优香,这个预算你们看」
→ 【诺亚】先回应老师
→ 【优香】接着她的话说:同意 / 不同意 / 补一句她漏掉的
同台默认开启(config.json 的 multiRole,默认 true);设为 false 则退回「取最后一位」行为。同台之后默认由先开口者接棒(pinLeadOnMulti,默认 true)。人格目录的 persona.json 可配置可选 voice 数组(每条一句话,最多 6 条),同台时作为声线硬约束挂在正文后。
排障可不发真实消息,调用 GET /persona-router/probe?text=<URL 编码的一句话>&session=<id> 查看命中谁、是否同台、世界书条目,只计算不写盘。
人格目录与可选世界书¶
人格 = 一个文件夹,增删不改插件代码:
<DSH_HOME>/personas/
<id>/
persona.json # 必填
prompt.md # 必填,人格正文
avatar.png # 可选,也可 avatar.jpg / avatar.webp
persona.json 中 aliases 决定如何被称呼;name 与 id 会自动并入别名。新增人格可复制仓库 examples/sample/ 改目录名,重启或等待热重载后即可呼叫。
可选 lore.json 按关键词或 constant: true 注入世界书,单次请求上限为 8 条、合计 20,000 字符;无此文件时行为不变。
三档生效范围¶
优先级从高到低:会话档(叫名字或 PUT /persona-router/session)→ 工作区档(按归一化 cwd,PUT /persona-router/workspace)→ 全局 default(面板「设为默认」)→ 列表中第一个可用人格。@none 表示该档明确不注入人格块。叫名字永远优先于工作区与全局;阶梯解析结果不会写回会话档,以免永久钉死。
设置面板与配置¶
在 DSH 设置 → 人格路由(section id persona-router)可开关按称呼自动切换、改别名、上传头像(裁成 512×512)、设默认、试算判定等。面板不编辑 prompt.md(由 dsh-agent-md 的「人格」页负责)。
可选 config.json 示例:
{ "enabled": true, "avatarRepeatRows": 6, "avatarSize": 40 }
另支持 multiRole、pinLeadOnMulti 等字段,含义见仓库 README。插件依赖本机 webServer 提供头像 HTTP 路由。
安装与启用¶
先做环境确认:DSH profile 需具备 webServer 与 systemPrompt(已在插件 inject 中声明)。安装前建议阅读 GitHub 源码 与 MIT 许可证;插件在当前 DSH 进程权限下运行,安装即信任其宿主半与客户端半代码。
从 npm(发布之后):
dsh plugin add dsh-multi-persona
从 GitHub 源码(构建期需 allowBuilds 授权):
dsh plugin add github:Darwin-2002/dsh-multi-persona
本地目录(开发):指向包根目录执行:
dsh plugin install <本包目录>
亦可在 DSH「插件管理」中选择「安装本地插件」。安装器会维护 profile 的 package.json 与 cordis.patch.yml,不要手写这两项。
从 dsh-persona-router 升级时须先卸旧再装新:
dsh plugin remove dsh-persona-router
dsh plugin add dsh-multi-persona
人格目录与 persona-router/ 下状态可保留,无需迁移。宿主半代码变更后插件管理里关开一次本插件或重启 DSH;GET /persona-router/health 的 codeVersion 可用于确认版本。
与 dsh-agent-md 的关系¶
插件不修改 dsh-agent-md 源码,但会将 ~/.dsh/AGENT.md 调整为中性底座加「兜底人格」:本轮已注入「当前人格」块时兜底节作废;插件停用或加载失败时仍由兜底人格接手,避免空壳提示词。
适用场景与注意¶
适合在同一 Harness 窗口里做角色扮演、分角色评审或按项目目录绑定不同协作风格的用户。需注意:只识别称呼位,单字别名易误触,建议两字以上;同台仍为单次模型调用;三档中的工作区与世界书在设置面板侧的部分 UI 入口 README 标明尚未齐备,可用 HTTP API 或手写 lore.json 操作。
卸载:
dsh plugin remove dsh-multi-persona
数据目录 <DSH_HOME>/personas/ 与 <DSH_HOME>/persona-router/ 会保留,可按 README 回退 AGENT.md。
结尾¶
dsh-multi-persona 把「人格」落成可文件夹管理的配置:按称呼切换、可选同台、按轮次还原头像,并与 DSH 插件化架构一致。更多信息见 SkillHub 目录页 dsh-multi-persona 与仓库 Darwin-2002/dsh-multi-persona。