dsh-download-file:给 DSH 加上本地文件下载能力

前言

在 DSH(DeepSeek Harness)里开发智能体时,有时需要把远程资源拿到本地。内置的 web_fetch 能把网页正文读出来,但无法直接落盘;直接在对话里让 Agent 用 shell 命令下载,又受权限限制,容易遇到 spawn EPERM 或长时间挂起。download_file 插件解决的就是这个问题:让 Agent 能以当前进程的权限直接把任意 URL 的文件写到磁盘,并返回文件路径、字节数和内容预览。

插件简介

dsh-download-file 是一个给 DSH Agent 加上 download_file 工具的插件。它把 URL 对应的原始字节流写入本地磁盘,支持文本和二进制文件,不转换换行符,不限制文件大小,并在下载完成后返回文件开头几行预览。插件纯 ESM 实现,零依赖,无需构建,在 Windows / Linux / macOS 上都能用。维护者为 zchrissirhcz。

安装

命令行方式:

# profile 通常是 desktop 或 web,见 ~/.dsh/profiles 下的子目录

# 从本地目录安装
dsh plugin --profile <profile> add file:./dsh-download-file

# 或发布到 npm 后按包名安装
dsh plugin --profile <profile> add dsh-download-file

桌面版:DSH 桌面版 → 插件 → 填入 “https://github.com/zchrissirhcz/dsh-download-file” 即可。

工具签名

download_file(url, save_path?, overwrite?)

参数 必填 说明
url 是 文件完整 URL(内网 GitLab raw、公网 GitHub 等任意 http/https)
save_path 否 省略→当前工作目录(文件名取 URL 原始名);以 / 结尾或指向已存在目录→作为目录;否则作为完整文件路径(自动建父目录)
overwrite 否 文件已存在时:false(默认)→ 跳过、不覆盖;true → 覆盖

如果 URL 末尾没有文件名(如 https://x/),会用 download-<时间戳> 当文件名,避免重名。

在会话中使用

准确的给出 URL,下载速度最快:

下载 https://raw.githubusercontent.com/nihui/ruapu/refs/heads/master/ruapu.h

也支持二进制文件的下载:

下载 https://github.com/nihui/vkpeak/releases/download/20260527/vkpeak-20260527-windows.zip

只给个大概描述也行,DSH 会自动调用搜索 API,不过速度可能稍慢:

下载 github 上的 ruapu.h

如果文件已经存在,会检测到并询问是否覆盖。

在 SKILL.md 中

下面是一个真实可用的 skill 例子,用于安装 asan.cmake:

---
name: install-asan-cmake
description: 下载并安装 asan.cmake 到指定目录(默认当前目录),目标已存在时先询问是否更新。
---

# 安装 asan.cmake

下载源:`https://raw.githubusercontent.com/zchrissirhcz/rocbuild/refs/heads/main/plugins/asan.cmake`

## 步骤

1. **目标目录**:用户指定则用之,否则取当前目录(不存在则创建)。
2. **已存在?**:每次执行都先用 `read`/`glob` **实际检查磁盘**目标路径是否已有 `asan.cmake`(**禁止凭对话历史判断**)。存在时才询问是否更新;回答「否」则跳过并说明未改动,回答「是」才覆盖。
3. **下载**:用 `download_file`,`url` 填下载源,`save_path` 填目标目录下的 `asan.cmake`(绝对路径)。`download_file` 返回的字节数即校验结果,**不要再额外读取校验**。

## 注意

- 内容原样落盘,不加工。
- 失败时说明原因,不写空文件。
- 未获确认不覆盖已有文件。
- 尽量减少工具调用轮次:每多一个回合就多一次 LLM 往返耗时。

返回结果

成功下载:

{ "ok": true, "url": "...", "saved_to": "E:\\proj\\configs\\xxxbuild.cmake",
  "bytes": 2048, "binary": false, "preview": "cmake_minimum_required(VERSION 3.16)\nproject(example)" }
  • saved_to:文件实际落盘的绝对路径。
  • bytes:字节数。
  • binary:false 表示文本;true 表示二进制(图片、压缩包等)。
  • preview:文件开头几行,用来确认内容对不对;二进制时是一句提示。

文件已存在、默认没覆盖:

{ "ok": true, "skipped": true, "exists": true,
  "saved_to": "E:\\proj\\configs\\xxxbuild.cmake", "bytes": 2048 }

模型看到 skipped 就知道没覆盖,会再来问你是否强制刷新。

与内置 web_fetch 的区别

download_file(本插件) web_fetch(内置)
用途 下载成文件,落到磁盘 阅读网页,返回正文给模型
内容 原始字节,二进制友好 提取正文,丢弃二进制
结果 文件路径 + 字节数 + 文本预览 摘要文本
大小 不限(流式) 受上下文/抓取策略限制

一句话:要「拿回来一个文件」用 download_file,要「读一篇文章」用 web_fetch。

其他特性

  • 磁盘级存在检查:目标是否已存在以磁盘为准,默认不覆盖,避免静默覆盖。
  • 逐字节原样保存:文本换行符(\n/\r\n)、二进制字节均不转换、不丢失。
  • 无大小上限:流式写入,不把整个文件读进内存。
  • 120 秒超时保护:下载/写入卡死时自动中止,不会无限挂起。
  • 写盘不弹授权:在主机进程直接落盘,不需要逐次授权。
  • 失败走 DSH 原生 isError:网络/HTTP 错误作为工具失败返回,模型处理统一。

适用场景与注意

适合需要把远程配置、脚本、二进制包直接落到本地的智能体场景,比如自动安装工具、拉取本地配置模板、下载资源文件等。插件以当前 DSH 进程的权限运行,因此需要确保进程有目标目录的写入权限。安装前建议查看源码与许可证。

小结

dsh-download-file 让 DSH Agent 能安全、可控地把远程文件落到本地磁盘,避免依赖 shell 权限和手动下载。配合磁盘级存在检查和覆盖控制,可以在 SKILL 中实现可靠、可复用的下载逻辑。更多细节可参考:GitHub 仓库。

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

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

Xiaoye