dsh-show-image:在 WebUI 中直接发送工作区图片

在 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):

    1. 校验扩展名和附件服务支持的图片类型。
    2. 通过 DSH 文件系统服务解析路径并读取字节。
    3. 调用 attachments.saveImage() 保存图片,得到 ImageAttachmentRef。
    4. 返回供模型使用的文本摘要和规范化附件信息。
    5. 对顶层调用,将用户侧载荷写入 presentationMeta。
    6. 对 run_code 子派发,通过 tools/code-dispatch-log 只修改持久化日志副本,附加结构化 ImageBlock 和客户端标记。插件不创建自定义顶层 session event,以保持会话日志兼容 DSH 的已知事件类型和回放逻辑。
  • 浏览器端 (client.js):

    1. 注册一个 ConversationNodeDefinition。
    2. 匹配带有 dsh-show-image meta 的 tool/result。
    3. 匹配带有图片载荷标记的 tool/code-dispatch。
    4. 使用 renderMessageImages 复用 WebUI 内置图片画廊和灯箱。
    5. 以事件序号作为节点身份,支持会话历史回放。

限制与注意事项

  • 路径要求:图片必须是 DSH 文件系统服务可读取的本地工作区路径。
  • 部署限制:图片仍受当前部署的附件大小、尺寸和像素限制约束。
  • 历史数据:已经写入会话的旧事件如果没有结构化 ImageBlock,其历史图片可能无法通过附件授权接口重新读取;修复后的新发送会携带完整引用。

资源

  • GitHub 仓库:https://github.com/KureKaruna/dsh-show-image
  • 生态目录:https://www.skillhub.cn/plugins/KureKaruna/dsh-show-image
羽毛球分组比赛记分
小程序二维码

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

小夜