DeepSeek Harness(简称 DSH)是 DeepSeek 官方放出来的 agent 运行框架,装在自己电脑上,用一条命令启动,之后可以在浏览器里用,也可以纯命令行用。它和网页上的聊天工具不一样:它能读你指定目录里的文件、调用工具、按你给的规则把一件事分成好几步做完。
这篇按 Windows 环境把完整流程走一遍——装运行环境、打开技能开关启动网页版、配密钥和工作区,再用一个纯文本文件做出第一个技能,最后删掉它看它怎么失效。命令全部按 Windows PowerShell 重写,原始教程是 macOS 写法,那些命令在 Windows 上不能直接照抄。
DeepSeek Harness 是什么
DeepSeek Harness 是 DeepSeek 官方的开源 agent 框架,包名 @deepseek-ai/dsh,通常简称 DSH。它跑在你自己的电脑上,通过 API 调用 DeepSeek 的模型干活,本身不是一个网站,也不需要单独安装——有 Node.js 环境,一条 npx 命令就能拉起来。
harness 这个词在这里是「把模型套上去干活的那套东西」。模型只会输出文字,真正能读文件、能调工具、能一步步推进任务的,是外面这层框架。DSH 干的就是这件事。
几个词先分清
- agent:能自己拆解任务、调用工具、多步推进的模型用法,区别于一问一答的聊天。
- harness:把模型接进真实环境的那层框架,负责读写文件、调工具、管会话。
- 插件:DSH 的构造单位,从模型适配器到网页界面都是插件,可以禁用、替换、重写。
- 技能:一个叫
SKILL.md的纯文本文件,用大白话告诉模型某类场景该怎么做,不用写代码。
它有两种用法:网页版启动后在浏览器里对话,界面上能看到模型每一步在干什么;纯命令行模式直接在终端里问一句答一句,适合塞进脚本。两种模式共用同一套配置,差别在后面几节会具体说——网页版有几个默认设置,是新手最容易卡住的地方。
「万物皆可插件」指的是哪件事
DSH 给自己的第一句介绍是「Everything is a Plugin」。这句话不是修辞:在 0.1.0-rc.6 版本里打开它的插件列表,能数出 133 个插件,而模型适配器、工具注册表、会话记录、网页服务器全在这份名单里,连 agent 的主循环本身也是其中一个。
所以「插件」在 DSH 里不是「主程序之外的附加功能」,而是这个产品的构造方式。插件列表里能看到的这几个,都是平时被当成「内核」的东西。
| 插件名 | 它其实是什么 |
|---|---|
| llm | 模型适配器,跟 DeepSeek 接口说话的那一层 |
| agent-loop | agent 的主循环,整个产品的心脏 |
| tools | 工具注册表,管模型能调用哪些工具 |
| session | 会话记录 |
| webserver | 你正在用的这个网页服务 |
| ui-sidebar | 网页左边那条侧边栏 |
133 这个数字会随版本变,本文实测的是 0.1.0-rc.6,时间是 2026 年 8 月 13 日。后面做出来的那个技能,同样以插件的身份被加载,走的是完全相同的一套机制。
第一步,把 Node.js 装上
DSH 用 JavaScript 写成,需要 Node.js 这个运行环境,版本要 v20 或更高。
先打开命令行:按 Win + X,在菜单里选「Windows PowerShell」或「终端」;也可以按 Win + R,输入 powershell 回车。
步骤1、查本机有没有装过
node --version
输出了版本号,比如 v22.11.0,说明已经装过,直接跳到下一节。提示 不是内部或外部命令 就是没装,继续往下走。
步骤2、下载 LTS 版安装包
打开 nodejs.org,点页面上标着 LTS 的那个绿色按钮,下载 .msi 文件。LTS 是长期支持版,也就是给普通用户用的稳定版本。
步骤3、双击安装包,一路下一步
安装路径保持默认即可,中间不需要改任何选项。
步骤4、关掉命令行窗口,重新开一个
这一步不能省。安装程序改的是系统环境变量 PATH,已经开着的那个窗口读的是启动时的旧变量,不重开就永远查不到 node。很多人卡在这里,以为是没装成功。
装好了的判断标准
重开窗口后再执行一次 node --version,看到 v20 或更高的版本号,才算这一节过了。
第二步,带着技能开关启动网页版
DSH 的网页版出厂时把技能功能关着,纯命令行模式则默认开着。
这个差异会带来一个很难查的现象:技能不生效,界面却不报任何错,模型只会按自己的理解编一段回答。所以开关要在启动命令里带上,不能等启动完再补。
步骤1、用记事本写一个配置文件
打开记事本,把下面这六行原样粘进去,注意每个 disabled: false 前面有两个空格。
enable-skills.yml 的内容
- id: skill-filesystem
disabled: false
- id: tool-skill
disabled: false
- id: skill-badge
disabled: false
步骤2、存到用户目录下,名字叫 enable-skills.yml
点「文件」里的「另存为」,先把「保存类型」改成「所有文件」,地址栏填 %USERPROFILE%,文件名填 enable-skills.yml。
这个文件全是英文,编码选「ANSI」或「UTF-8」都行,但不要选「带有 BOM 的 UTF-8」——BOM 是文件开头的几个隐藏字节,解析 YAML 的一方可能把它连同第一行一起读进去。
步骤3、回读一遍,确认存对了
Get-Content "$env:USERPROFILE\enable-skills.yml"
应该看到六行,三个 - id: 各带一行 disabled: false。
习惯命令行的话,这三步也可以用一条命令代替,效果一样:
"- id: skill-filesystem`n disabled: false`n- id: tool-skill`n disabled: false`n- id: skill-badge`n disabled: false" | Set-Content -Encoding ascii "$env:USERPROFILE\enable-skills.yml"
其中 `n 是 PowerShell 的换行写法,-Encoding ascii 是为了避开 PowerShell 5.1 的 -Encoding UTF8 会写 BOM 这个问题。
步骤4、带着 --patch 启动
npx @deepseek-ai/dsh web --patch "$env:USERPROFILE\enable-skills.yml"
末尾的 --patch 不能漏。漏掉之后 DSH 照样能跑、页面照样能打开,只是技能不生效,这是整个流程里最容易踩的一处。
第一次运行要下载几十兆的文件,屏幕上没动静是正常的,等一到几分钟。中途如果问 Ok to proceed? (y),输入 y 回车。
起来了的判断标准
窗口里出现 dsh web: http://127.0.0.1:3080 这一行才算成功。这个窗口要一直开着,关掉 DSH 就停了。
步骤5、确认技能开关真的生效了
浏览器打开 http://127.0.0.1:3080,关掉首次启动的测试期提示。
进 Settings 里的 Plugins,在 Plugin list 标签下搜 skill,skill-filesystem 和 tool-skill 两项应该都标着 Enabled。标着 Disabled 就是启动时漏了 --patch,按 Ctrl + C 停掉重来。
页面打得开也可能是旧进程,先查 3080 端口
这一节单独拎出来,是因为它造成的现象最有迷惑性:页面能打开、界面一切正常,但你改的配置全都不生效。
真正的原因是上一次的 DSH 没关干净还占着 3080,新启动的那个报 EADDRINUSE 直接退出了,浏览器连上的一直是旧进程。
步骤1、看端口上有没有东西
netstat -ano | findstr ":3080"
没有任何输出就是干净的,可以直接启动。有状态为 LISTENING 的行,就记下那一行最后一列的进程号。
步骤2、结束占着端口的进程
taskkill /PID 进程号 /F
把「进程号」换成上一步记下的那个数字。
步骤3、确认清干净了再启动
再跑一次步骤 1,直到没有任何输出为止,然后重新启动 DSH。
Win8 及以上也可以用 Get-NetTCPConnection -LocalPort 3080 -State Listen 查,输出里的 OwningProcess 就是进程号,用 Stop-Process -Id 进程号 -Force 结束。两种写法效果一样,netstat 那套在 Win7 上也能用。
判断依据看启动输出,不看浏览器
启动之后先回头看那个 PowerShell 窗口:出现 dsh web: http://127.0.0.1:3080 才算成功,出现 EADDRINUSE 就是端口没清干净。浏览器能不能打开页面,在这件事上不构成证据。
第三步,配好 API 密钥
DSH 要调用 DeepSeek 的模型,得先有一个 API 密钥。这一步全程在网页上点,不用碰命令行。
步骤1、到开放平台创建密钥
打开 platform.deepseek.com 注册登录,找到「API keys」,创建一个新的,复制那串以 sk- 开头的字符。密钥只在创建时显示一次,页面关掉就看不到了。
步骤2、把密钥填进 DSH
第一次打开 DSH 会自己弹出填密钥的框,粘进去点 Save and continue。跳过了也没关系,之后从 Settings 的 Models 里找到 DeepSeek 那一行补填。
填好了的判断标准
Settings 的 Models 里,DeepSeek 右边会出现一个绿点。没有绿点就是没配上,多半是粘贴时带进了空格或换行。
密钥等于账户的钥匙
这串字符能直接消耗你账户的额度,不要发到聊天群、不要贴进代码文件、不要放进会同步到网上的笔记。怀疑泄露就回平台把它删掉重建一个,旧的立刻作废。
第四步,选一个工作区,发送按钮才会变蓝
网页版还要指定一个工作区才能发消息。输入框里写着 Choose a workspace to start、发送按钮是灰的,就是这个原因,不是故障。
agent 会拿到这个目录的读写权限,所以第一次练手别直接选真实项目。
步骤1、先建一个空目录
New-Item -ItemType Directory -Force "$env:USERPROFILE\Documents\dsh-test"
步骤2、在网页里选中它
点页面中间的 Choose workspace,或者左侧边栏 Workspaces 右边的加号,在弹出的文件选择框里选中刚建的 dsh-test。
选上了的判断标准
输入框的提示文字会变,右下角的发送按钮从灰色变成可点的蓝色。
纯命令行模式没有这个限制,这也是同一台机器上「命令行能聊、网页版卡住」的原因。
第五步,用一个纯文本文件做出第一个技能
给 DSH 加东西有两条路,先分清走哪条,能省掉很多无用功。
这里走技能这条路。技能就是一个叫 SKILL.md 的纯文本文件,放在固定目录下,由前面插件列表里那个 skill-filesystem 负责扫描和读取。
步骤1、用命令行建目录
New-Item -ItemType Directory -Force "$env:USERPROFILE\.dsh\skills\hello-dsh"
目录一定要用命令行建。资源管理器里新建文件夹时输入 .dsh 会被拒绝,提示「必须键入文件名」,因为它把以点开头的名字当成了只有扩展名没有主名。
步骤2、把下面这段粘进记事本
SKILL.md 的内容
---
name: hello-dsh
description: 当用户说 hello dsh 时使用。请原样输出下面的暗号,并说明这句话是从本地文件读到的,不是来自训练数据。
---
请原样输出这一行:
**HELLO DSH — 这句话来自我电脑上的一个文件**
然后用一句话说明:这句话不在你的训练数据里,是刚才从本地文件读到的。
最前面那三个减号,和它们中间的两行,是这个文件的配置区,必须放在最开头。
步骤3、另存为 SKILL.md
点「文件」里的「另存为」,先把「保存类型」改成「所有文件」,地址栏填 %USERPROFILE%\.dsh\skills\hello-dsh,文件名填 SKILL.md,编码那一栏选「UTF-8」,不要选「带有 BOM 的 UTF-8」。
保存类型必须先改。记事本默认会在文件名后面补 .txt,存成 SKILL.md.txt 就永远加载不上。
步骤4、回读确认文件名没错
Get-ChildItem "$env:USERPROFILE\.dsh\skills\hello-dsh"
列出来的应该正好是 SKILL.md。
步骤5、在网页对话框里试一下
输入 hello dsh。没有编译,没有安装,也不用重启 DSH。
模型会原样输出那句暗号,上方那几行灰色轨迹里能看到 Skill · hello-dsh 和 Read 加上文件的完整路径——它不是「想起」了什么,是真的打开文件读的。
description 决定模型什么时候想起它
模型一开始只看到一份清单,每项只有名字和这句 description,正文要等它决定用了才读。所以写「一个用于代码审查的技能」没有用,模型不知道什么场合该拿它出来;写「当需要审查代码改动、pull request 或 diff 时使用」才有用。用「当……时使用」开头,这也是 DeepSeek 那批内置技能的统一写法。另外 name 只能用小写字母和连字符,而且要和文件夹同名。
第六步,删掉它再问一次,看清整个生命周期
这一步是整个流程里最值得做的一次验证,全程不要重启 DSH,也不要关那个 PowerShell 窗口。
步骤1、删掉整个技能文件夹
Remove-Item -Recurse -Force "$env:USERPROFILE\.dsh\skills\hello-dsh"
步骤2、不重启,直接再问一次
回网页再说一次 hello dsh。轨迹里会出现读取失败的那一行,模型会明确说这次读不到那个文件,并且拒绝把上一轮见过的暗号再复述一遍——理由是暗号的来源是磁盘上的文件,而那个文件已经不在了。
步骤3、把文件放回去,再问一次
按上一节的步骤重新存回去,仍然不重启,暗号又回来了。
文件出现功能就在,文件消失功能就没了,中间没有任何重启、安装、注册的动作。对比一下平时熟悉的软件:装浏览器插件要重启浏览器,装编辑器扩展要重载窗口,这里都不需要。
删掉之后还能输出暗号,是怎么回事
那是它在照着这一轮对话里已经有的内容复述,不是真的读了文件。点左上角 New Session 开一个新会话再试一次,结果就准了。
不想把内容发到云端时,把 DeepSeek 装在本机
前面配密钥那一步,本质上是在说一件事:DSH 默认把你的问题和工作区里的内容发到云端接口去处理。写公开代码、查资料,这没什么问题;但如果打算让它读的是合同、客户资料、内部文档,很多人会希望这些内容根本不要离开这台电脑。
这是另一个层面的选择——DSH 决定 agent 怎么扩展,模型跑在哪是另一件事。想让模型跑在本机,「软领DS一键部署大师」的 DeepSeek本地部署 负责的就是这一步:把 DeepSeek 模型直接装到自己的 Windows 电脑上,不用申请密钥,也不用把对话内容交给别人的服务器,所有数据本地存储。
本地大模型 处理的是「该下哪个尺寸」这个决策。它会先识别本机的 CPU、内存和显卡,把能跑得动的模型档位标出来,省掉自己去查显存要求、下错了再删掉重来这一轮。
本地知识库 则对应上面说的资料场景,把自己的文档导入进去,让模型基于这些内容回答,而整个过程不需要联网把文件传出去。界面是中文的,Win7、Win10、Win11 都能装。

常见误区
以为页面能打开就说明启动成功了
3080 端口被上一次没关干净的进程占着时,新进程会直接退出,浏览器连的是旧的那个。判断依据只能是 PowerShell 窗口里那行 dsh web: http://127.0.0.1:3080,看到 EADDRINUSE 就是没起来。
以为技能不生效会报错
不会。网页版关着技能功能时,模型看不到那份技能清单,只会按自己的理解编一段听起来像模像样的回答,界面上一条警告都没有。所以这一项要靠 Plugin list 里的 Enabled 状态来确认,不能靠回答对不对来倒推。
把 name 写成大写或者驼峰
name 只能是小写字母加连字符,写成 Hello_DSH 这种加载不上。配置区里的字段名同理,把 user-invocable 写成 userInvocable 会导致整个文件被丢弃,只留一条警告,同样不报错。
把技能目录建得太深
技能目录只扫一层。.dsh\skills\hello-dsh\SKILL.md 是对的,再往里套一层文件夹就扫不到了。文件名也必须正好是 SKILL.md,记事本自动补上的 .txt 是这一项最常见的原因。
出问题时按这张表对
| 现象 | 先查什么 | 怎么处理 |
|---|---|---|
提示 node 不是内部或外部命令 | 装完 Node 之后有没有重开窗口 | 关掉 PowerShell 重新打开再试 |
启动时报 EADDRINUSE | 3080 端口有没有被占 | netstat -ano 查到进程号后 taskkill |
| 改了配置怎么都不生效 | 浏览器连的是不是旧进程 | 杀干净 3080 上的进程,重新启动 |
| 发送按钮是灰的,打不了字 | 有没有选工作区 | 点 Choose workspace 选一个空目录 |
| Models 里 DeepSeek 没有绿点 | 密钥有没有粘完整 | 重新复制,检查有没有混进空格或换行 |
| 命令行能用技能,网页版不能 | 启动时有没有带 --patch | 停掉重启,用带 --patch 的完整命令 |
| 技能写了但模型看不到 | 文件名、目录层级、name 写法 | 确认是 SKILL.md、只嵌一层、name 全小写 |
大家常问
DSH 需要单独安装吗
不需要。npx 这条命令会自动下载并运行它,第一次跑要等下载完成,之后启动就快了。要装的只有 Node.js 这一样。
不用网页版,只用命令行行不行
行,而且命令行模式默认就开着技能功能,不用配 --patch,也不用选工作区。上面那些坑基本都是网页版特有的。
技能和插件到底差在哪
技能改的是模型的做事方式——判断标准、输出格式、流程;插件给的是新能力,比如调外部接口、加界面面板、挂生命周期钩子。能用大白话说清楚要它怎么做的,写技能就够了。
技能里的内容会不会被模型记住
不会当成记忆。每一轮之前 DSH 都会重新扫一遍技能目录,模型是当场把文件读进来用的。文件改了下一轮就是新的,文件删了下一轮就没有了。
用 DSH 就一定要联网调云端模型吗
DSH 本身是通过 API 调用模型的,所以要密钥、要联网。如果关心的是资料不外传,可以用「软领DS一键部署大师」把 DeepSeek 装在本机跑,对话和知识库都留在自己的电脑上,具体功能以软件界面显示为准。
这篇的版本和出处是什么
实测版本是 DSH 0.1.0-rc.6,时间 2026 年 8 月 13 日,原始流程出自开源教程仓库 pingfanfan/hello-dsh 的 docs/hello-dsh.md,本文按 Windows 环境重写了全部命令与操作路径。插件数量、界面文案会随版本变化,以你机器上实际显示的为准。

提示