dsh-rich-artifacts
English | 中文
一个 DeepSeek Harness(dsh)双端插件:把工作区文件变成聊天产物——图片直接内联在对话里,其他文件显示下载卡片。
不再有 file:///... 链接,也不再只是“文件已生成在 output/”——模型创建面向用户的文件后,调用 publish_artifact,文件就能持久地通过聊天 UI 交付给用户。
功能
publish_artifact工具
- path(必填):要发布的工作区文件路径 - title(可选):显示标题 - display:auto(默认)· inline · download
- ArtifactStore
- SHA-256 content-addressed 存储 - metadata 独立存放在 ~/.dsh/artifacts/v1/
- 持久会话事件
artifact/published
- 会话日志只保存 artifact metadata - 历史会话重载 / fork 后产物仍能显示
- HTTP 端点
- GET /api/artifacts/:id/content — 内联安全预览 - GET /api/artifacts/:id/download — 附件下载
- Web UI turn-tail 画廊
- PNG / JPEG / WebP / GIF 直接内联 - 其他文件显示下载卡片
- 安全
- fs.resolve + fs.contains 工作区约束 - 拒绝最终组件 symlink - magic-byte 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)。
使用
插件注册了 system-prompt 提示,模型创建交付物时会自动调用工具;你也可以直接要求:
帮我画训练 loss 曲线,导出 CSV,并把两个文件发布为聊天产物。Agent 会执行:
publish_artifact({ "path": "output/loss.png", "display": "auto" })
publish_artifact({ "path": "output/loss.csv" })回合尾部就会显示内联图片和 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 | 产物存储根目录 |
maxFileBytes | 104857600 | 单文件大小上限 |
maxTurnBytes | 524288000 | 预留的每回合上限(V0.1 尚未强制) |
maxImageBytes | 20971520 | 可内联图片大小上限 |
maxImagePixels | 40000000 | 可内联图片像素上限(尽力解析) |
inline.* | png/jpeg/webp/gif: true,svg: false | 允许内联的图片类型 |
构建
pnpm install
pnpm run buildlib/index.js 是 ESM host 插件,lib/client.js 是浏览器 bundle (window.__ModuleLoader__.load(...))。两者都已提交,源码安装无需构建。
测试
node tests/artifact-store.test.mjs架构
DeepSeek Agent
│ 创建文件
▼
Workspace File
│ publish_artifact
▼
ArtifactStore ──────────────► artifact/published 会话事件
│ │
│ (blob + metadata) │ (artifact_id + metadata)
▼ ▼
HTTP /api/artifacts/:id/* Session log(可重放)
│ │
└──────────────┬───────────────────┘
▼
Web UI turn-tail
┌─────────┴──────────┐
▼ ▼
ImageArtifact FileArtifact实现说明
artifact/published是 log-only 事件。当前 Harness 对 out-of-repo 插件还没有
会话事件注册面,host 启动时会把该事件类型加入 KNOWN_SESSION_EVENT_TYPES (运行时为可变 Set),这样持久化会话在插件安装期间可正常恢复。
- MIME 以 magic bytes 为准,扩展名仅作次要提示。
- V0.1 刻意不内联 SVG 和 HTML。
许可证
MIT