# DeepSeek Harness 刚发布，我先让它做了个网页

> 发布第二天实测：一条命令启动 DSH，在空工作区里交付一个真实网页。

2026 年 8 月 14 日，DeepSeek Harness 开放开发者预览后的第二天，我决定先不啃源码，也不急着跑复杂 Benchmark，只验证一件最朴素的事：**它能不能把一句需求变成电脑里真实存在的网页？**

整个核心过程用了大约 **25～35 分钟**。通关标志也很简单：实验目录里出现 `index.html`，浏览器能够打开，页面内容和任务要求一致。第一次接触 DSH，只要完成这条路线就够了。

![第一次试 DSH 的主线：启动、圈定工作区、打开真实网页](https://herblab.online/qwen-imgs/dsh-01-article-guide-v1.png)<!-- display-width:500 -->

先看结果。这是 DSH 最后交付的网页成品：

![打开生成的 index.html 后看到的网页首屏](https://herblab.online/qwen-imgs/dsh-02-webpage-overview-v1.png)<!-- display-width:560 -->

页面已经作为文件写进工作区。好看只是第一印象，过程还要继续检查。下面从启动开始，把这次实验完整走一遍。

## 1. 发布第二天，我先看它能不能真的交付

DeepSeek 给 DSH 的定位是开源 Agent Harness，官方强调“Everything is a Plugin”。这句话听着很有想象力，但第一次体验时，我更关心一个具体问题：模型能不能调用文件、终端和搜索工具，最后交出一个由我亲手验收的结果？

所以这次没有让它挑战大型项目，而是选择制作一个介绍 DeepSeek Harness 的单页网站。网页的好处是结果足够直观：有没有文件、能不能打开、内容对不对，几分钟就能判断。

这次核对资料时，我优先使用以下入口：

- [DeepSeek 的 DSH 发布公告](https://x.com/deepseek_ai/status/2087887408440164663)
- [DeepSeek Harness 官方入口](https://www.deepseek.com/harness/)
- [DeepSeek Harness 官方仓库](https://github.com/deepseek-ai/deepseek-harness)
- [官方 Web UI 指南](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/user/guide/index.md)
- [DeepSeek 开放平台](https://platform.deepseek.com/)

官方入口给出的 Web UI 启动方式很短，后面真正要执行的核心命令只有一条。

![DeepSeek Harness 官方入口给出的 Web UI 启动命令](https://herblab.online/qwen-imgs/dsh-03-official-entry-v1.png)<!-- display-width:560 -->

**成功标志：** 你已经知道本文要交付什么，而且准备把实验限制在一个可以随时放弃的空目录里。

## 2. 三样准备，加一条启动命令

开始前只需要三样东西：

1. **Node.js**：让 `npx` 能运行 DSH。已经安装过就不用重装。
2. **DeepSeek API Key**：在 [DeepSeek 开放平台](https://platform.deepseek.com/)创建，再填入 DSH 的 `Settings → Models`。真实 Key 不要放进聊天、截图或文章。
3. **一个空实验文件夹**：例如 `try-harness`。不要直接选择桌面、常用代码仓库、公司资料或私人照片目录。

先打开 PowerShell 或 Windows Terminal，检查 Node.js：

```powershell
node -v
```

能看到版本号就可以继续。若提示找不到 `node`，从 [Node.js 官方下载页](https://nodejs.org/en/download)安装后重新打开终端；旧窗口可能还没有读取新的环境变量。

进入刚才的空实验目录，然后执行：

```powershell
npx @deepseek-ai/dsh web
```

教程截图里的 `$`、`>` 和前面的文件夹路径都只是终端提示符，不要一起复制。第一次运行若出现下面的询问，输入 `y` 并回车：

```text
Need to install the following packages:
@deepseek-ai/dsh@...
Ok to proceed? (y)
```

等终端打印类似 `http://127.0.0.1:3080` 的地址：

![终端安装 rc.6 并在 127.0.0.1:3080 启动本地 Web UI](https://herblab.online/qwen-imgs/dsh-04-launch-terminal-v1.png)<!-- display-width:560 -->

`127.0.0.1` 可以先理解成“这台电脑自己”。保持终端运行，在浏览器打开它实际打印的地址。本次截图安装的是 `@deepseek-ai/dsh@0.1.0-rc.6`，你复现时版本不同很正常。

**最小排错：** 没出现地址时，先读终端最后一行错误；页面打不开时，确认终端没有关闭，并以它实际打印的 URL 为准。

**成功标志：** 浏览器出现 DSH 页面，启动终端仍在运行。

## 3. 进入 DSH：先圈定工作区，再谈能力

第一次打开，DSH 会先显示开发者预览声明。

![首次进入时的开发者预览声明](https://herblab.online/qwen-imgs/dsh-05-preview-notice-v1.png)<!-- display-width:560 -->

这不是一段可以随手跳过的客套话。官方仓库明确提醒项目正在快速迭代，而且会出现兼容性破坏变更。本文记录的是 **2026 年 8 月 14 日**的界面；如果你看到的按钮、命令或插件行为不同，先回官方 README 和 Web UI 指南核对。

进入主界面后，点击 `Choose workspace`，选择刚才新建的空文件夹。工作区决定 Agent 围绕哪里读写文件，也是这次实验最重要的安全边界。

![空实验工作区被选中后，会话输入框才可用](https://herblab.online/qwen-imgs/dsh-06-workspace-ready-v1.png)<!-- display-width:560 -->

选好后，左侧会显示文件夹名，输入框也会变得可用。若选错目录，先换回空实验文件夹，不要抱着“应该不会改到别处”的侥幸继续。

接着看模式。界面里有标准、PTC、极简和创造四种模式：

![实验界面提供标准、PTC、极简和创造四种模式](https://herblab.online/qwen-imgs/dsh-07-modes-menu-v1.png)<!-- display-width:380 -->

- **标准模式**：包含本次需要的文件、终端、搜索和计划能力。
- **PTC 模式**：适合把多步工具调用组合起来，第一次体验暂时用不到。
- **极简模式**：只保留少量基础工具，更适合观察最小能力边界。
- **创造模式**：用来试验 Agent preset 和插件，留到下一篇。

今天保持标准模式即可。模式旁边还有三档文件权限：

![Read Only、Workspace Write 与 Full access 三档文件权限](https://herblab.online/qwen-imgs/dsh-08-permissions-menu-v1.png)<!-- display-width:380 -->

- `Read Only`：只能读取，无法写出网页。
- `Workspace Write`：允许在当前工作区内写文件，**本任务优先推荐这一档**。
- `Full access`：访问范围更大，这个小实验用不到。

这里必须把原实验说清楚：我当时实际选成了 `Full access`，后面的任务截图也保留了 `preset danger-full-access`。对于只在空目录里生成网页的任务，这是**过度授权，权限开得太大**。

我没有再用 `Workspace Write` 完整重跑同一个任务，因此不能把推荐写成已经复验过的结论。它来自权限定义和最小权限原则。你跟做时优先选 `Workspace Write`；若写入受阻，再根据具体提示判断，不要直接跳到最高权限。

**成功标志：** 左侧只有这次的空工作区，模式为标准，权限限制在完成任务所需的最小范围。

## 4. 把一个真实网页任务交给它

准备完成后，我把下面这句原始提示词发给 DSH：

```text
先搜索网页获取Deepseek Harness的最新资料，然后制作一个介绍Deepseek Harness介绍网页
```

句子里甚至重复了一次“介绍”，我没有替实验润色。目标仍然足够明确：先找资料，再把结果做成网页。

发送后，Agent 没有只回一篇介绍，而是开始搜索、建立任务列表，并准备写文件。

![Agent 搜索资料并开始拆解任务；顶部也如实保留了 Full access 证据](https://herblab.online/qwen-imgs/dsh-09-task-running-v1.png)<!-- display-width:600 -->

截图顶部的 `preset danger-full-access`，就是前面提到的过度授权证据。保留它比悄悄裁掉更有教学价值：这次任务确实跑通了，但跑通并不代表权限选择合理。

随后，搜索、计划、写入 `index.html` 和本地检查沿着任务轨迹继续展开。

![搜索、计划、写入 index.html 与本地验证按轨迹展开](https://herblab.online/qwen-imgs/dsh-10-task-progress-v1.png)<!-- display-width:600 -->

这时最容易犯的错误，是看到“4/4 完成”就提前庆祝。任务列表只能证明 Agent 认为步骤做完了；搜索内容是否准确、文件是否真的存在、网页是否正确，还需要人来检查。

**最小排错：** 长时间没有新事件时，不要重复发送同一个任务。先看任务列表、轨迹和启动终端，确认是模型仍在处理、工具等待审批，还是已经报错。

**成功标志：** 会话里出现对 `index.html` 的真实写入记录，而不是只有一段聊天回答。

## 5. 它说“完成了”，我还是亲手打开了一遍

几分钟后，Agent 给出了完成说明、文件名和本地预览地址。

![Agent 报告生成 index.html 并给出本地预览地址](https://herblab.online/qwen-imgs/dsh-11-task-complete-v1.png)<!-- display-width:600 -->

到这里先别急着下结论。真正验收至少要过四关：

1. **文件存在**：实验目录里确实能看到 `index.html`。
2. **页面能打开**：双击文件，或打开 Agent 给出的本地预览地址。
3. **内容对得上**：页面介绍的是 DSH，不是空白页、错误页或无关内容。
4. **关键交互正常**：至少滚动、导航和主要链接没有明显失效。

想在 PowerShell 里再确认一次，可以在实验目录运行：

```powershell
Get-Item .\index.html
```

前面已经看过首屏，继续向下滚动，还能看到功能卡片区：

![同一真实网页继续向下滚动后的功能卡片区](https://herblab.online/qwen-imgs/dsh-12-webpage-details-v1.png)<!-- display-width:560 -->

这次成品整体可用，但也出现了一个很典型的问题：网页自动写入了会随时间变化的 Star 数。我没有把这些数字当成本文事实，公开总览图也避开了相应区域。

这正好说明，Agent 能把网页做出来，不代表页面里的每个数字都已核验。同样，HTTP 200 只说明服务器返回了响应；未知路径可能回退首页，错误内容也可能返回 200。完成文字、HTTP 状态和真实页面内容要一起看。

**最小排错：** 找不到文件时先核对工作区；打开后还是旧页面时刷新并确认地址；页面空白时回到会话检查 HTML 和浏览器控制台，不要先删除原文件。

**通关标志：** `index.html` 真实存在，浏览器打开后能看到与任务一致的网页。

## 6. 网页做成后，Harness 和轨迹就好懂了

做到这里，再看 Harness 会比一开始背概念轻松很多：

```text
Model + Harness = Agent
```

![模型负责推理，Harness 把文件、工具、权限和会话接到真实动作](https://herblab.online/qwen-imgs/dsh-13-harness-diagram-v1.png)<!-- display-width:500 -->

- **Model** 负责理解目标、推理和决定下一步。
- **Harness** 把这些决定连接到文件、终端、工具、权限、会话和插件。
- 两者组合，才形成能够围绕目标连续执行的 **Agent**。

DeepSeek 所说的“Everything is a Plugin”，可以先理解为：模型、工具、会话和 UI 等能力能够被组合与替换。Cordis 更深层的设计很有意思，但不影响今天完成第一个网页。

这次我最喜欢的是“轨迹”面板。聊天区告诉我 Agent 说了什么，轨迹更接近它实际做了什么。

![轨迹视图把输入、模型思考与工具调用排在同一时间线上](https://herblab.online/qwen-imgs/dsh-14-trace-view-v1.png)<!-- display-width:600 -->

在同一条时间线上，可以看到输入、模型回合和工具调用。我们可以复盘执行顺序；遇到失败时，也更容易定位问题发生在哪一层，并核对它读写过什么。

右上角还能导出 `Session log`。完整日志可能包含工作区路径、提示词、工具参数、搜索内容和会话标识，所以本文只展示经过裁切的轨迹局部。分享日志前必须逐项脱敏。

到这里，本文主线已经结束。关闭实验时，先结束当前任务，再回到启动 DSH 的终端按 `Ctrl+C` 停止本地服务。

## 7. 选做：给纯文本模型补一双“眼睛”

核心网页任务完成后，我又试了一个插件场景。最开始直接粘贴截图，当前模型明确表示不支持图片：

![原始会话先明确提示当前模型不支持图片](https://herblab.online/qwen-imgs/dsh-15-image-unsupported-v1.png)<!-- display-width:380 -->

[ModLens](https://github.com/liustack/modlens) 是第三方视觉桥接插件，不是 DeepSeek 官方组件。它可以把图片转换为文本模型能够使用的信息。安装前要先阅读它的 `INSTALL.md`、权限、安全说明和数据去向；图片可能交给本机视觉引擎或外部服务处理，并可能消耗相应额度。

截至本文核对时，ModLens 仓库给出的 DSH 安装命令是：

```powershell
npx -y @deepseek-ai/dsh plugin --profile web add @liustack/modlens@latest
```

插件仍在快速变化。如果你的输出与本文不同，先回 [ModLens 安装说明](https://github.com/liustack/modlens/blob/main/INSTALL.md)核对，不要寻找来历不明的安装脚本。

完成安装和健康检查后，模型选择器里出现了两个带 `modlens vision` 的入口：

![安装 ModLens 后，模型列表出现两个 modlens vision 入口](https://herblab.online/qwen-imgs/dsh-16-modlens-models-v1.png)<!-- display-width:380 -->

切换入口，再粘贴同一张图提问，这一次已经能根据图片内容作答：

![切换视觉桥接入口后，DSH 能基于粘贴的截图作答](https://herblab.online/qwen-imgs/dsh-17-image-recognition-v1.png)<!-- display-width:560 -->

这条证据链很完整：原始能力先失败，安装插件后出现新入口，再用同类输入复验成功。它比一句“DSH 支持识图”更可信。

**最小排错：** 模型列表没有变化时，先看插件命令和健康检查结果，再按插件仓库说明刷新或重启 DSH。不要在不清楚数据去向时上传敏感截图。

## 8. 跑完以后，我怎么看 DSH？

![本地启动、网页落盘、轨迹可回看：本篇三项通关证据](https://herblab.online/qwen-imgs/dsh-18-article-summary-v1.png)<!-- display-width:500 -->

这次任务不复杂，但我对 DSH 的判断具体了很多：

1. 它能把模型连接到文件、终端和搜索，交付真实文件。
2. 工作区、权限与轨迹让执行过程比普通聊天更容易检查。
3. 插件可以补充新的能力，ModLens 的“失败 → 安装 → 复验”就是一个现成例子。

它目前更适合愿意在空目录里试验、能接受开发者预览变化、也愿意亲手验收结果的人。重要项目、公司资料和私人文件，不应该直接交给高权限 Agent；第三方插件在没有审计代码、权限和数据去向前，也不该接触敏感内容。

模型调用可能产生费用或消耗额度，价格也会变化，需要时请查看 DeepSeek 开放平台的最新说明。本文留下的证据缺口也继续保留：原实验使用了 `Full access`，同一任务还没有在 `Workspace Write` 下完整复验。

网页已经做出来了，插件也露出了一点真正有意思的地方。**下一篇，我们就从 0 开始做一个 DSH 插件**，看看“一切皆插件”究竟只是口号，还是普通人也能亲手用起来的能力。
