支持拖入/粘贴 图片、文件,替换dsh本体上传按钮,支持文本模型调用多模态模型识别图片。
32.1/100
综合分
3
GitHub 星标
888
npm 周下载
—/5
用户评分
数据截至 2026/10/28 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @wszhoho/dsh-file-attachmentnpm 源 · @wszhoho/dsh-file-attachment 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · ui
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包@wszhoho/dsh-file-attachment @ 0.6.4
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖要求 >=0.1.0-rc.1 <0.1.1-0 || >=0.1.1-rc.1 <0.1.2-0 || >=0.1.2-alpha.1 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0 · 最新 0.2.1-rc.2 兼容
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/20 00:18:23
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 26 处,展示前 25 条)
- 读取本地文件lib/index.js:195
const text = await readFile(CONFIG_PATH, 'utf8') - 写入本地文件lib/index.js:216
await writeFile(CONFIG_PATH, JSON.stringify(next, null, 2) + '\n', 'utf8') - 读取本地文件lib/index.js:234
const text = await readFile(idxPath, 'utf8') - 写入本地文件lib/index.js:243
try { await rename(join(root, ATTACHMENT_DIR, INDEX_FILE), join(root, ATTACHMENT_DIR, INDEX_FILE + '.bad-' + Date.now().toString(36))) } catch { } - 写入本地文件lib/index.js:280
await mkdir(dir, { recursive: true }) - 写入本地文件lib/index.js:283
await writeFile(tmp, JSON.stringify({ version: 1, entries: obj }) + '\n', 'utf8') - 写入本地文件lib/index.js:284
await rename(tmp, join(dir, INDEX_FILE)) - 删除本地文件lib/index.js:286
await unlink(tmp).catch(() => {}) - 读取本地文件lib/index.js:301
const st = await stat(e.path) - 写入本地文件lib/index.js:334
await mkdir(dir, { recursive: true }) - 删除本地文件lib/index.js:354
await unlink(tmp).catch(() => {}) - 删除本地文件lib/index.js:359
await unlink(tmp).catch(() => {}) - 删除本地文件lib/index.js:368
await unlink(tmp).catch(() => {}) - 删除本地文件lib/index.js:383
await unlink(tmp).catch(() => {}) - 删除本地文件lib/index.js:387
await unlink(tmp).catch(() => {}) - 发起网络请求lib/index.js:456
const resp = await fetch(url, { - 发起网络请求lib/index.js:494
const resp = await fetch(url, { - 读取本地文件lib/index.js:831
st = await stat(path) - 读取本地文件lib/index.js:840
bytes = await readFile(path) - 发起网络请求lib/client.js:203
const r = await fetch('/dsh-file-attachment/config') - 发起网络请求lib/client.js:286
response = await fetch('/dsh-file-attachment/save' + q, { - 发起网络请求lib/client.js:315
const response = await fetch('/dsh-file-attachment/precheck', { - 写入剪贴板lib/client.js:1091
navigator.clipboard.writeText(text).then(doReset).catch(() => { - 发起网络请求lib/client.js:1265
const tr = await fetch('/dsh-file-attachment/test', { - 发起网络请求lib/client.js:1277
const r = await fetch('/dsh-file-attachment/config', {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 拖入粘贴图片文件
- 替换上传按钮
- 多模态识别图片
最近更新
在 GitHub 查看全部 →v0.7.12026-10-26
· v0.7.1
· 新增
· 视觉模型配置校验:兜底 VLM 的 Base URL / API Key / 模型名称三项任一缺失时,describe_image 工具与 /describe 路由统一提示「请正确配置视觉模型(设置→文件附件填写 Base URL、API Key 与模型名称)」,不再静默回退默认端点后报晦涩的连接错误。
· 设置页保存前连通性检验:点「保存」先以表单参数调 POST /dsh-file-attachment/test(最小文本请求,30 秒超时),检验通过才写入配置;失败时配置保持原样,原因红字内联显示在按钮旁。检验期间显示「正在检验视觉模型,请稍候…」。三项全空视为不使用 VLM 兜底(只用文件上传功能),跳过检验直接保存。
· 变更
· normalizeVlm 不再对 baseURL / model 回退默认值(空即未配置,可被检测);Base URL 与模型名的原默认值仅作设置页输入框 placeholder 示例。
v0.7.02026-10-22
· v0.7.0
· 新增
· 附件去重(文件名 + 大小):上传前客户端先调 POST /dsh-file-attachment/precheck 查重,命中直接复用已有文件路径、零字节上传(@路径 与芯片指向旧文件)。/save 侧对绕过预检的直连上传做同名同大小兜底后检,并发竞态下后到者自动收敛为先者路径。索引持久化于 .dsh-file-attachment/.index.json(懒加载、原子落盘、损坏自动备份重建),旧文件被手动删除后条目自动失效。精度说明:同名同大小即判重(元数据级),同名同大小但内容不同的文件会被复用——已确认可接受。
· 变更
· 落盘不再按日期分子目录:由 .dsh-file-attachment// 改为平铺 .dsh-file-attachment/;同名不同内容以 -N 序号共存。历史日期子目录不迁移,旧 @路径 引用保持有效。
v0.6.42026-10-15
· v0.6.4
· 性能
· 上传链路改为原始字节流直传:/save 协议由「JSON + base64」改为「元数据走查询参数(name/sessionId URL 编码)+ 请求体即文件字节流」。客户端 saveFileToHost 直接提交 File/Blob,由浏览器原生分块流式上传,删除手写 bytesToBase64;大文件上传明显更快、界面不再因整文件转码卡顿。服务端流式落盘:先以独占方式写临时文件,边收边计数,超过 50MB 立即中断并清理残留(返回 413),完成后原子占用最终文件名。
· 附件条缩略图改由 canvas 生成:输入框内联预览不再把整张原图的 base64 常驻内存,而是绘制 ≤256px 缩略图(PNG 保透明、其余输出 JPEG),解码失败自动回退类型图标;GIF 显示首帧静态图属预期。
· 修复
· 同名并发保存不再互相覆盖:落盘由「先探测存在再写入」改为 open('wx') 独占创建 + EEXIST 递增序号重试,消除竞态——同一天重复拖入同一文件稳定得到 a.png / a-1.png / a-2.png,原件绝不被顶掉。
· describe_image 错误提示中文化:文件不存在 / 无读取权限 / 指向目录 / 空文件等情况给出明确中文提示(如「图片文件不存在:」),不再向模型抛出 Node 原始报错(ENOENT: no such file or directory…)。
· describe_image 增加大小前置拦截:识别前先 stat,非普通文件、空文件、超过 20MB 的图片在读取之前直接拒绝,避免超大文件整体读入内存转 base64。
· 变更
· 内部重构:图片与文档两条入口共用的 chip 插入逻辑收敛为单一函数,消除约百行逐字重复代码,行为不变。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-file-attachment
文件附件插件,用于 DeepSeek Harness (DSH) Web GUI
拖拽 / Ctrl+V 粘贴 / 📎 按钮上传 · 内联缩略图 · @绝对路径 引用 · VLM 图片识别
DSH web GUI 的文件附件插件: 在输入框里拖入、粘贴或上传文件与图片;内联缩略图、可点击预览、@绝对路径 引用,还可选配 VLM 生成图片描述。
目录
- 快速开始
- 核心能力
- 处理流程
- 界面
- 行为一览
- 存储细节
- 安装
- 架构
- 开发说明
- English
快速开始
dsh plugin --profile web add @wszhoho/dsh-file-attachment
安装后重启 web GUI 即生效。
展开完整文档(README 剩余 1 节)
dsh-file-attachment
文件附件插件,用于 DeepSeek Harness (DSH) Web GUI
拖拽 / Ctrl+V 粘贴 / 📎 按钮上传 · 内联缩略图 · @绝对路径 引用 · VLM 图片识别
DSH web GUI 的文件附件插件: 在输入框里拖入、粘贴或上传文件与图片;内联缩略图、可点击预览、@绝对路径 引用,还可选配 VLM 生成图片描述。
目录
- 快速开始
- 核心能力
- 处理流程
- 界面
- 行为一览
- 存储细节
- 安装
- 架构
- 开发说明
- English
快速开始
dsh plugin --profile web add @wszhoho/dsh-file-attachment
安装后重启 web GUI 即生效。
核心能力
| 能力 | 说明 |
| 📥 三种入口 | 拖入、Ctrl+V 粘贴、接管 dsh 原生 📎 附件按钮(加号右侧、modes 左侧,可多选);PC 与移动端浏览器均适用 |
| 🗂️ 统一落盘管线 | 图片与文档同走一条链路,平铺保存到 <会话工作区>/.dsh-file-attachment/<文件名>;同名冲突追加 -N 绝不覆盖;同名同大小自动去重复用;单文件上限 50MB |
| 🔗 @绝对路径 引用 | 落盘后在光标处插入 chip,文本模型也能「看懂」附件 |
| 🖼️ 双区预览 | 输入框内联附件条(图片缩略图 / 文档类型图标 + 文件名,可移除并同步清除引用);聊天区图片渲染为可点击放大的缩略图(Lightbox) |
| 🤖 VLM 识别 | 非多模态模型下自动调用 OpenAI 兼容接口生成中文图片描述回填草稿(仅注入模型上下文);智能体可主动调用 describe_image 工具 |
处理流程
flowchart LR
A["📥 拖入 / 粘贴 / 📎 选择"] --> B{"文件校验类型 · 大小 ≤50MB"}
B -- "不合规" --> X["跳过并 toast 提示"]
B -- "通过" --> C["读全文 → base64 → Host 落盘"]
C --> D[(".dsh-file-attachment/YYYY-MM-DD/文件名同名追加 -N")]
D --> E["光标处插入 @绝对路径 chip"]
E --> F{"模型支持多模态?"}
F -- "否 · 已配 VLM" --> G["VLM 生成中文描述仅注入模型上下文"]
F -- "是 / 未配 VLM" --> H["随消息正常发送"]
界面
演示:拖入/粘贴 → 落盘并插入 @ 引用 → 输入框内联附件条待发送状态。
插件演示
VLM 图片识别
设置页(「设置 → 文件附件」):
| 设置组 | 内容 |
| 可上传类型 | 按文档 / 代码 / 配置文件三类增删扩展名(小写不带点,图片恒可发送) |
| VLM 参数 | Base URL / API Key / 模型 / 思考模式开关(默认禁用)/ 超时时间(默认 60 秒);未填 API Key 时静默跳过 |
可上传类型设置、多模态API设置
行为一览
| 操作 | 行为 |
| 📎 按钮多选 / 拖入 / 粘贴文档、代码、配置文件 | 读全文 → base64 → 落盘 → 光标一次性插入全部 @ 引用;成功不提示,失败简短 toast |
| 一次多个文件 | 批量处理,一次性插入全部引用;部分失败仅提示「N 个已跳过」 |
| 拖入 / 粘贴图片 | 同一管线落盘 + 插引用;附件条缩略图预览,聊天区可点击放大 |
| 当前模型不支持多模态 | 自动调 VLM 生成中文描述回填草稿;智能体可用 describe_image 工具 |
| 拖入目录 | 拒绝,toast 提示「不支持拖入目录」 |
| 粘贴纯文本 | 不改写,完全原生行为 |
| 重复拖入同名文件(同一天内) | 追加 -1、-2 序号,绝不覆盖 |
| 点附件条 × 移除 | 移除条目并清除该文件路径的全部 @ 引用 chip,其他文件不受影响 |
| 单文件 > 50MB | 跳过并提示 |
存储细节
- 命名:.dsh-file-attachment/<清洗后文件名>(如 .dsh-file-attachment/说明.docx,0.7.0 起平铺、不再按日期分子目录),同名在扩展名前追加 -N。
- 去重:上传前先查重(键 = 文件名 + 文件大小,元数据级判定),命中直接复用已有文件路径、零字节上传;.dsh-file-attachment/.index.json 为去重索引(自动维护,删除后自动重建)。历史 <日期>/ 子目录中的旧文件不受影响,引用保持有效。
- 根目录 = 当前会话工作区(回退顺序:session.header.cwd → sandboxPolicy.workspaceRoot → process.cwd()),每个项目各自维护自己的 .dsh-file-attachment/。
- 跨平台:保存路径用 path.join 自适应分隔符;文件名清洗对 Windows / POSIX 均安全;Host 半经 node:fs/promises 直接写字节,无 shell 依赖。
安装
本仓库是标准 dsh 插件包(声明了 dsh.bundle.patch),已发布 npm 包 @wszhoho/dsh-file-attachment。dsh plugin add 的参数会转发给 profile 目录的 pnpm 执行,三种来源任选其一:
从 npm 安装(普通用户推荐)
dsh plugin --profile web add @wszhoho/dsh-file-attachment
本地源码安装(开发用,边改边验;相对路径等价 pnpm link,改完 lib/.js 后重启 GUI 即生效)
cd <parent>
dsh plugin --profile web add ./dsh-file-attachment
从 GitHub 安装
dsh plugin --profile web add github:wszhoho/dsh-file-attachment
无论哪种来源,安装后都自动进入 profile 的 dsh.profile.bundles,无需手改 profile package.json;升级:dsh plugin --profile web update dsh-file-attachment。
架构
├── package.json # dsh.client 声明 + bundle patch 指向 ├── cordis.patch.yml # bundle 补丁:插入本插件行 └── lib/ ├── index.js # Host 半:webServer 路由(/save /config /describe)+ describe_image 工具 └── client.js # Client 半:document 级 capture drop/paste 监听 + 📎 按钮接管 + 槽组件
flowchart TB
subgraph client["Client 半 · lib/client.js"]
C1["capture 阶段拦截drop / paste / 📎 fileInput"]
C2["shadow 内联附件条conversation.input.attachments"]
C3["shadow 用户消息渲染器聊天区图片缩略图"]
C4["shell.overlay 浮动 toast"]
end
subgraph host["Host 半 · lib/index.js"]
H1["POST /savebase64 → node:fs/promises 写盘"]
H2["GET/POST /config可上传类型 · VLM 配置"]
H3["POST /describe"]
H4["tools.registerdescribe_image"]
end
VLM[("OpenAI 兼容 VLMMiMo 格式")]
C1 -- "文件 base64" --> H1
C2 -.-> H2
C1 -.-> C4
H3 --> VLM
H4 --> VLM
C3 -- "GET /api/file?path=" --> FS[(".dsh-file-attachment/ 落盘文件")]
H1 --> FS
- Host 半:前缀路由 /dsh-file-attachment——POST /save(base64 解码后用 node:fs/promises 写盘)、GET/POST /config(读写可上传类型与 VLM 配置)、POST /describe(调 VLM 返回中文描述与思考模式配置);另经 tools.register 注册 describe_image 工具。响应信封 { ok, value | error }。
- Client 半:shadow 原生附件条(conversation.input.attachments)实现内联附件条;shadow 用户消息渲染器(conversation.chat.node keyed user)把聊天区 @图片路径 渲染为缩略图(经宿主 /api/file?path= 读取落盘图片);capture 阶段拦截原生 fileInput change 事件接管 📎 按钮,文件进入插件统一管线;纯文本粘贴完全原生不改写。
- 通知与浮层:shell.overlay frame-wide 浮动 toast(不参与文档流,4 秒自动消失);拖入任何文件时 capture 阶段拦截应用自带的图片 DropOverlay(其文案对文档是误导)。
开发说明
- lib/.js、package.json、cordis.patch.yml、README.md 均为 UTF-8 无 BOM,编辑时保持原编码。
- 纯 ESM 无构建,不依赖装饰器 / 远程反射。
- VLM 请求按 MiMo 官方格式发送 thinking: { type: "enabled"|"disabled" }(扁平的 thinkingType 会被 API 忽略;mimo-v2.5 默认开启深度思考,导致识别极慢——实测 206 秒,关闭后 22~73 秒);超时后明确报错中止,不会挂死会话;未填 API Key 时识别静默跳过,不影响落盘。
- 50MB 上限两侧一致(client 跳过 + host 校验)。
Star
如果这个插件帮到了你,欢迎到 GitHub 仓库 点个 ⭐ Star,感谢支持!
dsh-file-attachment 是 DeepSeek Harness (DSH) 的 Web GUI 插件,支持通过拖拽、粘贴或 DSH 原生回形针按钮,把文件和图片附加到聊天输入框。
核心能力:统一存储管线,落在 .dsh-file-attachment/ 下;@absolute-path 引用,让纯文本模型也能使用附件;内联附件预览,以及可点击的聊天缩略图(带灯箱);多文件上传,处理同名冲突,并设 50MB 上限;可选 OpenAI 兼容 VLM 描述,供非多模态模型使用;桌面端和移动端浏览器均可使用。
安装:
dsh plugin --profile web add @wszhoho/dsh-file-attachment
详细行为、设置、架构和开发说明,见上方的中文文档。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
wszhoho/dsh-file-attachment
支持拖入/粘贴 图片、文件,替换dsh本体上传按钮,支持文本模型调用多模态模型识别图片。
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这是你的仓库?认领条目