dsh-topic-for-each-turn:为每个轮次生成主题与结论的 DSH 插件

前言

在使用 DeepSeek Harness(DSH)进行多轮对话或会话分支时,往往缺少一个清晰的摘要与索引:轮次标题、结论、事项标签以及与历史轮次的关联关系散落在长对话流中,难以快速回顾与跳转。现有做法需要人工逐一梳理或依赖外部工具,效率有限。DSH 理念是「一切皆插件」,社区目录提供插件托管,与 DeepSeek / 幻方无官方从属关系。

是什么

dsh-topic-for-each-turn 是一个 Host + Client 插件,由 Pandasywithfantasy 维护,分类为客户端。它为每个已结束的真实用户轮次自动或手动提炼 8–15 字主题标题、一句话结论详情、稳定事项标签(最多 2 项)及可选历史轮次关联(接着 / 回到 / 另探),并在原生右侧轮次刻度浮层与官方右侧栏面板中展示与管理。模型直接复用当前 DSH 已配置的服务商与凭证,插件不保存密钥。

核心功能

官方插槽集成

会话顶部工具栏提供「轮次主题」入口按钮,点击打开官方右侧栏标签页(sidebar.right.pane.tab)。

自动增量与手动整理

  • 新的 turn/end 事件自动入队生成当前轮次主题;打开历史会话或读取状态不会自动调用模型。
  • 面板顶部提供唯一主操作「整理主题」(运行中切换为「停止整理」),点击后按时间顺序补齐当前会话缺失或已失效的已结束轮次,跳过已有有效主题与人工修改。
  • 全局最多 3 会话并行,同一会话串行且自动去重,单轮默认 90 秒超时。失败或停止时保留原有有效缓存。

人工编辑与保护

  • 每轮右侧「⋯」菜单内提供「编辑」入口,支持修改主题标题(≤40 字符,建议 8–15 字)、结论详情(≤120 字符,建议 60 字内),并在折叠高级选项中修改事项标签(最多 2 项,单项 ≤16 字符)与历史关联。
  • 人工保存后的轮次标记为「已修改」,后续点击「整理主题」时自动跳过,不会覆盖人工修改内容。

输入截取与独立缓存

  • 仅提取每轮首条真实用户文本、末条含文本的 assistant 回复及结束原因;首尾保留截断默认上限 12000 字符,不读取附件或工具输出。
  • 缓存独立保存在 $DSH_HOME/storages/turn-topic-outline/<sessionId>.json,采用临时文件原子替换写入,不向 Session 事件日志写入任何数据。

定位跳转

点击列表标题或关联标签时,先调用官方 session.loadThrough(seq),再从 uiConversation chat target 获取 anchorKey 并滚动至对应轮次。

事项标签与轮次关联

  • 单次调用与有限历史上下文:每轮生成仅调用一次模型。启用 continuity: true 时,输入附带有限历史上下文(最近 6 轮有效摘要、用户显式提及的「第 N 轮」、最多 12 个已有事项的代表轮次,候选历史总计不超过 12 轮)。不发送全会话原文,不依赖向量库或跨会话检索。
  • 宿主校验与白名单:事项 ID 由宿主生成与复用;关联目标必须属于本次候选、早于当前轮次且类型属于 continue / return / branch。非法的辅助字段会被安全丢弃,不影响合法标题与结论的保存。
  • 关联依据追踪:记录被引用轮次的指纹与修订时间戳;若被引用轮次后续发生变化,界面隐藏失效关联并提示「关联依据已变化」,不会静默指向错误目标或触发后台级联重算。

增量整理、分支继承与全局并行

  • 分支继承:依据官方 session.parentSession、isSeeded、inheritedEventCount,只复制继承前缀内已结束且内容指纹一致的轮次缓存。分支点之后的原会话内容、分支生成的中断闭合事件、子代理会话均不继承。保留有效标签、人工修改和可验证的历史关联;不覆盖分支已有条目,不随父会话后续编辑自动变化。创建分支时同步,打开已有分支/整理前也会补齐,整个复制过程不调用模型。
  • 整理主题默认增量:仅处理缺失或内容指纹已失效的轮次,跳过有效旧主题(包括尚无事项标签的旧缓存)及人工修改,连续点击不重复计费。不自动重新提炼全部历史轮次。
  • 最多 3 个会话并行:自动生成、手动整理、全局整理共享同一个并发上限;单会话仍按轮次顺序执行并去重。缓存写入按会话加锁;模型请求不持有文件锁。
  • 设置 → 轮次主题 → 全局整理:勾选费用/发送范围确认后,整理所有未归档普通会话与分支(包含持久化但未打开的会话,排除子代理),支持进度、停止和会话级失败列表。归档列表不可用时直接停止,不擅自扩大范围;处理前和每轮调用前再次检查归档状态。
  • 停止与恢复:保留已保存结果,取消时丢弃尚未完成请求的返回;全局停止不取消进入批次前已存在的手动任务。再次点击可补齐剩余项;全局任务队列与进度只存内存,重启后不会自动付费恢复。
  • 模型和 Key 设置在批次排队或运行时禁止修改;Key 路线同步串行且只写变化项,模型请求可并发,不会把同步锁占用至请求结束。

