dsh-subtext:日常對話裏聽字面底下那一層

前言

在 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。

羽毛球分组比赛记分
小程序二维码

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

小夜