dsh-session-title-idle-refresh:全量 human 消息生成标题,空闲 30 分钟后补刷

前言

在 DSH(DeepSeek Harness)里跑长对话时,会话列表里的标题往往只反映第一句用户输入。官方默认的 session-title 策略是 automatic: "first-prompt":标题只在会话开始时生成一次,后面话题变了,侧边栏名字仍停在旧语义上。若希望标题能概括整段对话,又不在每条消息后都调用 LLM,需要在「生成时机」和「成本」之间折中。下面介绍社区插件 dsh-session-title-idle-refresh:它在注册 session-title provider 时仍保持「首次按 first-prompt 触发一次生成」的入口行为,但生成输入会读取全部 human 消息(沿用官方 all-prompts 策略里的稳定性规则,并在字节预算内截断);此外用定时扫描在会话空闲超过阈值后,对仍落后于最新 human 消息的标题执行一次 refresh()。

这是什么

dsh-session-title-idle-refresh 是 DSH 的 session-title 提供方插件,维护者为 2001Y(package.json 作者为 Yoshiki Tamura)。它替换内置的 session-title-llm 行(同一时刻只能注册一个 title provider,与官方 session-titles bundle 替换 all-prompts provider 的模式相同),解决两类问题:标题生成依据从「仅首条 prompt」扩展到「全部 human 消息」;以及长聊静止一段时间后,标题自动跟上最新 human 内容,而无需用户手动改名。

核心功能

标题生成策略

插件向 Cordis 注册 session-title provider,配置为 automatic: "first-prompt"——与内置 provider 一样,初始标题只生成一次。与内置 first-prompt 不同的是,生成时读取的是所有 human 消息,并套用官方 all-prompts 策略中的「保持标题足够贴切」类稳定性规则;输入会在 maxInputBytes 预算内截断。标题走各会话自己的 logged route,不固定单独的 provider/model(与 stock provider 一致)。

空闲补刷(idle retitling)

插件按 scanMs 间隔扫描仍在运行的会话。当同时满足下列条件时,对该会话调用一次 ctx.sessionTitle.refresh():

  1. 当前标题尚未覆盖最新的 human 消息;
  2. 最后一次事件与最后一条 human 消息的时间都早于 idleMs(默认 30 分钟);
  3. human 消息数至少为 minMessages(默认 2);
  4. 不是 subagent 子会话;
  5. 标题未被用户 pin(手动 rename)。

对同一「未覆盖尾部」,尝试记录在内存中;在 max(idleMs, 30min) 之内不会对同一尾部再次 refresh。

安装与启用

面向 web profile 的安装方式如下(资料原文):

dsh plugin --profile web add dsh-session-title-idle-refresh
# then restart dsh web

安装后需重启 dsh web。包内附带 cordis.patch.yml,会插入 provider 行并禁用内置 session-title-llm 行。

运行环境(package.json):Node >=22.19,DSH >=0.2.1-rc.2 <0.3.0;README 写明面向 DeepSeek Harness 0.2.1。许可证 MIT,当前包版本 0.1.0。

配置

默认项(README「Config defaults」):

配置项 默认值 含义(据 README)
idleMs 1800000 空闲阈值(30 分钟)
scanMs 60000 扫描间隔(60 秒)
minMessages 2 触发 idle refresh 所需最少 human 消息数
maxPerScan 3 单次扫描最多处理的 refresh 数量
targetWords 5 标题长度目标(词)
targetCjkCharacters 10 标题长度目标(CJK 字符)
maxInputBytes 16384 生成输入字节上限
maxOutputTokens 4096 生成输出 token 上限
timeoutMs 60000 超时

若需调整 idle 扫描行为,可在 profile 的 cordis.patch.yml 中重写 provider 行,例如:

- id: session-title-idle-refresh
  config:
    idleMs: 1800000
    scanMs: 60000

典型用法

  1. 在 web profile 执行上述 dsh plugin --profile web add 命令,重启 dsh web。
  2. 正常开新会话对话:首次标题仍按 first-prompt 时机生成,但内容基于截至当时的全部 human 消息。
  3. 继续聊或暂停:若标题落后于最新 human 消息,且会话已空闲超过 idleMs、消息数达标,定时器会在后续扫描中触发一次 refresh,使列表标题跟上对话。

无需额外 CLI;行为由 Cordis patch 与插件内定时逻辑完成。

适用场景与注意

适合:长期在 DSH Web 里维护多条会话、希望侧边栏标题反映整段对话而非仅首句;能接受「静止约 30 分钟后再补刷」而非每条消息后即时改标题的场景。

注意:

  • 插件以当前 DSH 进程权限运行;安装前建议阅读 GitHub 仓库 源码与 MIT 许可证。
  • 会替换内置 session-title LLM provider,与官方 bundle 互斥,勿与另一 title provider 重复注册。
  • 上游曾在 deepseek-ai/deepseek-harness 内原型过 idle 模式(仓库内 upstream-idle-mode.patch),目前以插件形式维护;上游仓库不接受外部 PR 的相关说明见 README「Upstream」节。

DSH 生态强调「一切皆插件」;社区目录站点与 DeepSeek / 幻方无官方从属关系,本文仅作插件能力说明。

结尾

dsh-session-title-idle-refresh 把 session 标题的数据面扩到全部 human 消息,并在空闲阈值后做一次 refresh,在「标题可读性」和「调用频率」之间做了明确取舍。目录页:SkillHub - dsh-session-title-idle-refresh;源码与完整配置说明:GitHub - 2001Y/dsh-session-title-idle-refresh。

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

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

Xiaoye