设置界面与模型配置

  • 设置页按官方设置页的度量重做:20px 页面标题、分隔式卡片、36px 控件、标签在上/说明在下的字段排列、操作按钮底部右对齐,主操作只用一枚主色按钮。
  • 按钮复用官方 @deepseek-ai/dsh-client-ui-primitives 的 Button(注入该客户端模块),悬停、聚焦环、禁用态与 DSH 自身设置页一致;该模块缺失时回退到内置按钮样式,功能不受影响。
  • 模型卡片顶部用徽标显示当前生效的 服务商 · 模型 或「未配置」;未配置、只读、模型不在目录中、保存失败分别有对应提示,字段通过 aria-describedby 关联说明,状态区使用 aria-live。
  • 全局整理并入同一套卡片:费用确认、进度(含已完成/跳过/总会话数)、停止与会话级错误列表,不再使用行内样式。
  • 颜色、圆角、字号全部走 --dsw-* 主题令牌并带回退值,跟随 DSH 明暗主题。
  • 配置入口在 DSH 官方「设置 → 轮次主题」,通过官方 settings.section 扩展注册。功能面板不出现模型表单。服务商与模型列表读取官方 llm-pi-ai 条目,用的是 DSH 现有凭证。安装后打开设置页,选择服务商与模型并保存即可开始生成,不需要在本插件里再填 API Key。设置持久化见实验性版本 12 起为插件自持文件,下一次主题调用生效,不修改聊天默认模型。

原生刻度浮层适配

  • 适配 0.2.0-rc.2 中英文轮次导航(轮次导航 / Turn navigation),通过按钮完整无障碍标签解析真实轮次号,并以 aria-describedby 匹配唯一 tooltip,不依赖虚拟列表下标或混淆类名。
  • 向浮层追加插件自有的非交互文本节点展示事项、标题、详情与关联;缺失/生成中/失败项保留原生预览并附状态说明。
  • 可在面板右上角「设置」中随时关闭「原生刻度浮层显示主题」(状态保存在浏览器 localStorage),关闭或卸载插件后立即恢复原生浮层。

加载性能

  • 打开面板的耗时几乎全部来自读取整个会话事件日志。一次读取:state 先取一份会话快照,分支继承检查与轮次提取共用它;start(自动生成、整理)同样只读一次。
  • 令牌缓存:以「活动会话 seq + 主题缓存文件大小/mtime」组成令牌,令牌不变时轮次提取结果直接复用。因此重新打开页签、编辑后刷新、悬浮刻度预览都不再读日志。
  • 轮询变便宜:客户端带上上次的 revision,命中时后台只回 unchanged;整理运行中只回传 job 进度(jobOnly),不重发全部条目。
  • 逐轮校验改令牌:整理时每轮生成后不再整读日志核对原文,令牌未变即视为未变;令牌变化才重读并丢弃过期结果。
  • 页签保留:注册 keepMounted,再次打开先显示上次内容,随后后台刷新。
  • 限制:令牌依赖活动会话句柄,未打开的持久化会话仍需读取一次;首次打开一个很长的会话仍会有一次读取开销。

安装与启用

从 GitHub 安装(推荐,无需本地构建:lib/client.js 已随仓库提供):

dsh plugin --profile desktop add git+https://github.com/Pandasywithfantasy/dsh-topic-for-each-turn.git

也可从已克隆的本地目录或 npm pack 生成的 .tgz 安装:

dsh plugin --profile desktop add /path/to/dsh-topic-for-each-turn
dsh plugin --profile desktop add ./dsh-topic-for-each-turn-<version>.tgz

安装后完整退出并重新打开 DSH(仅刷新网页不会重载 Host 端 RPC 服务),再打开「设置 → 轮次主题」选择模型。

配置与隐私说明

启用插件后,新的用户轮次及手动点击「整理主题」时,会将截取后的本轮问答文本与少量历史摘要发送至你在设置页选择的模型服务。请确认该模型服务符合你的数据隐私要求。

默认配置不预设任何服务商或模型(provider 与 model 为空)。如果你想固定某个模型而不在界面里选择,可以在 profile 补丁中覆盖:

- id: topic-for-each-turn
  config:
    provider: <your-provider-id>
    model: <your-model-id>
    reasoningEffort: low
    maxTokens: 1024
    continuity: true
    maxInputChars: 12000
    timeoutMs: 90000

包内 bundle 补丁负责唯一一次 insert 注册;profile 只按 id 覆盖配置,不要再复制包内的 insert 块。否则插件管理器在升级任何插件时可能报 user-patch: duplicate loader entry id "topic-for-each-turn" (2 rows) 并回滚。

  • provider / model:留空则需在设置页选择;填写时必须是当前 DSH 已配置的模型路由。
  • continuity:默认 true;设为 false 时仅根据单轮内容生成标题与详情,不发送历史摘要候选。
  • maxTokens:默认 1024,用于容纳 JSON 结构的标题、详情、事项与关联字段。

插件不收集、不上传任何遥测;主题缓存只写本地 $DSH_HOME/storages/turn-topic-outline,不修改会话事件日志,不保存任何密钥。

适用场景与注意

  • 适合需要为每轮对话提炼主题、结论与事项标签,并希望统一管理的历史会话回顾与跳转场景。
  • 插件以当前 DSH 进程权限运行,安装前建议检查源码与许可证。

小结

dsh-topic-for-each-turn 为每个轮次提供主题标题、结论详情、事项标签与历史关联,并在原生浮层与右侧面板中展示与管理,同时保持增量整理、分支继承与全局并行能力。它直接复用 DSH 已配置的服务商与凭证,不保存密钥,适合需要在会话流中快速定位与回顾的智能体开发者。

  • 目录页:https://www.skillhub.cn/plugins/Pandasywithfantasy/dsh-topic-for-each-turn
  • GitHub:https://github.com/Pandasywithfantasy/dsh-topic-for-each-turn
羽毛球分组比赛记分
小程序二维码

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

小夜