dsh-session-title:让 DSH 会话标题跟着实际工作走

前言

在 DeepSeek Harness(DSH)里开发插件或做多轮排错时,侧边栏里的会话名往往还停在第一句提示词上。工作已经从「新建一个插件」推进到提供方、调度器、测试和打包,标题却不变,找历史会话只能靠猜。DSH 默认用第一句提示词命名会话,对单轮问答够用,对真实的多轮工作流并不贴切。下面介绍社区插件 dsh-session-title(维护者 icrefin,分类:工作流):它按会话实际做过的任务命名,并在后续回合有实质进展时更新标题。

这是什么

dsh-session-title 是 DSH 的 Cordis 插件 bundle,当前版本 0.4.0(MIT 许可证)。它通过 ctx.sessionTitle.register() 成为会话唯一的标题提供方,替代随包自带的「第一句提示词」提供方(session-title-llm),并在 harness 已有的标题服务之上负责调度、摘要、一次辅助模型调用,以及持久的 session/title 事件。

插件在 dsh 0.2.1-rc.5(桌面端)上测试;运行环境要求 Node.js >= 22.17.0。

核心功能

从日志折叠「工作摘要」

人写的提示词表示被要求做什么;会话日志表示实际做了什么:改过的文件、执行的命令、待办、回合结束时的结论。插件把 turn/start、用户消息、工具调用、助手消息、turn/end 等事件折叠成 JSON 形式的工作摘要,再请模型据此生成一行标题。todo_write 与 exit_plan_mode 会按任务名特殊处理;其余工具调用优先用调用自身的标注(如 bash 的 description、路径、搜索模式)写成「工具: 目标」一行小结。

何时改写标题

三道闸门须同时满足,避免标题抖动或空跑模型:

  1. 有进展 — 完成一个回合(turn/end),或当前回合内已完成不少于 minStepsBetweenUpdates 个步骤。
  2. 有间隔 — 距上次尝试至少 minUpdateIntervalMs(默认 120000 ms)。
  3. 有新颖度 — 摘要指纹与当前标题所描述的工作不一致。

用户手动改过的标题会被标记为 user 来源并钉住,调度器不会覆盖。子会话(subagent fork)默认不参与,除非开启 includeChildSessions。新会话仍保留服务自带的 first-prompt 节奏,先快速给一个初名,再由调度器接管。

设置页与命名模型

Settings → Session titles 可配置命名模型与改写节奏,字段为 volatile:写入 Host 文档后 Loader 就地更新,无需重启插件即可在下次标题请求生效(bundle 补丁本身仍须在 Harness 重启 后生效,见安装一节)。

命名模型可选:

  • 跟随各会话自己的模型(默认)— 使用该会话已记录请求的路由。
  • 始终使用同一个模型 — 在宿主公布的目录中钉死 provider 与 model;也可输入宿主能解析的任意 model id。

模型列表通过只读路由 GET /api/dsh-session-title/catalog 读取 ctx.llm.listProviders();列表失败的提供方仍会展示并附原因,页面可回退为自由文本。

每次改写仅一次辅助请求,受 maxInputBytes、maxOutputTokens 约束,主对话不增加 token;标题服务在主请求之后异步执行。

README 中的前后对比示例(十四轮工作后):

Before, after fourteen turns of work:      After:
  Create a new plugin that                   Session-title provider with turn scheduler

安装与启用

安装步骤以仓库 README.zh-CN.md 为准,概要如下。

先在插件源码目录构建并打包:

pnpm check            # typecheck, build, tests
scripts/install.sh    # packs dist/dsh-session-title-0.4.0.tgz

将生成的 tarball 装进运行 harness 的 profile(示例路径为桌面 profile):

cd ~/.dsh/profiles/desktop
pnpm add file:/absolute/path/to/dsh-session-title-0.4.0.tgz

把 "dsh-session-title" 加入该 profile 的 package.json 里 dsh.profile.bundles(与其他插件 bundle 并列)。重启 Harness:bundle 在启动时组合,替换标题提供方的补丁在重启时生效;已有会话保留当前标题,直到下一回合完成并有新工作时才会按规则改写。

移除该 bundle 并重启后,会恢复随包自带的标题提供方。

社区目录页(与 DeepSeek / 幻方无官方从属关系):https://www.skillhub.cn/plugins/icrefin/dsh-session-title

主要配置项

初始默认值由 bundle 补丁 cordis.patch.yml 提供,可在 Settings → Session titles 中 live 修改。常用字段如下(完整表见 README):

字段 默认值 含义
targetWords 6 非 CJK 标题目标长度
targetCjkCharacters 12 CJK 标题目标长度
maxInputBytes 8192 摘要框架字节上限
maxOutputTokens 2048 单次标题调用输出上限
timeoutMs 30000 单次调用端到端超时
maxTurnsInDigest 10 摘要携带的最近回合数
minTurnsBetweenUpdates 1 改写前需完成的回合数
minStepsBetweenUpdates 2 回合中途改写所需步骤数
minUpdateIntervalMs 120000 两次尝试最小间隔
includeChildSessions false 是否包含子代理会话

可选 provider / model 须成对配置;省略则继承会话自己的路由。

典型用法

  1. 按上一节完成安装并重启 DSH,新开或继续一个多轮开发会话。
  2. 打开 Settings → Session titles,按需选择「跟随会话模型」或钉死 provider + model,并调整标题长度与「turns · steps · interval」等改写节奏。
  3. 正常对话与工具调用;当进展、间隔、新颖度三门均通过时,侧边栏标题会改写为更贴近当前工作的短名。若你手动改过标题,插件不会自动覆盖。

开发者在本地可用 pnpm test 验证摘要、调度与提供方逻辑;侧边栏标题变化的目视确认仍需装入运行中的 Harness。

适用场景与注意

适合:长期多轮插件开发、排错、规划执行类会话,希望侧边栏可读、便于回溯。

注意:

  • 插件以当前 DSH 进程权限运行;安装前请阅读源码与 MIT 许可证,确认 tarball 来源可信。
  • 一个会话只能有一个标题提供方;若 profile 同时启用上游实验 bundle dsh-experimental-session-titles-bundle,会出现两个提供方并在挂载时报错。
  • 标题更新是「闸门放行后的改写」,不是实时游标;繁忙会话可能在最长 minUpdateIntervalMs 内显示略旧的名称。
  • 摘要超过 maxInputBytes 时调用会失败而非截断,旧标题会保留到下次成功改写。
  • 是否保留已有标题依赖模型遵循提示词,并非硬性语义校验。

结尾

dsh-session-title 把 DSH 会话标题从「第一句提示词」换成「日志里真实做过的事」,并用调度与摘要控制成本。需要详情、贡献方式与限制说明时,见 GitHub 仓库:https://github.com/icrefin/dsh-session-title ;安装与版本信息也可在社区目录 https://www.skillhub.cn/plugins/icrefin/dsh-session-title 查看。

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

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

小夜