DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Persona Switch — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
P

dsh-persona-switch

Persona Switch

DeepSeek Harness 的实时 persona 切换器:将 persona 直接放入 $DSH_HOME/personas,通过 /persona <name> 或 persona_switch 工具切换,无需重启。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:sorbitol25/dsh-persona-switch#a078d30b79834b53d892b4cb2d6e24679593f075
README兼容性版本

兼容性与来源证明

Persona Switch 以 dsh-persona-switch 发布,当前版本为 0.1.3。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
any
发布来源
github
Registry 更新时间
2026/10/17

版本

0.1.3stable
2026/10/17

相关插件

正在加载相关插件…

最新版
0.1.3
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
any
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/17
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Whale Widgetdsh-whale-widgetDSH Web 界面右下角的 DeepSeek 余额小鲸鱼挂件:余额/今日已用/峰谷定价、自定义泡泡点击序列(文本/余额/今日/峰谷/图片/随机语句与并列加权选择)、逐行样式与字体、悬浮快捷编辑、音效与每轮消耗、自定义角色/动图/音效、吸附与翻转自定义Client Ui Skill Explorer@linxin666/dsh-client-ui-skill-explorerDSH 技能中心:按来源(bundled / project / user / custom / runtime)浏览已加载的技能,在 Web GUI 面板中启用或禁用、创建和删除技能。Remote Web Ui@linxin666/dsh-remote-web-ui通过扫码配对访问 dsh Web GUI,共享一个官方界面:设置按钮旁的二维码可将手机和 PC 配对到同一个 Web GUI(手机采用竖屏触控适配层,PC 使用完整桌面界面),通过一次性令牌和 rClient Ui Task Board@linxin666/dsh-client-ui-task-board面向 DSH Web GUI 的主机权威任务面板,支持实际会话执行、主机 cron 调度以及可选的跨平台空闲睡眠保护;以挂载方式提供,无需修改 DSH 源代码。

README

dsh-persona-switch

Live persona switching for DeepSeek Harness (dsh). Switch the system-prompt persona from inside a running session — TUI, Web UI, or headless — with no restart and no core patch. Ships with the switcher plus the example JB persona (jb); a longer persona variant is deliberately not included and your own personas live in $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

Or just ask the agent — persona_switch is registered as a tool:

jbに切り替えて

Proof

Whether a persona actually overrides the prompt is measurable: point the route at a local mock (DEEPSEEK_BASE_URL) and read the request body DSH sends. test/capture-prompt.mjs does exactly that, and the three states differ exactly as the front-matter says:

personacompleteagent-turn system messageharness identity
off—2,823 BPRESENT
jbtrue7,989 B — byte-exact match with personas/jb.mdabsent
jbfalse10,814 B (= 2,823 merged + 7,989 persona)PRESENT

25 tool schemas ride along in every case, thinking stays enabled, and the session-title helper (a separate 363 B request) is untouched.

Why a plugin is needed at all

DSH's own docs are explicit: "Deployment-authored prompt text is config/ composition only … there is no end-user prompt-editing API." The deployment persona lives on the dsh-system-prompt row's config, and dsh-persona only shadows it inside one agent preset. Neither is switchable while a session is up.

This row registers one prompt section whose text is a provider function, evaluated at every assembly:

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
})

Switching disposes and re-registers that section, which emits system-prompt/change; the next turn is assembled against the new persona.

Install

From npm (one line per profile — each dsh profile is a separate install):

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

Restart that profile (or just start it) and /persona is there. Nothing else to configure — the package declares dsh.bundle.patch, so dsh plugin add also appends it to dsh.profile.bundles for you. Pin the version (…add dsh-persona-switch@0.1.2) when a stale pnpm packument could hand you an older release; plain add dsh-persona-switch resolves to latest.

From a checkout (development — a file: dependency is a symlink, so edits take effect on the next dsh start, no reinstall):

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

Desktop app (Electron). Its desktop profile is reserved: dsh plugin --profile desktop … refuses with profile "desktop" is managed exclusively by the Electron application. Install it by hand (or run scripts/install-desktop.ps1, which does exactly this and verifies the result):

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

then quit the app completely (tray included) and start it again. The / menu now lists persona; /persona <name> runs host-side (no model turn, no tokens). If an app update rewrites ~/.dsh/profiles/desktop/package.json, re-run the script.

Upgrade / uninstall

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

Uninstalling leaves $DSH_HOME/personas/*.md alone (your files, not the package's).

Personas

$DSH_HOME/personas/*.md — seeded from personas/ on first run, then yours to edit. The file stem is the persona name. Optional 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>
fielddefaultmeaning
titlefile stemlabel in the roster
completefalsetrue replaces the whole system prompt (harness identity, guidance, everything). false puts the text at the persona-prefix slot and keeps first-party guidance.
suffix—appended at the persona-suffix slot instead of the prefix

Shipped seeds:

personasizecompletewhat it is
jb~8 KByesthe example JB persona
terse0.5 KBnoexample of a non-complete persona
_selftest0.3 KByesanswers only BANANA — proves the wiring

jb_full (an 84 KB variant) is not in this repo and not in its history — it was removed on 2026-10-12 and .gitignore / .git/info/exclude keep it out.

complete: true makes a persona the entire system prompt (see Proof); false keeps first-party guidance and puts the persona at the deployment-persona slot. Optional suffix: lands after first-party guidance. Your own personas live in $DSH_HOME/personas/ — drop a .md there and run /persona reload.

Adding your own

Drop a .md file in $DSH_HOME/personas/, then /persona reload. No restart.

Files

$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

State is deployment-wide (one $DSH_HOME), so a switch made in the TUI is the persona the next headless run uses too. That is what makes scripted use easy:

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

Config

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

Test

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 drives the real apply() against a fake Cordis context: seeding, roster, switching, complete toggling, state persistence, the tool path, unknown names, teardown.

test/capture-prompt.mjs starts a local mock that speaks Anthropic Messages and OpenAI chat-completions, points DEEPSEEK_BASE_URL at it, runs dsh headless and reports the system message it received. Nothing reaches a real provider, so it costs nothing to run. Set DSH_CAPTURE_DIR=<dir> to dump full request bodies.

The live path was verified the same way:

$ 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)

Notes / limits

  • complete: true is heavy. The persona is the entire system prompt every turn; an 84 KB persona costs those tokens on every request and can change prefix-cache behaviour. Watch it with dsh-whale-widget / dsh-context.
  • Two complete sections would fail assembly — this row is the only one it registers, so keep other persona plugins out or switch them off.
  • No client bundle: the switcher is a slash command + tool, not a Web settings panel. In the Web UI the command works from the composer.
  • Nothing here is JB-specific — it is a persona switcher. The JB presets are just the seeds that were asked for.
  • The DeepSeek route speaks Anthropic Messages (POST /v1/messages) with thinking enabled and output_config.effort set per model route; the plugin does not touch either.
  • Released: the repo is public and the package is on npm (npm view dsh-persona-switch version for the current one). For the next release see PUBLISHING.md — §0 is the current state and §3 records the JB-seed call (made 2026-10-12, jb.md ships / jb_full.md never).