dsh-auto-title:等首轮回复后再给 DSH 会话起名

前言

DeepSeek Harness(DSH)的会话列表靠标题区分任务。内置的 session-title-llm 在首条人类消息到达时就定标题,做法接近把提问截断塞进任务栏——多条会话往往长得一样,扫列表时很难分辨「这条在修 pnpm 还是写文档」。

dsh-auto-title 是社区维护者 sumingwang233 发布的客户端类 DSH 插件(当前 GitHub 星标为 0)。它接管同一条「会话标题」槽位:默认在首轮对话结束(首条助手带文本回复或 turn 结束)后,用辅助模型根据「首条提问 + 首条回复」生成「项目|具体任务」式标题;另在会话行菜单提供 AI 重命名,可对已有会话手动再命名一次。下面介绍定位、安装、配置与使用边界。插件目录页见 SkillHub,源码与说明见 GitHub 仓库。SkillHub 为社区插件目录,与 DeepSeek / 幻方无官方从属关系。

这是什么

一句话:给 DSH 会话自动起名——不再依赖截断首条 prompt,而是在看到首轮助手回复后,用一次不占用正文上下文的辅助模型调用生成可区分的标题。

维护者:sumingwang233。许可证:MIT(见仓库 LICENSE)。包版本在资料中为 0.1.0,运行环境要求 Node >= 20。

和内置行为的差异

内置标题在首条人类消息上定型;本插件由 automatic 控制节奏,默认 first-prompt 只在首轮命名。命名前会等待助手回复(最长 waitForReplyMs),超时或失败则退化为「仅根据人类请求」命名,仍走模型而不是原始截断。

示意(资料中的对比,非真实运行记录):

改前(内置,截断首条提问)  →  改后(本插件)
帮我看看这个 pnpm 报错…      →  pnpm|lockfile 供应链校验报错排查
再写一版                      →  写作|把笔记改成一页纸说明
那个 bug 修了吗               →  debug|会话标题事件没触发

核心功能

自动命名(首轮)

  1. 人类提交消息后(默认仅第一条),标题服务调用本插件。
  2. 插件等待本轮带文本的 assistant/message 或 turn/end(失败/超时则以空字符串继续),最多等 waitForReplyMs。
  3. 将「人类请求 + 助手回复」交给一次辅助模型调用;结果规范化(去引号、折叠换行、去句末标点、按 maxTitleLength 截断)。
  4. 以 { title, messageSeqs, model } 交回标题服务持久化并推送到界面。

任一步失败会抛出带 code 的错误,不会把会话改成空标题。

手动 AI 重命名

自动命名只管首轮。对任意已有会话:在会话行右侧「…」菜单中,原生「重命名」之下多一行 AI 重命名。

  1. 读取该会话首条人类提问与最近一次带文本的助手回复,调用辅助模型,弹窗预填建议标题;
  2. 可编辑后回车或点「应用」;Esc 或「取消」放弃;
  3. 提交走原生 sessionTitle.rename(source.kind === 'user'),之后自动命名不会覆盖该标题。

实现上客户端 bundle 注册菜单与 shell.overlay 对话框,宿主提供 POST /dsh-auto-title/title 与 POST /dsh-auto-title/apply。会话未打开时会先 resume 再改名。常见失败:422 empty-session、409 no-route、502 model-empty,对话框会显示本地化文案。

与内置 provider 的关系

ctx.sessionTitle 只接受一个 provider。本包 cordis.patch.yml 会先 disabled 内置 session-title-llm,再插入 auto-title。停用本插件后内置行为恢复;若 profile 里另有会话标题插件,本插件会安静不注册(日志 warn),不导致启动失败。

安装与启用

官方安装命令如下(不要用 github:owner/repo 形式自行拼接):

dsh plugin add https://github.com/sumingwang233/dsh-auto-title

或在桌面端 设置 → 插件市场 → 添加插件,填入同一 URL。装完后重启 DSH 桌面端(或重连该 profile)使 bundle 生效。本地开发可从工作副本安装:

