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