前言¶
用 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