DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

File Upload — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
F

dsh-file-upload

File Upload

通过上传按钮或拖放文件,将其作为本地路径添加到 DSH 对话中(适用于任何视觉插件)

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:a903067276-rgb/dsh-file-upload#6b39d6f5f09c99d86ee122bd1b76b0809f69a321
README兼容性版本
dsh-file-upload in actionSettings card

兼容性与来源证明

File Upload 以 dsh-file-upload 发布,当前版本为 0.1.7。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/8/25

版本

0.1.7stable
2026/8/25
0.1.6stable
2026/8/23
0.1.5stable
2026/8/22
查看其余 4 个版本收起版本
0.1.4stable
2026/8/21
0.1.3stable
2026/8/21
0.1.2stable
2026/8/21
0.1.1stable
2026/8/20

相关插件

正在加载相关插件…

最新版
0.1.7
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 11
周下载
0
最近提交
2026/9/15
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Experimental Agent Team Web Profile@deepseek-ai/dsh-experimental-agent-team-web-profile用于 Agent Teams Remote 和 UI 插件的实验性 Web 配置层Remote Web Ui@linxin666/dsh-remote-web-ui通过扫码配对访问 dsh Web GUI,共享一个官方界面:设置按钮旁的二维码可将手机和 PC 配对到同一个 Web GUI(手机采用竖屏触控适配层,PC 使用完整桌面界面),通过一次性令牌和 rClient Ui Task Board@linxin666/dsh-client-ui-task-board面向 DSH Web GUI 的主机权威任务面板,支持实际会话执行、主机 cron 调度以及可选的跨平台空闲睡眠保护;以挂载方式提供,无需修改 DSH 源代码。

README

dsh-file-upload ⬆️

English | 简体中文

One upload button + drag-and-drop files straight into the conversation — a plugin for DeepSeek Harness (dsh) web.

Unofficial project: independently developed and maintained by a community member, not an official DeepSeek product.

Screenshot

dsh-file-upload in action

The upload icon button in the composer tool row (official DSH design tokens, follows dark/light theme); either the file's path is inserted into the input box, or — for supported images — the image lands in the official attachment rail (auto file_id reuse).

Features

ActionEffect
Click upload iconSystem file picker (multi-select) → smart routing → attachment rail and/or path text
Drag a file into the windowImages & any file type are taken over (no "unsupported" toast) → smart routing
Drag a folder into the windowRecursively reads the whole folder → rebuilds it under the attachment library with its original layout → only the folder path goes into the draft (contents not expanded)
Image (PNG/JPEG/WebP/GIF)① archived to the attachment directory (by-day folders) ② added to the official draft attachment rail → sent with automatic DeepSeek Files API file_id (same image reuses the id; 7-day expiry auto-reuploads)
Any other fileArchived to the library's files/ subfolder, <prefix> <path> text goes into the draft
Model without image supportImage falls back to archive + path text (never sent as an image block, no 400)
  • Single-file limit: 64 MB (DeepSeek Files API hard limit; the local attachment store defaults to 20 MB — see Large images below)
  • Everything lands in the attachment library: ~/Documents/DSH/Attachments/images/<YYYY-MM-DD>/ (images) or .../files/<YYYY-MM-DD>/ (other files) — configurable in Settings
  • Button shows busy state while uploading; failures surface as Chinese notices

Settings card

Settings card

  • Attachment directory (~/Documents/DSH/Attachments default, ~ supported) — only used for image archives
  • Path prefix ([上传文件] default) — text prepended to paths in the draft; clear it to send bare paths
  • Images via official attachment (default on) — off = images follow the old path-text logic
  • Archive images to the attachment directory (default on) — off = official attachment only (saves disk; if the official channel is unavailable, the image is still force-archived)
  • Allow public uploads (default off) — off = same-origin check keeps allowing localhost only (CSRF-safe); on = any origin may upload, for public/port-forwarding access (e.g. ddnsto). Enable only if you trust everyone who can reach your DSH.
  • Clipboard listener (default off, keeping official built-in paste; options: off / images only / all files) — paste interception mode. Off = official built-in paste; images only = the plugin takes over pasted screenshots/images (works even when the model has no vision support — falls back to path text); all files = any pasted file is handled (archived to the library + path text in the draft). Changing the mode takes effect immediately after saving, no page reload.
  • Read-only display: current image size limit from the host

Large images (20–64 MB)

DeepSeek accepts up to 64 MB per image. DSH's local attachment store defaults to 20 MB; images above that (and ≤64 MB) are archived + path-text referenced (the model can still read them via read_image, which follows the same store limit).

To let large images through the official attachment path too, add this to ~/.dsh/profiles/web/cordis.patch.yml and restart dsh web:

