傲嬌小鯨魚:給 DSH 加一段可開關的全局人格段落

前言

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;
  • 輔助:恢復出廠文案、複製到剪貼板、字數、狀態徽標(未就緒 / 可保存)。

卡片裏的「選擇本地圖片…」會讀圖 → 瀏覽器側縮到寬 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]),因此任何監聽器對段的修改都會被丟掉——這是設計使然,插件層繞不過去。內置的 minimal preset 就是 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
羽毛球分组比赛记分
小程序二维码

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

小夜