前言¶
在 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、路径、搜索模式)写成「工具: 目标」一行小结。
何时改写标题¶
三道闸门须同时满足,避免标题抖动或空跑模型:
- 有进展 — 完成一个回合(
turn/end),或当前回合内已完成不少于minStepsBetweenUpdates个步骤。 - 有间隔 — 距上次尝试至少
minUpdateIntervalMs(默认 120000 ms)。 - 有新颖度 — 摘要指纹与当前标题所描述的工作不一致。
用户手动改过的标题会被标记为 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 须成对配置;省略则继承会话自己的路由。
典型用法¶
- 按上一节完成安装并重启 DSH,新开或继续一个多轮开发会话。
- 打开 Settings → Session titles,按需选择「跟随会话模型」或钉死 provider + model,并调整标题长度与「turns · steps · interval」等改写节奏。
- 正常对话与工具调用;当进展、间隔、新颖度三门均通过时,侧边栏标题会改写为更贴近当前工作的短名。若你手动改过标题,插件不会自动覆盖。
开发者在本地可用 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 查看。