在 DeepSeek Harness (DSH) 的开发过程中,让模型向用户展示本地工作区生成的图片(如渲染图、分析图表)是一个常见需求。传统的做法通常需要用户手动复制粘贴或通过其他方式上传,体验较为割裂。dsh-show-image 插件通过注册模型工具,将工作区的图片直接挂载到 DSH WebUI 的对话流中,以画廊和灯箱的形式呈现。
插件简介¶
该插件由 KureKaruna 维护,采用 MIT 许可证。它通过注册 show_image 工具,将 DSH 文件系统中的图片文件转化为对话附件,并确保浏览器端能够正确渲染和预览。
安装与启用¶
将仓库安装到指定的 DSH profile:
dsh plugin --profile test add https://github.com/KureKaruna/dsh-show-image.git
也可以使用本地路径安装:
dsh plugin --profile test add C:/path/to/dsh-show-image
安装后重启 DSH WebUI,使宿主端和浏览器端插件一起加载。插件通过 cordis.patch.yml 自动加入 profile bundle。
核心功能¶
- 工具注册:注册模型工具
show_image,供模型在对话中调用。 - 格式支持:支持 PNG、JPEG、WebP、GIF 格式的图片。
- 持久化存储:从 DSH 文件系统服务读取工作区文件,并保存到持久化附件库。
- WebUI 渲染:在用户的 WebUI 会话中渲染图片画廊,支持灯箱预览。
- 参数支持:支持可选的
caption参数,用于为图片添加说明。 - 上下文隔离:图片字节不会作为图片内容发送到模型上下文,仅作为引用发送,避免不必要的 token 消耗。
- 结构化引用:使用结构化
ImageBlock作为会话附件引用,确保浏览器可以通过会话附件接口读取图片。 - 兼容性:兼容顶层原生工具调用和
run_code子派发。
典型用法¶
用户可以直接在对话中提出请求,例如:
把工作区里的
render.png发给我看看。
模型会调用如下工具:
{
"file_path": "C:/path/to/render.png",
"caption": "本次渲染结果"
}
图片随后会作为独立的聊天节点显示在 WebUI 中。file_path 必须指向当前 DSH 文件系统可访问的图片文件。
工作原理¶
插件分为宿主端和浏览器端两部分实现:
-
宿主端 (
index.js):- 校验扩展名和附件服务支持的图片类型。
- 通过 DSH 文件系统服务解析路径并读取字节。
- 调用
attachments.saveImage()保存图片,得到ImageAttachmentRef。 - 返回供模型使用的文本摘要和规范化附件信息。
- 对顶层调用,将用户侧载荷写入
presentationMeta。 - 对
run_code子派发,通过tools/code-dispatch-log只修改持久化日志副本,附加结构化ImageBlock和客户端标记。插件不创建自定义顶层 session event,以保持会话日志兼容 DSH 的已知事件类型和回放逻辑。
-
浏览器端 (
client.js):- 注册一个
ConversationNodeDefinition。 - 匹配带有
dsh-show-imagemeta 的tool/result。 - 匹配带有图片载荷标记的
tool/code-dispatch。 - 使用
renderMessageImages复用 WebUI 内置图片画廊和灯箱。 - 以事件序号作为节点身份,支持会话历史回放。
- 注册一个
限制与注意事项¶
- 路径要求:图片必须是 DSH 文件系统服务可读取的本地工作区路径。
- 部署限制:图片仍受当前部署的附件大小、尺寸和像素限制约束。
- 历史数据:已经写入会话的旧事件如果没有结构化
ImageBlock,其历史图片可能无法通过附件授权接口重新读取;修复后的新发送会携带完整引用。
资源¶
- GitHub 仓库:https://github.com/KureKaruna/dsh-show-image
- 生态目录:https://www.skillhub.cn/plugins/KureKaruna/dsh-show-image