前言¶
用 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,默认开启。
context_search:语义搜索定位代码¶
一个主机端工具,面向模糊、说不清的搜索:传入自然语言描述,返回匹配的文件、行范围和代码。它基于 fast-context 方法运行一个 agentic 搜索循环,由 Windsurf key 驱动。
key 门控是设计重点:只有在 Windsurf key 解析成功时,工具及其一行提示引导才会注册;没有 key 就什么都不注册,模型不会被告知一个它无法调用的工具。
key 按以下顺序解析,命中即停:
WINDSURF_API_KEY环境变量;- Settings → General → Windsurf API Key 手动填写,存于
~/.dsh/dsao-windsurf-key,权限0600; - 自动读取已登录的 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