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。

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

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

Xiaoye