前言¶
在 DeepSeek Harness(DSH)里做智能体开发,常见需求是把本地文件交给模型处理:日志、截图、配置、数据样本。Web 端原生输入框主要面向文本,若只靠复制粘贴或手动把路径写进提示词,多文件、二进制、大图都不顺手,模型也未必能按预期读到宿主机上的文件。
下面介绍社区插件 dsh-web-file-uploader(维护者 Mooling0602)。它在 DSH Web 对话输入框工具行加入 DeepSeek 网页版风格的回形针按钮,把所选文件上传到 DSH 宿主机,并按当前模型能力决定注入方式:多模态模型走原生图片块,纯文本模型注入可读路径。插件当前版本为 0.3.0,许可证 MIT,在 GitHub 上约 11 stars,分类为客户端插件。
这是什么¶
dsh-web-file-uploader 是面向 DeepSeek Harness Web UI 的文件上传插件。一句话定位:在 composer 输入区增加附件入口,将文件持久化到 DSH 宿主机,并在发送消息时按模型能力把文件交给运行中的模型使用。
与「只在浏览器内存里暂存附件」不同,该插件把文件写到宿主机磁盘(动态模式为会话工作区 uploads/,静态 bundle 为 $DSH_HOME/uploads,默认 ~/.dsh/uploads),并维护去重索引,避免重复上传占满存储。
核心功能¶
输入区附件 UI¶
插件在输入框工具行左侧增加回形针按钮,支持多选。每个文件在输入框上方以附件卡片展示(图片显示缩略图),状态依次为读取中、上传中、已保存,并提供复制路径与移除操作。UI 文案通过应用 locale 服务本地化,支持中文与英文,跟随 DSH Web 语言设置或系统默认。
模型感知注入¶
上传文件以附件卡片为注入依据:卡片存在时,该文件的绝对路径会注入到此后发送的每一条用户消息;关闭卡片(×)调用 Host remove RPC,停止注入但保留磁盘文件;删除卡片(🗑)调用 delete RPC,从宿主机永久删除并清理去重索引。
注入行为按模型 inputModalities 区分(通过 llm.resolveModelInfo().inputModalities 检测,缓存 10 分钟):
| 模型类型 | 图片(png/jpeg/webp/gif) | 其他文件 |
|---|---|---|
多模态(含 image) |
经 attachments 服务注入原生 ImageBlock,不加额外文字提示 |
路径文本块 |
| 纯文本(如 DeepSeek V4 系列) | 路径文本块,模型可自行调用读取或识图工具 | 路径文本块 |
纯文本模型收到的注入块格式如下(英文,供模型阅读):
-----
[Attached files] Some files have uploaded with this message:
- /path/to/file1.txt
- /path/to/image1.png
Read the files or use tools to analyse (like vision tools), then answer the user.
插件只注入绝对路径,不耦合 vision-tools 等辅助插件;注入仅针对真实用户消息(source.kind === 'user'),不修改 steering 或系统消息。Ctrl+V 粘贴图片走产品原生草稿管道,插件不干预。
内容寻址防重传¶
上传时计算文件字节的 SHA-256,索引持久化在 uploads/.dfu-index.json(hash → { path, at })。相同内容再次上传会复用已有副本,响应带 dedup: true;同名但内容不同则按 -1、-2 规则处理文件名冲突。上传经 Promise 队列串行化,避免并发竞态。
清理与保留¶
默认 TTL 为 7 天。超过 TTL 且不在任何活跃会话 pending 引用中的文件会被懒回收删除。可在 设置 → 文件上传 配置保留期(settings 命名空间 dsh-web-file-uploader 的 { ttl } 字段);环境变量 DSH_UPLOAD_TTL(如 DSH_UPLOAD_TTL=30m)作为兜底。设为 0 或空值可禁用自动 GC,仅通过 🗑 手动删除。
大小与安全限制¶
单文件上限约 48 MiB(动态模式 RPC 载荷 64 MiB base64 上限,解码后约 48 MiB)。文件名会清洗路径分隔符、.. 与控制字符。
安装与启用¶
DSH 生态遵循「一切皆插件」。社区目录 SkillHub 提供插件索引,与 DeepSeek / 幻方无官方从属关系。
静态 bundle(持久化,推荐)¶
包声明了 dsh.bundle.patch,通过 dsh plugin --profile web add 安装到 web profile:
dsh plugin --profile web add github:Mooling0602/dsh-web-file-uploader
安装后重启 dsh web 进程并刷新页面。更新可执行:
dsh plugin --profile web update dsh-web-file-uploader
动态插件(当前会话,免安装)¶
适合快速试用,重启后需重新定义:
cordis_define + cordis_run # host = src/host.js,client = src/client.js
批准 Run 卡片后回形针按钮即出现。
典型用法¶
1、安装并重启 DSH Web,打开对话页面。
2、点击输入框工具行左侧回形针,选择一个或多个本地文件。卡片显示上传进度,完成后可点击「复制路径」。
3、输入问题并发送。多模态模型下图片以原生附件进入请求;纯文本模型会在消息中收到文件绝对路径,可结合 read、vision 等工具分析。
4、若不再需要向后续消息注入路径,点击卡片 × 关闭(文件仍保留在 uploads 目录)。确认永久删除时点击 🗑。
5、需要调整自动清理周期时,打开 设置 → 文件上传,修改 TTL,例如 30m、7d;或在启动前设置环境变量:
DSH_UPLOAD_TTL=30m
适用场景与注意¶
适合谁: 经常在 DSH Web 里让模型读日志、看截图、分析配置或数据文件的开发者;已安装 vision-tools 等读文件插件、希望路径注入与工具链解耦的用户。
运行权限: 插件以当前 dsh 进程权限运行,文件写入宿主机磁盘。安装前应阅读 GitHub 源码 与 MIT 许可证,确认上传目录与保留策略符合你的安全要求。
其他注意: 动态模式文件保存在会话工作区 uploads/;静态 bundle 写在 $DSH_HOME/uploads。单文件约 48 MiB 上限,超大文件需在卡片上查看错误提示。Node 引擎要求 >=20。
链接¶
- 社区目录:skillhub.cn/plugins/Mooling0602/dsh-web-file-uploader
- 源码与文档:github.com/Mooling0602/dsh-web-file-uploader
经过上面的步骤,DSH Web 输入框即可像 DeepSeek 网页版一样挂附件,文件落在宿主机、按模型能力注入,并带去重与 TTL 清理,适合日常对话式文件分析工作流。