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

人格热切换 sorbitol25/dsh-persona-switch

DeepSeek Harness
sorbitol2518 天前有提交已提供中文文档扫描:含敏感能力

在运行中的会话里即时切换系统提示词人格,无需重启

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add sorbitol25/dsh-persona-switch
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]!
实装验证未通过(runtime_add_failed),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
数据截至 2026/11/03·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 18 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(runtime_add_failed · 2026/11/3) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 8 处,展示前 8 条)
  • 写入本地文件
    lib/index.js:60
    appendFileSync(LOG_FILE, `${new Date().toISOString()} ${msg}\n`)
  • 读取本地文件
    lib/index.js:95
    entries = readdirSync(PERSONA_DIR)
  • 读取本地文件
    lib/index.js:103
    const { meta, text } = parsePersona(readFileSync(file, 'utf8'))
  • 读取本地文件
    lib/index.js:124
    if (existsSync(PERSONA_DIR)) return false
  • 写入本地文件
    lib/index.js:125
    mkdirSync(PERSONA_DIR, { recursive: true })
  • 读取本地文件
    lib/index.js:137
    const parsed = JSON.parse(readFileSync(STATE_FILE, 'utf8'))
  • 写入本地文件
    lib/index.js:146
    mkdirSync(DSH_HOME, { recursive: true })
  • 写入本地文件
    lib/index.js:147
    writeFileSync(STATE_FILE, `${JSON.stringify(state, null, 1)}\n`)
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-persona-switch 为 DeepSeek Harness(dsh)提供实时人格切换。在运行中的会话里直接切换系统提示词人格——TUI、Web UI 或无头模式都行,不用重启,也不用改核心。插件自带切换器,外加示例 JB 人格(jb);更长的变体人格故意没有收录,你自己的人格放在 $DSH_HOME/personas/。 /persona show the active persona + the roster /persona list same /persona jb switch (name = personas/<name>.md) /persona off stop overriding the system prompt /persona reload re-read the persona directory (after editing a file) /persona complete on|off|auto 或者直接跟智能体说——persona_switch 已经注册成工具: jbに切り替えて 验证 人格到底有没有覆盖提示词,是可以测出来的:把路由指向本地 mock(DEEPSEEK_BASE_URL),读取 DSH 发出的请求体。
展开完整文档(README 剩余 1 节)
dsh-persona-switch

为 DeepSeek Harness(dsh)提供实时人格切换。在运行中的会话里直接切换系统提示词人格——TUI、Web UI 或无头模式都行,不用重启,也不用改核心。插件自带切换器,外加示例 JB 人格(jb);更长的变体人格故意没有收录,你自己的人格放在 $DSH_HOME/personas/。

/persona show the active persona + the roster
/persona list same
/persona jb switch (name = personas/<name>.md)
/persona off stop overriding the system prompt
/persona reload re-read the persona directory (after editing a file)
/persona complete on|off|auto

或者直接跟智能体说——persona_switch 已经注册成工具:

jbに切り替えて

验证

人格到底有没有覆盖提示词,是可以测出来的:把路由指向本地 mock(DEEPSEEK_BASE_URL),读取 DSH 发出的请求体。test/capture-prompt.mjs 做的就是这件事,三种状态的表现和 front-matter 里写的完全一致:

| persona | complete | agent-turn system message | harness identity |
| off | — | 2,823 B | PRESENT |
| jb | true | 7,989 B — byte-exact match with personas/jb.md | absent |
| jb | false | 10,814 B (= 2,823 merged + 7,989 persona) | PRESENT |

每种情况下都会带上 25 个工具 schema,thinking 保持开启,会话标题辅助请求(单独一个 363 B 的请求)不受影响。

为什么非得做成插件

DSH 自己的文档写得很清楚:「Deployment-authored prompt text is config/ composition only … there is no end-user prompt-editing API.」 部署人格挂在 dsh-system-prompt 那一行的配置上,dsh-persona 只在单个智能体预设内部遮蔽它。会话跑起来之后,两者都切不了。

这一行注册一个提示词 section,它的 text 是服务商函数,每次组装时求值:

sp.section({
name: 'persona-switch:persona',
order: sp.getSectionOrder('DEPLOYMENT_PERSONA_PREFIX'),
text: () => activeText(), // ← read on every turn, not at boot
interpolate: false,
complete: activeComplete(), // persona becomes the whole system prompt
})

切换时销毁并重新注册这个 section,触发 system-prompt/change;下一轮就按新人格组装。

安装

从 npm 安装(每个配置档一行命令——每个 dsh 配置档都是独立安装):

dsh plugin --profile web add dsh-persona-switch
dsh plugin --profile dsh-tui add dsh-persona-switch
dsh plugin --profile headless add dsh-persona-switch # for scripting

重启该配置档(或直接启动它),/persona 就在那里了。不用再配置别的——包内声明了 dsh.bundle.patch,所以 dsh plugin add 会顺带把它追加到 dsh.profile.bundles。如果 pnpm 的 packument 缓存过期,可能给你一个旧版本,那就锁定版本(…add dsh-persona-switch@0.1.2);直接 add dsh-persona-switch 会解析到 latest。

从本地检出安装(开发用——file: 依赖是符号链接,改完下次启动 dsh 就生效,不用重装):

dsh plugin --profile web add file:C:/path/to/dsh-persona-switch

