前言¶
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|会话标题事件没触发
核心功能¶
自动命名(首轮)¶
- 人类提交消息后(默认仅第一条),标题服务调用本插件。
- 插件等待本轮带文本的
assistant/message或turn/end(失败/超时则以空字符串继续),最多等waitForReplyMs。 - 将「人类请求 + 助手回复」交给一次辅助模型调用;结果规范化(去引号、折叠换行、去句末标点、按
maxTitleLength截断)。 - 以
{ title, messageSeqs, model }交回标题服务持久化并推送到界面。
任一步失败会抛出带 code 的错误,不会把会话改成空标题。
手动 AI 重命名¶
自动命名只管首轮。对任意已有会话:在会话行右侧「…」菜单中,原生「重命名」之下多一行 AI 重命名。
- 读取该会话首条人类提问与最近一次带文本的助手回复,调用辅助模型,弹窗预填建议标题;
- 可编辑后回车或点「应用」;Esc 或「取消」放弃;
- 提交走原生
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,对应行以错误状态出现。
典型验证步骤¶
资料中的真机验证(需重启后):
- 设置侧栏出现「dsh-auto-title」,页面可打开,
provider/model可保存; - 会话「…」→「AI 重命名」,弹窗有候选标题,应用后列表标题变化;
- 若弹窗报错,设置页日志中有失败原因与细节。
开发侧可用仓库内 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