dsh-session-auto-title:统一会话标题命名规范

前言

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 字节归一化,保证前缀永远不会被截断。

安装与启用

安装过程需要本地文件依赖和配置修改。

  1. 添加本地依赖
    将插件目录放入任意位置,作为 profile 的本地依赖。需使用与 profile 相同的包管理器(pnpm 或 npm):
    cd ~/.dsh/profiles/<profile>
    pnpm add file:/absolute/path/to/dsh-session-auto-title
> 注意:`file:` 依赖会被**拷贝**进 `node_modules`(非软链)。修改源代码后需重新运行上述安装命令。
  1. 配置 Bundle
    在同一个 profile 的 package.json 中,将插件加入 bundles 列表:
    { "dsh": { "profile": { "bundles": ["...", "dsh-session-auto-title"] } } }
  1. 重启
    重启 DSH 客户端。插件自带的 cordis.patch.yml 会自动禁用内置的 session-title-llm provider 并插入本 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 会话重命名的权限与同步问题,提供了严格的结构化标题。对于追求会话管理规范的开发者,这是一个可以直接挂载使用的工具。

插件目录
GitHub 仓库

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

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

小夜