- id: attachment-local
  config:
    maxImageBytes: 67108864   # 20 MiB → 64 MiB (DeepSeek hard limit)

Note: the whole config row is replaced, so keep every key you need; re-check against the DSH version after upgrades. The model always sees the harness-normalized version (≤2048px / ≤4 MiB, ≤384 tokens per image) regardless of the original size.

Install

Official bundle install (one line):

dsh plugin --profile web add "github:a903067276-rgb/dsh-file-upload#main"

Restart dsh web (bundle layers are composed at startup). Requires pnpm on PATH (dsh plugin forwards to pnpm).

Manual mount (fallback): see docs/install.md — symlink into ~/.dsh/profiles/web/node_modules/ plus a single entry in ~/.dsh/cordis.patch.yml (a double entry makes the plugin apply twice and crash on duplicate route registration), then restart.

Usage

  1. Click the upload icon and pick files (multi-select), or drag files/folders anywhere into the window.
  2. Images (when the current model accepts images): archived to the attachment directory and shown in the official attachment rail — send, and the model sees the image (DeepSeek Files API file_id, auto-reused).
  3. Images when the model does not accept images (or you turned the official path off): archived to images/, then <prefix> <absolute path> lines go into the draft — e.g. [上传文件] /path/to/Attachments/images/xxx.png — and your existing draft text is kept.
  4. Other files: archived to files/, path text goes into the draft. Press send; the model reads the file by path.
  5. Folders: drag one in and it is rebuilt under the attachment library with its original layout; only the folder path (one line) goes into the draft.

Platform support

PlatformStatus
macOS✅ fully tested (development environment)
Linux✅ expected to work (pure Node implementation), untested
Windows⚠️ expected to work (pure Node implementation, Windows-safe filename sanitization, platform separator paths), untested

Requirements

  • DSH web >= 0.1.0-rc.7 (run with dsh web)
  • Version compatibility (best effort — new features verified locally on 0.1.1-rc.2; on 0.1.0-rc.7/rc.8 the official image rail can't be fully checked, not guaranteed):
  • Maintenance policy: this plugin keeps evolving with the latest DSH releases; compatibility with older DSH versions is best-effort only and not guaranteed going forward.
Your DSH versionInstall thisNote
0.1.1-rc.1 and newermain (v0.1.5+)Full features (including the official image rail)
0.1.0-rc.7 – 0.1.0-rc.8main (v0.1.5+)Works fine; the official image rail auto-degrades to path text unless the session model accepts images. Conservative fallback: v0.1.4 — dsh plugin add github:a903067276-rgb/dsh-file-upload#v0.1.4
0.1.0-rc.6 and olderv0.1.2 — dsh plugin add github:a903067276-rgb/dsh-file-upload#v0.1.2Last release without the settings card (the card uses the rc.7+ keyed slot contract)
  • No extra shell needed: the host half is pure Node (node:fs), no system commands required on any platform.

How it works

  • Host (lib/index.js): POST /api/file-upload/save — validates the session and size, writes the base64 payload to <library>/images/<YYYY-MM-DD>/ (mode=image) or <library>/files/<YYYY-MM-DD>/ (mode=file) with pure Node; POST /api/file-upload/save-folder — takes a relative-path + base64 list and rebuilds the tree under <library>/files/<date>/<timestamp>-<folder>/ (each segment sanitized, .. rejected to prevent traversal); GET/POST /api/file-upload/config reads/writes the settings (official settings service) and exposes the host image limit plus whether the current session's model accepts images (llm.resolveModel inputModalities — same source the adapter uses).
  • Client (lib/client.js): registers the upload icon in the conversation.input.left seat; capture-phase document listener takes over file drags and reads dragged folders via webkitGetAsEntry; routing: supported image + official on + model supports + within host limit → archive + conversation.createDraftImages + inputActions.addImages (the official InputBar's own mechanism) → official attachment rail (no path text); anything else degrades to archive + path text; >64 MB is refused with a notice.
  • Error boundary: a render crash degrades to a small "⚠ upload component error" chip instead of unmounting the whole composer.

Notes

  • The attachment library only grows; it is never cleaned automatically (we don't delete your files) — remove files manually when needed.
  • After modifying the plugin, restart dsh web for changes to take effect (client-side edits apply on a page refresh; host edits need a restart).

Why this plugin exists

DSH natively rejects dragged-in images when the current model doesn't support them. This plugin routes images through the official attachment path when the model can see them (so they ride the DeepSeek Files API with file_id reuse), keeps a user-accessible archive copy you can find later, and falls back to plain path text otherwise — a plain-text message that passes the model's image check and works with any model or vision plugin (it bypasses DSH's native image rejection because no image block is ever submitted on the fallback path).

License

MIT