前言¶
DeepSeek Harness(DSH)的设计理念是「一切皆插件」。在开发或使用 DSH 进行多轮对话时,会话标题往往杂乱无章,缺乏统一的上下文标识。
尝试使用外部脚本定期重命名会话是行不通的。DSH 的会话日志在同一时刻只有一个写入者(跨进程内核锁),持有写句柄的正是当前运行对话的进程。外部脚本会遭遇 SessionAlreadyOwnedError: 会话正被运行中的 Harness 独占。
因此,只有会话运行进程内的 ctx.sessionTitle 通道能够安全地修改标题。本插件正是基于此原理,注册一个 provider 而非脚本,实现在对话过程中动态重命名。
是什么¶
cn-scuo-oo/dsh-session-auto-title 是一个 DSH 插件。它在每轮对话结束后通过一次辅助模型调用,将会话标题重写为固定格式 MMDD|类型|主题。
该插件挂载后即可使用,全部字段均有默认值。若需覆盖默认值,可在 profile 的 loader 配置中指定。
行为与约定¶
插件强制执行统一的命名规范,以确保会话标题的可读性和一致性。
1. 格式
标题格式为 MMDD|类型|主题,分隔符为全角竖线 |(U+FF5C)。
2. 字段说明
* MMDD:上海时区日期,取自该会话首条人类消息的时间,不由模型臆造。
* 类型:必须从以下列表中选恰好一个:功能|设计|修复|优化|发布|探索|文档|研究。
* 主题:简体中文,长度上限为 20 个字符。不得包含工作区、项目、目录或文件名,且不得重复类型词。
3. 安全与校验
* 注入防护:源消息以 JSON 数组框架化后送入,防止用户正文破坏分隔符或伪造字段。
* 输出校验:模型输出先归一化再按约定重建。若输出不合规,插件会抛错并记录 warn,绝不写入半成品,标题保持原标题。
* 长度护栏:整串按 78 字节归一化,保证前缀永远不会被截断。
安装与启用¶
安装过程需要本地文件依赖和配置修改。
- 添加本地依赖
将插件目录放入任意位置,作为 profile 的本地依赖。需使用与 profile 相同的包管理器(pnpm 或 npm):
cd ~/.dsh/profiles/<profile>
pnpm add file:/absolute/path/to/dsh-session-auto-title
> 注意:`file:` 依赖会被**拷贝**进 `node_modules`(非软链)。修改源代码后需重新运行上述安装命令。
- 配置 Bundle
在同一个 profile 的package.json中,将插件加入 bundles 列表:
{ "dsh": { "profile": { "bundles": ["...", "dsh-session-auto-title"] } } }
- 重启
重启 DSH 客户端。插件自带的cordis.patch.yml会自动禁用内置的session-title-llmprovider 并插入本 provider(ctx.sessionTitle只接受一个 provider 注册)。
配置¶
插件提供若干可配置项,默认值已满足大多数场景。需覆盖时在 profile 的 loader 配置中给出:
| 字段 | 默认 | 作用 |
|---|---|---|
provider / model |
未设 | 显式指定标题模型路由;两字段必须同时给出,否则沿用该轮已记录的请求路由 |
maxSourceMessages |
8 |
标题模型能看到的末尾人类消息条数 |
maxInputBytes |
8192 |
框架化输入的字节上限,超限即放弃本次命名 |
maxOutputTokens |
96 |
辅助调用输出上限 |
timeoutMs |
60000 |
单次辅助调用超时 |
maxTopicCharacters |
20 |
主题长度上限(按码点计) |
unpinSessions |
[] |
需要交还自动命名的会话 id,释放一次后自动移出 |
afterEveryTurn |
true |
是否每轮结束后重命名 |
设计要点与限制¶
1. 节奏驱动
插件采用 afterEveryTurn 模式,在 turn/end 时调用 sessionTitle.refresh()。这是为了解决服务自带节奏在长生命周期会话中“静默停止更新”的问题:服务自身的 all-prompts 节奏依赖 request/header 落盘,而一个请求序列只记一条 header,新轮次无法触发更新。插件从 turn 边界驱动刷新。
2. 手动改名支持
用户手动改名的标题其 source.kind === "user"。插件检测到此状态会直接跳过,保持“钉住”状态。若需释放一次钉子,可将会话 id 填入 unpinSessions,之后恢复常规自动命名。
3. 已知限制
* 额外调用:每个对话轮次多一次模型调用,增加少量 token 成本与几十毫秒到数秒的延迟。
* 标题漂移:标题会随对话推进而漂移,每轮都是重新生成,不是只在首轮定稿。
* 兜底机制:会话首次命名前若模型调用失败,标题保持平台兜底值(通常是首条消息截断),不会报错。
依赖¶
作为 DSH 插件运行,需要宿主提供以下包:
@deepseek-ai/schemastery、@deepseek-ai/dsh-llm、@deepseek-ai/dsh-session-title、@deepseek-ai/dsh-util-values。
结语¶
dsh-session-auto-title 通过内部 provider 的方式,解决了 DSH 会话重命名的权限与同步问题,提供了严格的结构化标题。对于追求会话管理规范的开发者,这是一个可以直接挂载使用的工具。