dsh-persona-slot:爲 DeepSeek Harness 提供「每會話一人設」

前言

在 DeepSeek Harness(DSH)裏給模型定角色,常見做法是用 @deepseek-ai/dsh-persona:整個人設綁在一個 preset 上,該 preset 下所有會話共用同一套人設。若要在同一窗口裏讓「這個會話是貓、那個會話是律師」,或在對話進行中臨時改人設,preset 級方案覆蓋不到。

dsh-persona-slot(維護者 Zylog82568,社區分類「趣味換裝」)針對的是會話級人設:每個會話恰好保留一個人設槽位,另有一條全局人設供未單獨配置的會話繼承;可通過 /persona 命令或在 Web GUI 的 Plugins → Installed 面板編輯。下文按安裝、配置、用法與注意事項說明。

這是什麼

一句話:dsh-persona-slot 是 DSH 的 per-session persona 插件——寫入新人設會替換舊值而非疊加;全局人設覆蓋所有沒有會話專屬記錄的會話;變更在下一步模型調用時通過 agent 範圍的 system-prompt/assemble 鉤子生效,不同會話互不可見。

與官方 dsh-persona 的分工:preset 級統一角色仍用 dsh-persona;需要按會話區分或在運行中改人設時用本插件。

核心功能

每會話一人設

這是實現保證,不是約定:

  • 會話存儲是單值,set 即覆蓋,不會拼接多條人設。
  • 解析在第一個有記錄的層級停止,同一會話不會同時帶上「精確會話人設」和「全局人設」兩段。

三層解析順序

第一個有記錄的層級生效:

順序 層級 存放位置
1 精確 session id config.sessions["<id>"] 或運行時 store
2 通配符 "*" config.sessions["*"] 或運行時 store
3 global config.global 或運行時 store

記錄可以是文本(作爲人設),或顯式空白。默認 blankOverrides: true 時,空白會終止查找,會話可「靜音」而不刪部署默認;blankOverrides: false 時空白會繼續落到下一層。

/persona 命令

在會話裏可直接讀寫人設,文本原樣保留(含多行)。常用形式:

/persona                             顯示本會話解析後的人設
/persona show [this|global|all]      顯示指定目標
/persona set <text>                  設置本會話人設
/persona set global <text>           設置全局人設
/persona set all <text>              設置通配符層級人設
/persona set for <id> <text>         爲指定 session id 設置人設
/persona clear [target]              刪除記錄,目標回退到下一層
/persona mute [target]               寫入空白以阻止回退
/persona list                        列出運行時覆蓋
/persona mode append|replace|config  選擇人設如何進入 prompt
/persona reset                       清除所有運行時覆蓋

for 之後的字符串才當作 session id;例如 /persona set 你是貓娘 會把人設設爲「你是貓娘」,不會誤解析爲 id。

Installed 頁面板

在 Web GUI 打開 Plugins → Installed,找到 dsh-persona-slot,展開 persona-slot 行可進入插件專屬頁:

  • Global persona(總人設):多行編輯器,保存後對所有無會話專屬人設的會話生效(下一步模型調用起)。
  • Wildcard persona:無專屬人設的會話使用的通配層級。
  • Placement:在部署人設之後追加(append)、替換部署人設(replace),或跟隨 profile 配置。
  • Live sessions:各活躍會話當前解析結果、來源,以及對持有專屬人設的會話提供 Clear。

面板約每 10 秒刷新,未保存的輸入不會被覆蓋。數據經 /persona-slot/state 與 /persona-slot/update 讀寫,與 /persona set 寫入同一份文檔。無 HTTP 界面的 headless / TUI 組合只能依賴 /persona。

運行時狀態位置

用戶通過命令或面板寫入的內容落在:

$DSH_HOME/persona-slot/personas.json

Profile 裏的 YAML 是部署默認值;上述文件是運行時覆蓋,升級插件或重建 profile 不會清掉會話裏寫的人設。文件損壞會被挪爲 personas.json.corrupt,插件以空狀態啓動而非直接失敗。

對模型與 Token 的影響

append 模式下人設作爲 persona-slot:session 段接在部署人設之後;replace 模式下改寫部署人設段本身。人設文本 interpolate: false,字面量 {{anything}} 不會在組裝時被當變量展開。人設不變時前綴穩定,有利於 provider 側 prompt caching;中途 /persona set 會從該段起使 KV cache 失效,這是換身份的預期代價。

安裝與啓用

官方安裝命令(將 <profile> 換爲你的 profile 名):

dsh plugin --profile <profile> add dsh-persona-slot

本地開發可鏈接目錄:

dsh plugin --profile <profile> add link:/absolute/path/to/dsh-persona-slot

bundle patch 會掛載一行 persona-slot。package.json 標明版本 1.2.0、MIT 許可證;引擎要求 Node ^22.19.0 || >=24.0.0,DSH 版本需在 README/package 聲明的範圍內。安裝前建議閱讀倉庫源碼與許可證——插件以當前 DSH 進程權限運行,人設本身是操作者編寫的 prompt 文本,不是安全邊界,不能替代工具限制、沙箱或審批策略。

Profile 配置示例(字段含義以 README 爲準):

- id: persona-slot
  config:
    global: "You are a terse systems engineer. Answer in short commands."
    sessions:
      "<session-id>": "You are a cat. Every sentence ends with 喵."
      "*": "Answer in Simplified Chinese."
    enabled: true
    mode: append
    prefix: ""
    suffix: ""
    blankOverrides: true
    includeSubagents: true
字段 默認 含義
global "" 無會話專屬記錄時會話繼承的人設
sessions {} 按 session;"*" 爲通配層級
enabled true 總開關;false 時不注入但仍保留已存文本
mode append append 追加段,replace 替換部署人設
prefix / suffix "" 人設上下包裹文本
blankOverrides true 空白是否終止該層查找
includeSubagents true 子 agent 會話是否也解析人設

運行時也可用 /persona mode 切換 mode。

典型用法

  1. 在 profile 裏寫好 global 與 sessions["*"],作爲默認中文或角色基調。
  2. 某次對話需要臨時角色:在會話中執行 /persona set …,下一步起模型按新身份回覆。
  3. 多會話並行、人設不同:分別爲各 session 用 /persona set for <id> … 或在面板 Live sessions 中查看來源並清理。
  4. 某會話不想喫全局人設:對該會話 /persona mute 或 clear,配合 blankOverrides 控制是否繼續繼承下層。

人設長度無上限;過長的人設會在每次請求中佔用上下文,需自行控制篇幅。

適用場景與注意

適合:同一 DSH 實例下多會話並行、人設要分開;對話中途換角色;希望通過 GUI 編輯長人設(角色設定表),而不只依賴單行 settings 表單。

侷限(README 已說明):

  • 人設不限制工具與策略,不能當權限機制用。
  • 面板依賴 ctx.webServer 的 HTTP 路由;純 TUI/headless 僅命令行。
  • 解析與覆蓋按 session id,不是會話標題。
  • 社區目錄頁與 GitHub 由維護者發佈;DSH 生態是「一切皆插件」,SkillHub 等目錄站點與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-persona-slot 把「全局一條 + 每會話一條 + 運行時可改」收進一個 persona 槽位和統一的 prompt 鉤子,與 preset 級的 dsh-persona 互補。需要安裝或源碼時,可訪問社區目錄頁與 GitHub 倉庫:

  • 目錄頁:https://www.skillhub.cn/plugins/Zylog82568/dsh-persona-slot
  • GitHub:https://github.com/Zylog82568/dsh-persona-slot
羽毛球分组比赛记分
小程序二维码

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

小夜