dsh-assistant-optimization:折叠模型输出、增强提示词的 DSH web 插件

前言

用 DSH(DeepSeek Harness)的 web profile 起服务后,有几个问题几乎每天都会碰到:

  • 一些 OpenAI 兼容 API 没有独立的 reasoning_content 通道,思维链直接混进正文流,DSH 把整段当普通文本渲染,答案埋在一大段思考里;
  • 一个回合跑完,思考行、工具调用行、中间说明堆满屏幕,真正要看的往往只有最后的回复;
  • 手动点了 Stop 或者会话报错,想接着跑只能自己重新组织输入;
  • 模型输出 mermaid 图表时,界面上只有一段代码文本。

dsh-assistant-optimization 把这些问题打包处理。下面按功能、安装、配置的顺序介绍。

这是什么

dsh-assistant-optimization 是 qianshe 维护的 DSH web profile 插件,当前版本 1.8.0,MIT 许可证,共七个能力,即装即用。它不替换任何官方渲染:插件以 shadow 方式接管 DSH 组件后再把渲染委托回去,Markdown、工具卡片、图片、表格保持原样。

核心功能

Reasoning fold:折叠误渲染的思考内容

部分提供方把思维链直接写进普通文本流,形如:

The user wants to know about X, I should explain Y first...
</thinking>

Here is the answer to your question...

插件在可配置的分隔符处拆分内容,把思考部分折进原生的 “Think” 折叠块,只保留答案可见。分隔符默认为 ["</thinking>"],支持配置多个,在 Settings → General → Thinking Tag Markers 管理。

Mermaid 图表内联渲染

mermaid 代码块内联渲染为交互式 SVG。工具栏按钮提供缩放与重置,滚轮可缩放,鼠标或触摸拖拽可平移。

Tool-call grouping:工具调用行合并

连续的工具调用行折叠为一行 # bash · N tools 头部。调用之间的推理行不会打断分组,会被合并进去:折叠组把推理行一并收起,展开组则像成员一样缩进显示。

Prompt enhance:一键润色草稿

发送按钮左侧有一个 ✨ 按钮,点击后用输入框当前选中的模型把草稿重写为更清晰的指令。它只发一个普通聊天请求——不建会话、不入日志——然后原地替换草稿,Ctrl/Cmd+Z 可撤销。

运行中显示旋转弧线和「增强中」;成功显示绿色对勾;失败时图标闪红、原因放在 tooltip 里,草稿不会被清空。tooltip 会同时报告上次调用实际收到的上下文量——重写效果不理想时先查这一项。

Resume-from-breakpoint:从断点续发

会话异常停止——用户点 Stop 或会话出错——后,发送按钮变成 ▶ 播放键,悬停显示「断点续发」提示,样式与 DSH 原生按钮 tooltip 一致。点一下即通过宿主路由发送续发信号,代理从断点接着跑,使用输入框当前选中的模型。

几个细节:

  • 门控逻辑读取 session.chat.timeline 中最后一个闭合回合的 turn/end 原因,只有 aborted(用户停止)和 error(会话错误)触发播放键;正常完成和 max-tokens 不触发;
  • 在草稿里输入任何内容,或代理开始运行,按钮立即恢复为普通发送/停止键,不会卡在播放图标;
  • 续发标记进入记录时,插件把空白气泡和复制按钮替换为一条「已从中断处继续」提示行;
  • 实现上采用 CSS 覆盖层:通过 data-dsao-resume 属性隐藏官方按钮的 SVG,旁边放置播放 SVG,不打扰 React 的重渲染周期。

Turn folding:回合结束自动折叠过程

回合运行中一切保持可见,原生的「Deep diving…」状态与时钟就是运行指示。回合完成(最终答案落地)的那一刻,该回合的过程内容——思考行、工具调用、中间文本——折叠为一行「已完成 · 时长」头部;出错或被停止的回合则显示 已出错/已停止。运行中的插话随回合一起折叠,头部显示「· N 条插话」计数。

