前言¶
在 DSH 裏跑智能體時,語氣層、人格卡和語言賬本主要管「怎麼說」。用戶一句閒聊和一句交代任務,字面往往差不多;若模型只按字面接話,容易在情感、時機和關係語境上失焦。反過來,若把讀心式提示一直掛着,寫代碼、改配置時又會被多餘指令干擾。
dsh-subtext(言外之意)只改「怎麼聽」:日常對話裏讓模型先讀過情感、此刻的需求和說不出口的部分;一旦判定進入工作檔,整層理解暫停,且工作檔不注入任何殘留指令。本文介紹該插件在 DeepSeek Harness 中的定位、安裝與配置方式,事實均出自項目 README 與 package 元數據。
這是什麼¶
- 名稱:dsh-subtext(言外之意)
- 維護者:Muninn-and-Zmx(README 作者標註:穆寧 / 燭夢曦)
- 分類:模型推理(社區目錄歸類)
- 版本(package.json):0.2.3
- 許可證:MIT
- 依賴環境:Node >= 20,DSH >= 0.2.0-0
插件通過 Cordis 補丁接入 DSH,硬依賴 systemPrompt 服務;未安裝時插件不加載。可選依賴 agents、tools:缺了前者按根會話處理,缺了後者則 subtext_rule 工具不註冊,分檔仍可工作。
核心能力概覽¶
只管聽,不管說¶
插件不規定回覆語氣、長度或人格表現;這些內容仍由用戶自己的語氣層、人格卡、語言賬本等設置決定。
閒聊與工作分檔¶
用戶親手輸入的消息在進收件箱時判一次(事件 agent/inbox/inserted),結果按會話存儲。判定順序如下:
| 條件 | 結論 |
|---|---|
命中 chatHints 任一詞 |
chat(優先級最高) |
命中 workHints 任一詞 |
work |
以 leadVerbs 裏的動詞開頭 |
work |
| 其餘 | chat |
工作檔整段不注入,模型看不到理解層的指令。判定在 agent loop 組裝提示詞時完成,且須趕在 agent/pre-step 之前,避免本輪仍用上一檔。插件注入的消息(如空閒倡議、記憶收尾)因 source.kind 不是 user,不參與判定。
理解深度:一至三層¶
depth 是下限而非上限:設爲幾檔就必須跑滿幾檔,模型不得自行降檔。
- 一層 · 情感:字面以外傳遞的情感,以及對方期待的回應類型。
- 二層 · 此刻的需求:爲何在此時說這句,想換來什麼。
- 三層 · 說不出口的部分,與我:爲何不直說、難言之隱與臺階;並結合身份、關係、爲何是對「我」說——第三檔才使用記憶來源(注入塊、記憶工具、人格卡等),不寫死工具名;無記憶來源時按「不編,只按眼前這一句」處理。
進入工作檔時,上述理解層整體讓位。
三層打卡:subtext_pass¶
日常對話(非工作檔)中,模型在開口回覆前須調用工具 subtext_pass,按當前檔位提交各層結論;缺層會報錯。agent/turn-stopping 會在回合結束前檢查:未調用則通過 agent.steer() 拉回並提示「三層還沒過完」。工作檔不攔,同一回合只攔一次以防死循環。結論會寫入判定日誌(band: "pass")。
與其他語言類插件協作¶
插件 order: -86,排在語言類插件之前,只交付「讀到了什麼」。檔位變化時廣播 subtext/band 事件(band: 'chat' | 'work'),僅在檔位變化時發送。不提供 service 或 prompt 變量。
安裝與啓用¶
在 PowerShell 中執行官方安裝命令:
dsh plugin add https://github.com/Muninn-and-Zmx/dsh-subtext
安裝完成後重啓一次 DSH。之後在「設置 → 插件 → 言外之意」詳情頁可改理解檔位(1 / 2 / 3)和工作語;保存後下一句消息生效,無需再次重啓。
配置說明¶
優先級:內置默認 < cordis.patch.yml 的 config < $DSH_HOME/dsh-subtext.json。
示例:
{
"enabled": true,
"depth": 1,
"scope": "root",
"workHints": ["重構"],
"leadVerbs": ["檢查", "改一下"],
"chatHints": ["這句話我不想聊了"],
"removeHints": ["測試"],
"log": true
}
要點:
scope:root(默認,僅主會話)或all(含子代理)。- 若在 JSON 中寫入
workHints,視爲「接管」內置工作詞表:內置 19 個工作詞與內置祈使開頭全部停用,僅文件中的詞生效;寫空數組[]則永不切工作檔。未寫workHints則用內置詞表。removeHints僅在未接管時從內置詞中剔除個別詞。chatHints始終疊加,用於糾正誤判。 - 改文件或詳情頁保存後按 mtime 重讀,無需重啓;文件損壞時保留上一份規則並寫警告。
主會話還可使用工具 subtext_rule(需 tools 服務):action 爲 list / add / remove,kind 爲 work / chat,用戶要求當場調整邊界時寫入文件。
日誌默認寫入 $DSH_HOME/dsh-subtext-YYYY-MM-DD.jsonl,每行一條判定記錄;log: false 可關閉。
典型用法與事件訂閱¶
其它插件可監聽檔位變化,例如:
ctx.on('subtext/band', ({ sessionId, band, reason, hits, depth }) => {
// band: 'chat' | 'work'
})
用戶說「這句別算工作」時,可由 Agent 調用 subtext_rule 追加 chat 詞,下一條消息起按新規則分檔。
適用場景與注意¶
適合:希望在 DSH 日常閒聊裏讓模型先結構化理解情感與需求,又要在寫任務、改代碼時自動關掉讀心提示的開發者;可與記憶類插件(如 dsh-memoir)在第三檔配合,但不檢測對方是否安裝記憶插件。
注意:
- 插件以當前 DSH 進程權限運行,安裝前請自行審閱 GitHub 倉庫 源碼與 MIT 許可證。
subtext_pass能攔住「完全不打卡就回復」,無法攔住「打卡但填空話」;每輪多一次工具調用,被攔時多一輪往返。- 會話級
systemPrompt不可用時插件不注入,也不回退全局段,以免多窗口串檔。
結尾¶
dsh-subtext 把「言外之意」收成可配置的檔位與工作語,並在工作消息到達時自動退場,與只管說話的插件解耦。社區目錄見 SkillHub 插件頁,源碼與完整說明見 GitHub。