前言¶
在 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。