dsh-upload-file:为 DeepSeek Harness Web GUI 添加本地文件上传能力

前言

DeepSeek Harness(DSH)的插件体系允许扩展 Web GUI 的功能。目前,系统对图片的上传已有原生支持,但对于任意文件(如 PDF、代码文件、二进制数据等),需要手动提供下载链接或通过模型工具读取。dsh-upload-file 插件通过在浏览器端注入上传控件,并在宿主端提供持久化存储和读取工具,解决了这一问题。

是什么

这是一个 DSH 客户端插件,由 OctKwong30 维护。它为 Web GUI 的 composer 输入框增加了文件上传能力。用户可以通过点击附件按钮或拖拽本地文件将文件上传至宿主进程,并在会话中通过卡片或工具引用这些文件。

安装

安装过程通过 dsh plugin 命令完成。执行以下命令即可从 GitHub 安装:

dsh plugin --profile web add github:OctKwong30/dsh-upload-file

安装完成后,需重启 Web GUI (dsh web 或对应的启动方式) 以加载插件。

核心功能

该插件主要包含以下能力:

  • UI 入口:在 composer 输入框工具行新增附件按钮(SVG 回形针图标),支持多选文件;支持直接将 OS 文件拖拽至 composer 区域上传。
  • 待发送状态:上传的文件以胶囊 chip 形式显示在输入框上方(待发送文件条),包含文件名、大小及移除按钮。
  • 消息集成:发送钩子会将文件链接并入消息文本,格式为 📎 [名称(大小)](http://…/dsh-upload/raw/<id>)。
  • 会话渲染:用户消息中的文件链接会渲染成文件卡片(图标 + 名称 + 大小 + 打开链接)。若渲染崩溃,会自动回退到官方渲染器。
  • 模型工具:宿主端提供 read_uploaded_file 工具,模型可据此读取文件内容(文本或二进制元数据)。
  • 持久化与下载:文件以 SHA256 内容寻址方式存储在 ~/.dsh/uploads/,并提供 GET /dsh-upload/raw/<id> 接口进行下载或预览。

使用方式

1. 按钮上传

打开任意会话,点击输入框工具行的回形针按钮,选择本地文件。文件上传后会显示在“待发送文件条”中,发送后消息文本会包含文件链接。

2. 拖拽上传

从文件管理器中拖拽一个或多个文件到 Web GUI 的 composer 区域。松开鼠标后,非图片文件会自动上传并进入待发送文件条;图片文件则由 shell 自带管线处理,不产生冲突。

3. 模型调用

模型收到包含文件链接的消息后,可调用 read_uploaded_file 工具。该工具支持接收裸 id、JSON 注释、markdown 链接或原始 URL 路径作为参数。

配置与安全

在 Settings → 插件配置 → dsh-upload-file 中,可以调整以下参数:

  • maxFileBytes:单文件字节上限(默认 20 MiB)。
  • maxTextReadBytes:read_uploaded_file 工具读取文本内容的上限(默认 256 KiB)。
  • uploadsDir:上传根目录,默认为 ~/.dsh/uploads。

安全方面,插件对文件 ID 进行了严格的 SHA256 校验,并对文件名进行了清洗,防止路径遍历攻击。

注意事项

  • 日志处理:文件字节不会进入对话日志,仅引用文本,与官方 describe-image 插件的逻辑一致。
  • UI 漂移风险:会话内的文件卡片依赖手写复刻的官方气泡样式。随着 shell 版本升级,官方 CSS 类名可能发生变化,导致卡片样式漂移。插件内置了自动回退机制,但建议关注更新。
  • 主题适配:拖放时的提示条使用内联样式,未跟随 GUI 的皮肤主题。
  • 存储清理:上传的文件不会自动定期清理,需手动处理 ~/.dsh/uploads/ 目录。

生态背景

DSH 插件通过 dsh.bundle.patch 机制组合宿主与客户端代码。该插件为纯 JavaScript 实现(ESM),无需构建即可运行。其架构参考了官方 describe-image 插件的 attach 路由与 sendSession 发送钩子模式。

羽毛球分组比赛记分
小程序二维码

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

小夜