始终可见的是:你的提问、最终的总结回复及其操作行(复制等)。点击头部可展开完整过程,再点收起。展开/收起的选择只存在内存里,刷新页面后重新折叠。

两点实现说明:

  • 折叠方案完全由会话快照计算:用 chat.locations 分组回合,用回合的 turn/end 原因判断完成状态,用官方 turn-tail 节点的 closing 指针定位总结回复,用回合起止时间戳算时长(与原生时钟同一套数字);
  • dsh 0.1.2+ 自带回合折叠(Settings → Conversation display → Compact)。本插件会接管该设置:Turn Folding 开启时强制内置模式为 Normal,避免双重折叠;关闭则把栏目交还给内置 Compact。任意一侧切换都会使两边对齐。

开关在 Settings → General → Turn Folding,默认开启。

一个主机端工具,面向模糊、说不清的搜索:传入自然语言描述,返回匹配的文件、行范围和代码。它基于 fast-context 方法运行一个 agentic 搜索循环,由 Windsurf key 驱动。

key 门控是设计重点:只有在 Windsurf key 解析成功时,工具及其一行提示引导才会注册;没有 key 就什么都不注册,模型不会被告知一个它无法调用的工具。

key 按以下顺序解析,命中即停:

  1. WINDSURF_API_KEY 环境变量;
  2. Settings → General → Windsurf API Key 手动填写,存于 ~/.dsh/dsao-windsurf-key,权限 0600
  3. 自动读取已登录的 Windsurf/Devin 编辑器的 state.vscdb;设置 DSAO_FC_AUTO_KEY=0 可禁用自动读取。

非官方协议说明见 lib/fast-context/NOTICE.md

安装与启用

dsh plugin --profile web add github:qianshe/dsh-assistant-optimization
dsh web

打开 http://127.0.0.1:3080 ,插件自动激活。安装、更新、卸载之后都需要重启。

其余管理命令:

# 从本地源码安装
dsh plugin --profile web add .
# 更新
dsh plugin --profile web update dsh-assistant-optimization
# 卸载
dsh plugin --profile web remove dsh-assistant-optimization

配置

插件共三个配置项:

配置项 默认值 说明
Thinking Tag Markers ["</thinking>"] 分隔思考与正文的字符串,支持多个,在 Settings → General 编辑
Turn Folding 回合完成后把过程折叠为一行头部,在 Settings → General 编辑
Windsurf API Key context_search 的凭据,无 key 则工具不注册

适用场景与注意

适合日常通过 DSH web profile 聊天和跑智能体任务、希望界面干净一点的开发者。使用前注意:

  • 需要带 web profile 的 DSH;
  • 插件只在出现图表时通过 mermaid.js CDN 访问网络,其余时候不联网;
  • Edit diff counts 模块已在 v1.8.0 退役:dsh 0.1.2+ 已原生渲染 Write/Edit 行的 diff 统计,该模块仅为旧版本宿主保留,在当前版本上不注册任何内容;
  • context_search 依赖外部 Windsurf 凭据,自动读取编辑器数据库的行为可用 DSAO_FC_AUTO_KEY=0 禁用;
  • 插件以当前 dsh 进程的权限运行,安装前建议检查源码与许可证(MIT)。

结尾

dsh-assistant-optimization 的做法是在不替换官方渲染的前提下,补齐输出折叠、图表渲染和几处交互,让 DSH web 界面保持原生观感的同时更好用。如果你每天用 DSH web profile,值得一试。

  • 社区目录页(独立站点,与 DeepSeek、幻方无官方从属关系):https://www.skillhub.cn/plugins/qianshe/dsh-assistant-optimization
  • GitHub:https://github.com/qianshe/dsh-assistant-optimization
羽毛球分组比赛记分
小程序二维码

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

小夜