前言¶
DeepSeek Harness(DSH)的生態理念是「一切皆插件」。很多插件通過註冊新的提示詞段來注入人設,但按段名白名單收斂提示詞的 agent preset 會過濾掉自定義段——插件裝了沒效果。本插件換一種方式:掛 system-prompt/assemble 事件,把人格文本追加進已經存在且必然被保留的 persona 段。這樣既不會丟失能力,又能給每個會話、每個子代理(包括 MCP 橋接創建的子 Agent)加上一點「傲嬌小鯨魚」的味道。
是什麼¶
- 插件名稱:
wumou-sleep/dsh-xiaojingyu-persona - 分類:模型推理
- 簡介:傲嬌小鯨魚:給 DeepSeek Harness 加一段可開關的全局人格段落(Tsundere whale-girl persona plugin for DSH)
- 維護者:wumou-sleep
- 星標:0
本插件是一個純 Host 插件:沒有客戶端半、沒有構建步驟、沒有 install 腳本。裝上後,只要在 Web UI 的插件設置裏啓用,每個會話、每個子代理都會帶上一段人格文本,開關與文案都可以在設置頁直接修改。
核心功能¶
- 一個
enabled開關:插件管理頁啓用/停用,或插件設置裏直接切換,立即生效,不用重啓。 - 一段
persona文本:不喜歡出廠文案?在插件設置裏整段替換,不用改代碼。 - 純 Host 插件:沒有客戶端半、沒有構建步驟、沒有 install 腳本。
- 工作原理:掛
system-prompt/assemble(prepend: true),把人格文本追加進已經存在、且必然被保留的 persona 段;若某份 preset 完全沒有 persona 段,則補一個名爲persona的兜底段。
工作原理(爲什麼不是「新增一個段」)¶
很多插件會註冊一個新段名來注入人格,但在按段名白名單收斂提示詞的 agent preset 下(例如 @linxin666/dsh-liangshen 的 minimal-prompt 只保留 deployment:persona-prefix / deployment:persona / persona / plan:policy / tools:*),自定義段會被靜默過濾掉——插件看起來「裝了沒效果」。
所以本插件的做法是:掛 system-prompt/assemble(prepend: true,拿到最終段列表),把人格文本追加進已經存在、且必然被保留的 persona 段;若某份 preset 完全沒有 persona 段,則補一個名爲 persona 的兜底段。
順帶一提,追加不會動工具指導、runtime context、協作監聽器等其它段,因此「越獄式」丟失能力的風險不存在——人格只改口氣。
這是一次有理由的偏離¶
DSH 官方插件開發指引(cordis-plugin-development/references/practices.md)建議用 ctx.systemPrompt.section() 註冊段,並明確勸阻監聽 system-prompt/assemble 去增刪文本。本插件仍然選擇後者,原因實測:section() 註冊的新段名會被「按段名白名單收斂提示詞」的 preset 直接過濾掉(例如 dsh-liangshen 的 minimal-prompt 只保留 deployment:persona-prefix / deployment:persona / persona / plan:policy / tools:*)——那樣插件會「裝了沒效果」。兩害相權,選可用的那個,並把偏離寫在這裏。
安裝與啓用¶
本插件需要在某個 profile 裏安裝(桌面端默認 profile 是 desktop)。
從 GitHub 倉庫安裝(把 <owner>/<repo> 換成實際地址,pnpm 會拉取倉庫 tarball,無需本機裝 git):
& "<DSH 安裝目錄>\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add https://github.com/<owner>/<repo>/archive/refs/heads/main.tar.gz
從本地目錄安裝(開發調試用):
& "<你的 DSH 安裝目錄>\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add link:E:\path\to\dsh-xiaojingyu-persona
從插件管理頁安裝:Web UI 的「插件」頁面 · 安裝本地 bundle / 輸入包目錄。
裝完重啓 DSH(新 bundle 需要一次重啓纔會加載新的 JavaScript 模塊)。
裝好後在 設置 頁會出現一個「傲嬌小鯨魚 · 人格預設」分區(客戶端註冊在 settings.section 槽位):
- 展示 三視圖(
assets/turnaround.jpg,以 base64 內嵌進client.js,不額外請求網絡); - 展示 出廠人設,放在可編輯文本框裏(默認值取自
index.js的DEFAULT_PERSONA,單一來源;就緒後以主機裏的當前值爲準); - 保存到配置:直接寫主機配置行的
persona字段(客戶端服務configForms→form.set('persona', text)),保存後對新建會話生效; - 啓用 / 停用:同樣是直寫
enabled; - 輔助:恢復出廠文案、複製到剪貼板、字數、狀態徽標(未就緒 / 可保存)。
三視圖也可自定義(banner 字段)¶
卡片裏的「選擇本地圖片…」會讀圖 → 瀏覽器側縮到寬 720px → 轉 JPEG(q 0.86,必要時逐級降到 0.4),直到 data URL ≤ 190,000 字符;
「保存三視圖」把它寫進配置行的 banner 字段(空串 = 使用插件內置的 assets/turnaround.jpg);
「恢復內置圖」把 banner 清空;
代價:自定義圖以 data URL 存在 cordis.patch.yml 的配置行裏,行會明顯變胖(上限 ~190 KB 文本)。想徹底乾淨就得讓 host 端存文件並提供路由,屬於後續增強。
卡內保存是怎麼做到的¶
客戶端注入官方的 configForms 服務(與 @linxin666/dsh-pet 同一套機制):
inject: ['slots', 'configForms']
const form = ctx.configForms.get('xiaojingyu-persona') // 配置行 id
await form.set('persona', text) // true / false
form.getSnapshot() // { status, value, revision }
該服務可能在 apply() 之後才發佈(官方 dsh-pet 的註釋明確提到這一點),因此卡片內用 40×250ms 的輪詢延遲綁定,並對 status === 'ready' 才允許保存。ctx.configForms.describe() 會列出主機實際服務的命名空間,卡片據此自動匹配本插件的行 id。
開關與配置¶
| 方式 | 位置 | 說明 |
|---|---|---|
| 啓用 / 停用 | Web UI「插件」頁面該插件行 | 停用後人格段落立刻消失,其餘功能不受影響 |
enabled |
插件設置表單 | true(默認)生效,false 關閉 |
persona |
插件設置表單 | 整段替換人格文案;留空則回落出廠文案 |
手工改配置的話,在 profile 的 cordis.patch.yml 裏按 id 覆蓋(按 id 覆蓋會整體替換 config,字段要寫全):
- id: xiaojingyu-persona
name: 'dsh-xiaojingyu-persona'
config:
enabled: true
persona: |
你是一隻傲嬌小鯨魚……
典型用法¶
安裝並啓用後,模型的系統提示詞裏會多出一段(默認值見 PERSONA.md):
你是「傲嬌小鯨魚」——主人身邊的那隻鯨魚娘……自稱「本小姐」……真的幹活:需要事實就調用工具去查,不許憑空編造……
你可以在插件設置頁直接修改這段文案,保存後對新建會話生效。
開關與配置¶
| 方式 | 位置 | 說明 |
|---|---|---|
| 啓用 / 停用 | Web UI「插件」頁面該插件行 | 停用後人格段落立刻消失,其餘功能不受影響 |
enabled |
插件設置表單 | true(默認)生效,false 關閉 |
persona |
插件設置表單 | 整段替換人格文案;留空則回落出廠文案 |
手工改配置的話,在 profile 的 cordis.patch.yml 裏按 id 覆蓋(按 id 覆蓋會整體替換 config,字段要寫全):
- id: xiaojingyu-persona
name: 'dsh-xiaojingyu-persona'
config:
enabled: true
persona: |
你是一隻傲嬌小鯨魚……
適用場景與注意¶
- 需要 DSH
>= 0.2.0-rc.2(dsh-persona段的段名與system-prompt/assemble事件在本版可用)。 - 與
dsh-persona(preset 內人設行)、dsh-cosplay可共存:本插件不註冊新段、不改段名,只把文本追加進 persona 段。 - 若同時裝了別的也掛
system-prompt/assemble的插件(例如dsh-liangshen的minimal-prompt),誰在外層決定「工作區行 / 調度規則」與人格文本的先後次序;兩種順序都實測通過,不丟內容。 complete: true的人設 preset 下本插件靜默無效:系統提示詞服務會在組裝瀑布之前就淺拷貝該 complete 段、瀑布之後用它整體替換 sections(dsh-system-prompt裏completeSection = { ...assembled }與sections: [completeSection]),因此任何監聽器對段的修改都會被丟掉——這是設計使然,插件層繞不過去。內置的minimalpreset 就是complete: true,用它會看不到人設;請選用standard/ptc/cordis/ 自定義 preset(例如liangshen)等非 complete 的組合。- 自定義文案裏的
{{...}}會被安全化:persona 段文本參與提示詞插值,寫成{{foo}}會在渲染時拋unknown prompt variable,打掛該會話的每一次組裝;因此注入前把{{/}}拆成{ {/} }(其餘文本逐字保留)。 dsh.engines.dsh只是聲明:DSH 目前不讀取該字段,真正的運行門檻是本插件用到的system-prompt/assemble與 volatile Config 行爲(0.2.0-rc.2 起可用)。這裏刻意不聲明peerDependencies: {"@deepseek-ai/dsh": ...}——那會把宿主整包拉進 profile 的 node_modules,反而製造 dual-package hazard。link:本地安裝的一個坑:用dsh plugin ... add link:<目錄>安裝時,插件目錄是軟鏈接,Node 按真實路徑解析依賴,因此它看不到 profile 的node_modules。本插件對@deepseek-ai/schemastery做了容錯:解析不到時不導出 Config schema(loader 對無 schema 的插件原樣放行 config),插件照常工作,人格照常注入,只是少了設置表單裏的enabled/persona兩個字段。- 想要設置表單,二選一:
- 在插件目錄裏裝上它聲明的依賴(推薦本地開發時用):
npm install --prefix <本目錄絕對路徑> - 或者改成從倉庫 tarball 安裝,pnpm 會自己把依賴裝進 profile:
dsh plugin --profile <profile> add https://github.com/<owner>/<repo>/archive/refs/tags/v1.0.13.tar.gz
插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證。
卸載¶
& "<你的 DSH 安裝目錄>\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop remove dsh-xiaojingyu-persona
或在插件管理頁裏移除該 bundle,然後重啓。
開發¶
- 入口
index.js:apply(ctx, config)+Config(schemastery)。純函數appendPersona()可離線單測。 - 語法自檢:
node --check index.js。 - 依賴只有
@deepseek-ai/schemastery(宿主已自帶同名包,安裝時會正常解析)。
兼容性¶
- 需要 DSH
>= 0.2.0-rc.2(dsh-persona段的段名與system-prompt/assemble事件在本版可用)。 - 與
dsh-persona(preset 內人設行)、dsh-cosplay可共存:本插件不註冊新段、不改段名,只把文本追加進 persona 段。 - 若同時裝了別的也掛
system-prompt/assemble的插件(例如dsh-liangshen的minimal-prompt),誰在外層決定「工作區行 / 調度規則」與人格文本的先後次序;兩種順序都實測通過,不丟內容。
許可¶
MIT
目錄頁與 GitHub¶
- 目錄頁:https://www.skillhub.cn/plugins/wumou-sleep/dsh-xiaojingyu-persona
- GitHub:https://github.com/wumou-sleep/dsh-xiaojingyu-persona