dsh plugin add <本目录绝对路径>

安装时无需改基础 bundle;patch 已处理与内置行的争用。

在桌面端使用

重启后插件出现在两处。

设置侧栏 →「dsh-auto-title」(一级条目,与「内置插件」等并列,不在「插件」页)。可改 enabled、provider、model、language、maxTitleLength、waitForReplyMs、timeoutMs 等,保存后下一次命名即生效。页下方有最近事件日志(自动命名、手动重命名、失败原因),可刷新、清空、复制;日志同时写入 <插件目录>/log.jsonl,也可用 GET /dsh-auto-title/log?limit=100。

会话列表每行「…」→「AI 重命名」:弹窗展示候选标题,确认后列表更新;失败原因可在设置页日志中对照排查(例如尚未配置会话 provider/model、推理模型占满 maxOutputTokens 等)。

配置

运行时配置(推荐):<插件目录>/settings.json。桌面 profile 下典型路径为 ~/.dsh/profiles/desktop/node_modules/dsh-auto-title/settings.json;可用环境变量 DSH_AUTO_TITLE_SETTINGS 指向别处。优先级最高,保存后立即生效。

加载期配置(可选):在 profile 的 cordis.patch.yml 中覆盖,例如:

- id: auto-title
  config:
    language: zh
    maxTitleLength: 20
    waitForReplyMs: 90000

主要字段(默认值与说明以 README 为准):

字段 默认 说明
enabled true false 时只加载不注册
automatic 'first-prompt' all-prompts 为每条新消息都重命名
provider / model '' 留空则用会话自己的路由;填则须两个一起填
language 'auto' auto / zh / en
maxTitleLength 24 标题最大字符数
maxInputChars 6000 拼进提示词的总字符上限
maxOutputTokens 512 辅助调用输出上限(上限 8192)
waitForReplyMs 120000 等首条助手回复
timeoutMs 30000 辅助调用超时
stopWords [] 标题中要去掉的词

类型配错会在加载时抛 TypeError,对应行以错误状态出现。

典型验证步骤

资料中的真机验证(需重启后):

  1. 设置侧栏出现「dsh-auto-title」,页面可打开,provider/model 可保存;
  2. 会话「…」→「AI 重命名」,弹窗有候选标题,应用后列表标题变化;
  3. 若弹窗报错,设置页日志中有失败原因与细节。

开发侧可用仓库内 npm test 跑单元测试(README 称 49 个用例);介绍安装流程时不使用 git clone,读者自行克隆仓库后再测即可。

适用场景与注意

适合谁:长期开多条 DSH 会话、希望任务栏标题能反映「问什么 + 做成什么」的开发者;需要中文或英文固定标题语言时,可设 language。

成本与边界:

  • 默认只在首轮自动命名一次;对话大改后不会自动改名,可用手动 AI 重命名,或设 automatic: 'all-prompts'(每条新消息多一次小请求)。
  • 每条命中消息多一次辅助调用(约几百 token 输入、输出受 maxOutputTokens 限制);可 enabled: false 或指定便宜模型。
  • 助手回复晚于 waitForReplyMs 时,会退化为「只看请求」命名。
  • 插件以当前 DSH 进程权限运行;安装前应阅读 源码 与 MIT 许可证,确认符合你的安全与合规要求。

卸载

桌面端 设置 → 插件市场 → dsh-auto-title → 卸载,或用 plugin_manager action: "remove_bundle"、target: "dsh-auto-title"。移除后内置 session-title-llm 重新生效。

结尾

dsh-auto-title 用「首轮结束后再命名 + 可选 AI 重命名」替换截断式标题,并自带设置页与事件日志,便于调 provider、语言和超时。需要细节时以仓库 README 为准。

  • 目录页:https://www.skillhub.cn/plugins/sumingwang233/dsh-auto-title
  • GitHub:https://github.com/sumingwang233/dsh-auto-title
羽毛球分组比赛记分
小程序二维码

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

Xiaoye