前言¶
DeepSeek Harness (DSH) 的核心架構是插件化。在使用 Web 客戶端進行調試、演示或記錄會話時,開發者往往需要將對話記錄保存爲本地文件。官方的導出功能通常依賴特定的路由或後端處理,不夠輕量。本插件通過純前端注入的方式,在 dsh Web 會話的「更多」菜單中新增了「導出 Markdown」與「導出 PDF」選項,讓保存會話記錄的操作更加直觀和快捷。
插件介紹¶
- 插件名稱:
dsh-export-plugin - 維護者:
guyusky - 功能定位:客戶端插件,用於在 dsh Web 界面中快速導出會話記錄。
- 實現方式:純前端注入,不依賴額外的 npm 包,通過複用官方的
/api/session.export接口獲取會話 ZIP 數據,並在前端解析和轉換。
安裝¶
安裝插件需要通過 npx 命令將本地目錄鏈接到 dsh 插件系統中。
- 確保本地有一個存放插件代碼的目錄,例如
D:\dsh-code\export-plugin。 - 在終端中執行以下命令:
npx @deepseek-ai/dsh plugin --profile web add D:\dsh-code\export-plugin
安裝後,需要重啓 dsh Web 服務才能使菜單注入生效。
核心功能¶
插件在會話列表的「更多」菜單中,於「歸檔會話」下方注入了兩個操作項:
- 導出 Markdown
- 導出極簡的問答對格式(用戶輸入 + 該輪最後一條助手可見回覆)。
- 保存爲
.md文件。 - 不包含思考過程、工具調用或系統提示詞。
- 導出 PDF
- 導出乾淨的問答對(包含文字與圖片)。
- 採用 A4 排版,利用瀏覽器原生打印功能生成 PDF。
- 需在系統打印對話框中選擇「另存爲 PDF」。
技術實現與過濾規則¶
插件複用了官方 dsh-session-log-export 包的 /api/session.export 路由。該接口返回一個 ZIP 文件,包含 canonical JSONL 日誌和圖片資源。插件在前端完成以下工作:
- ZIP 解析:使用瀏覽器原生的
DecompressionStream解壓 ZIP,解析出根目錄的session*.jsonl文件以及media/目錄下的圖片。 - 事件過濾:插件只處理
user/message和assistant/message事件。- 用戶輸入過濾:只保留
source.kind === 'user'的消息。這解決了同一消息在agent/inbox/spliced和user/message中重複記錄的問題(通過message id去重)。 - 系統內容過濾:自動過濾
runtime-context、time-context、skill-catalog、工作區指令等系統注入內容,避免它們混入用戶提問列表。 - 助手回覆過濾:每輪對話只保留最後一條助手可見回覆,丟棄過渡文本、思考過程 (
thinking)、工具調用 (tool_use) 及其結果。
- 用戶輸入過濾:只保留
使用方式¶
- 在 dsh Web 界面打開一個會話。
- 點擊會話行中的「更多」按鈕。
- 在彈出的菜單中選擇「導出 Markdown」或「導出 PDF」。
- 選擇 Markdown 後,文件會直接下載到本地。
- 選擇 PDF 後,瀏覽器會打開打印預覽窗口,用戶需手動點擊「另存爲 PDF」。
注意事項¶
- PDF 保存:由於瀏覽器安全沙箱限制,PDF 導出無法直接通過代碼保存文件,必須手動在打印對話框中操作。
- 內容範圍:導出的內容僅包含「用戶輸入」與「助手最終回覆」,不包含模型的思考鏈、中間草稿、工具調用詳情或系統提示詞。
- 菜單結構變化:插件通過 MutationObserver 監聽 DOM 變化,但若官方升級菜單結構導致文本匹配失效,可能需要更新插件代碼並重啓服務。
- Event 格式兼容性:插件主要針對 V4 事件格式。若 dsh 升級 event 格式導致未知的 event type 出現,Markdown 導出會將其原樣保留在代碼塊中,PDF 導出則會直接忽略。
- 大文件性能:包含大量圖片或超過 50 輪的會話可能導致文件體積較大或打印過程變慢。
總結¶
該插件通過極簡的問答對導出方式,解決了 DeepSeek Harness Web 界面下會話記錄保存的需求。對於只需要記錄最終對話結果的開發者或演示場景,它提供了一個無需配置後端、零依賴的輕量級解決方案。