dsh-rich-artifacts:把工作區文件發佈爲聊天 Artifact 的 DSH 插件

前言

如果你用 DeepSeek Harness(dsh)做過智能體開發,大概率遇到過這類場景:模型在會話中生成了一張圖、導出了一份 CSV,然後告訴你「文件在 output/ 目錄下」,或者貼出一個 file:///... 鏈接。文件確實交付了,但用戶要看內容,還得自己去宿主機上翻目錄、開本地預覽。

dsh-rich-artifacts 解決的就是這一步。它是 Inkotake 維護的一個 DSH 插件,把工作區文件包裝成「聊天 Artifact」:光柵圖片直接在會話裏內聯渲染,其他文件變成帶下載按鈕的文件卡片。模型創建面向用戶的交付文件時,調用 publish_artifact 工具即可完成發佈。

這是什麼

一句話定位:一個將工作區文件發佈爲聊天 Artifact 的 DSH 雙端插件(dual-face plugin),帶內聯圖片預覽和下載卡片。

幾個基本信息:

  • 插件名:dsh-rich-artifacts,作者 Inkotake,版本 0.1.0
  • 許可證:MIT
  • 倉庫:https://github.com/Inkotake/dsh-rich-artifacts
  • 目錄頁:https://www.skillhub.cn/plugins/Inkotake/dsh-rich-artifacts

DSH 的理念是「一切皆插件」,這個插件走的就是標準插件路徑:宿主側註冊工具和會話事件,瀏覽器側注入 UI。需要說明的是,skillhub.cn 是獨立的社區插件目錄,與 DeepSeek、幻方沒有官方從屬關係。

核心功能

publish_artifact 工具

插件向模型暴露一個 publish_artifact 工具,參數有三個:

  • path(必填):要發佈的工作區文件路徑
  • title(可選):顯示標題
  • display:auto(默認)/ inline / download

auto 模式下,PNG/JPEG/WebP/GIF 會內聯渲染,其他文件生成下載卡片;也可以通過 inline 或 download 顯式指定呈現方式。

ArtifactStore:內容尋址存儲

發佈的文件進入 ArtifactStore,採用 SHA-256 內容尋址的 blob 存儲,元數據單獨存放在 ~/.dsh/artifacts/v1/ 下。存儲根目錄、各類大小上限都可通過配置調整,後面會講到。

持久會話事件

插件註冊了一個持久會話事件 artifact/published。設計上只有 artifact 元數據進入會話日誌,blob 本體不進日誌。這樣做的好處是歷史會話在 reload / fork 之後,artifact 仍然能正常顯示。

有一個實現細節值得注意:artifact/published 是 log-only 事件,而當前 harness 沒有提供倉庫外會話事件類型的註冊入口,所以宿主在啓動時會把該事件加入 KNOWN_SESSION_EVENT_TYPES,保證插件安裝期間已持久化的會話仍可加載。

HTTP 端點

插件提供兩個端點:

  • GET /api/artifacts/:id/content — inline-safe 預覽
  • GET /api/artifacts/:id/download — 附件下載

Web UI 呈現

瀏覽器端在每輪對話的尾部(turn-tail)渲染一個畫廊:PNG/JPEG/WebP/GIF 內聯顯示,其他文件顯示爲帶下載按鈕的文件卡片。

安全機制

發佈文件涉及文件系統訪問和網絡暴露,插件做了幾層限制:

  • 工作區限制:通過 fs.resolve + fs.contains 保證只能發佈工作區內的文件
  • 末段符號鏈接拒絕
  • 魔數 MIME 嗅探:MIME 類型優先由文件內容決定,擴展名只是次要提示。一個僞裝成 .png 的 HTML 文件不會被內聯
  • V0.1 中 SVG/HTML 僅支持下載,不內聯
  • 文件大小、圖像大小、圖像像素限制

安裝與啓用

官方安裝命令:

dsh plugin --profile web add github:Inkotake/dsh-rich-artifacts

如果需要鎖定到某個 commit、做可復現的源碼安裝:

dsh plugin --profile web add github:Inkotake/dsh-rich-artifacts#<commit>

安裝後重啓 dsh web(或你安裝所用的 profile)即可生效。

倉庫中 lib/index.js 是 ESM 宿主插件,lib/client.js 是瀏覽器 bundle,兩者都已提交,所以源碼安裝不需要額外的構建步驟。如果要自己構建,倉庫裏有 pnpm install && pnpm run build 的流程,測試可以跑 node tests/artifact-store.test.mjs。

典型用法

插件會註冊一個 system-prompt section,模型在創建交付文件時會自行調用工具。你也可以直接在對話裏要求:

Create a training-loss chart, export it to CSV, and publish both files as artifacts.

模型隨後會執行:

publish_artifact({ "path": "output/loss.png", "display": "auto" })
publish_artifact({ "path": "output/loss.csv" })

執行完這一輪後,對話尾部會內聯顯示 loss 曲線圖,並附一個 CSV 的下載卡片。兩種類型的交付一次看全,不需要用戶去文件系統裏找。

配置

插件配置寫在 profile 的 cordis.patch.yml 裏:

- id: dsh-rich-artifacts
  name: dsh-rich-artifacts
  config:
    root: ~/.dsh/artifacts
    maxFileBytes: 104857600
    maxTurnBytes: 524288000
    maxImageBytes: 20971520
    maxImagePixels: 40000000
    inline:
      png: true
      jpeg: true
      webp: true
      gif: true
      svg: false

各字段含義與默認值:

字段 默認值 含義
root ~/.dsh/artifacts Artifact 存儲根目錄
maxFileBytes 104857600 單文件大小上限
maxTurnBytes 524288000 每輪上限(V0.1 尚未強制執行,爲預留項)
maxImageBytes 20971520 內聯圖像大小上限
maxImagePixels 40000000 內聯圖像像素上限(best-effort 解析)
inline.* png/jpeg/webp/gif: true,svg: false 哪些圖像類型可以內聯渲染

適用場景與注意

適合的場景:智能體需要向用戶交付可視化產物(訓練曲線、圖表、截圖)或數據文件(CSV、JSON)的工作流。凡是「模型產出文件、用戶要看內容」的場合,這個插件都能把交付環節收進聊天界面。

使用前有幾點要注意:

  • 插件以當前 dsh 進程的權限運行,能訪問該進程可訪問的文件系統資源。安裝前建議先檢查源碼和許可證,確認符合自己的安全要求。許可證爲 MIT。
  • maxTurnBytes 在 V0.1 中是預留配置,尚未強制執行,不要依賴它做每輪體積控制。
  • SVG 和 HTML 在 V0.1 中只提供下載,不會內聯渲染;這是有意爲之的設計,涉及 HTML/SVG 的交付場景需要知悉。
  • MIME 判定以魔數優先,擴展名只是次要提示,文件擴展名與實際內容不一致時以內聯安全策略爲準。

結尾

dsh-rich-artifacts 做的事情不復雜:把「文件在工作區裏」變成「文件在對話裏」。存儲用內容尋址保證可追溯,會話事件只存元數據保證歷史會話可回放,配合工作區限制和魔數嗅探把發佈路徑的口子收住。如果你的 DSH 工作流經常產出圖表和數據文件,值得裝上試一試。

  • 目錄頁:https://www.skillhub.cn/plugins/Inkotake/dsh-rich-artifacts
  • GitHub:https://github.com/Inkotake/dsh-rich-artifacts
羽毛球分组比赛记分
小程序二维码

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

小夜