桌面应用(Electron)。 它的 desktop 配置档是保留的:dsh plugin --profile desktop … 会拒绝执行,报 profile "desktop" is managed exclusively by the Electron application。手动安装(或运行 scripts/install-desktop.ps1,它做的就是这件事,并会校验结果):

powershell -ExecutionPolicy Bypass -File scripts/install-desktop.ps1

然后彻底退出应用(包括托盘)再重新启动。/ 菜单里现在会列出 persona;/persona <name> 在宿主侧执行(不产生模型轮次,不消耗 token)。如果应用更新重写了 ~/.dsh/profiles/desktop/package.json,重跑一遍脚本。

升级 / 卸载

dsh plugin --profile web add dsh-persona-switch@0.1.2 # upgrade (pin: pnpm can serve a stale packument)
dsh plugin --profile web remove dsh-persona-switch # uninstall

卸载不会动 $DSH_HOME/personas/.md(那是你的文件,不属于包)。

角色

$DSH_HOME/personas/.md——首次运行时从 personas/ 播种,之后归你编辑。文件名主干就是角色名。可选 front-matter:

title: JB core (persona slim2 / 8KB) # shown by /persona list
complete: true # true = this becomes the ENTIRE system prompt
suffix: "" # optional text after first-party guidance

<persona prose>

| 字段 | 默认值 | 含义 |
| title | 文件名主干 | 名册里显示的标签 |
| complete | false | true 会替换整个系统提示词(harness 身份、引导语、全部内容)。false 把文本放到角色前缀槽位,保留第一方引导语。 |
| suffix | — | 追加到角色后缀槽位,而不是前缀 |

内置种子:

| 角色 | 大小 | complete | 说明 |
| jb | ~8 KB | 是 | 示例 JB 角色 |
| terse | 0.5 KB | 否 | 非完整角色的示例 |
| _selftest | 0.3 KB | 是 | 只回答 BANANA——用来验证接线 |

jb_full(84 KB 的变体)不在本仓库里,也不在它的历史记录中——它在 2026-10-12 被移除,.gitignore / .git/info/exclude 会把它挡在外面。

complete: true 会让配置档成为整个系统提示词(见验证);false 保留第一方指引,把配置档放到 deployment-persona 槽位。可选的 suffix: 落在第一方指引之后。你自己的配置档放在 $DSH_HOME/personas/ —— 往那里丢一个 .md,然后运行 /persona reload。

添加你自己的

往 $DSH_HOME/personas/ 丢一个 .md 文件,然后 /persona reload。不用重启。

文件

$DSH_HOME/personas/ your personas (seeded once)
$DSH_HOME/persona-switch.json { "active": "...", "complete": true|null }
$DSH_HOME/persona-switch.log what registered, when, and why anything failed

状态是部署级的(一个 $DSH_HOME),所以在 TUI 里切换的配置档,下一次 headless 运行也会用。脚本化使用因此变得简单:

'{ "active": "jb" }' | Set-Content "$env:USERPROFILE\.dsh\persona-switch.json"
dsh headless "..." # runs under jb

配置

cordis.patch.yml:

- id: persona-switch
name: dsh-persona-switch
config:
maxPersonaBytes: 400000 # truncate a longer persona (0 = no cap)
tool: true # register the model-facing persona_switch tool

测试

npm test # node test/unit.mjs — 30 assertions, no network
node test/capture-prompt.mjs --persona _selftest # proves the system message
node test/capture-prompt.mjs --persona off # and the stock prompt, for contrast

test/unit.mjs 拿真实的 apply() 跑一个假的 Cordis 上下文:播种、名册、切换、complete 开关、状态持久化、工具路径、未知名称、拆卸。

test/capture-prompt.mjs 起一个本地 mock,说 Anthropic Messages 和 OpenAI chat-completions,把 DEEPSEEK_BASE_URL 指向它,运行 dsh headless,报告收到的系统消息。不会有任何东西到达真实服务商,所以跑起来不花钱。设 DSH_CAPTURE_DIR=<dir> 可以导出完整请求体。

线上路径也用同样方式验证过:

$ node test/capture-prompt.mjs --persona _selftest "What is 1+1?"
system bytes : 256
harness identity : absent
persona "_selftest" : system message IS the persona (exact match)

说明 / 限制

- complete: true 很重。 每一轮配置档都是整个系统提示词;84 KB 的配置档每次请求都要花这些 token,还可能改变前缀缓存行为。用 dsh-whale-widget / dsh-context 盯着它。
- 两个 complete 段会让组装失败 —— 这一行只注册它自己,所以把其他配置档插件挡在外面,或者关掉。
- 没有客户端 bundle:切换器是斜杠命令 + 工具,不是 Web 设置面板。在 Web UI 里,命令从输入框就能用。
- 这里没有任何东西是 JB 专属的 —— 它就是个配置档切换器。JB 预设只是被要求提供的种子。
- DeepSeek 路由使用 Anthropic Messages(POST /v1/messages),开启 thinking,并按模型路由设置 output_config.effort;插件不碰这两项。
- 已发布:仓库已公开,包已上 npm(查当前版本用 npm view dsh-persona-switch version)。下一个版本见 PUBLISHING.md —— §0 是当前状态,§3 记录了 JB-seed 的决定(2026-10-12 做出,jb.md 随包发布, jb_full.md 永不发布)。
预览分享卡片长什么样 ↓sorbitol25/dsh-persona-switch
分享 · DeepSeek Harness Hub
sorbitol25/dsh-persona-switch

在运行中的会话里即时切换系统提示词人格,无需重启

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部