这篇的目标是完成一个可以检查的任务:让 DeepSeek Harness 阅读一个文件,返回其中的端口号,并展示它确实调用了文件工具。启动页面只是中间步骤。
以下使用 @deepseek-ai/[email protected]。本轮本地核验使用 Node v24.19.0,参数依据同版本发布包和固定版本源码。Web UI 的配置流程参考官方使用指南;下面的真实模型任务需要自己的凭据,本轮不把它写成已重新执行的模型验收。
1. 准备一个独立练习目录
先使用已验证的 Node 24 LTS 环境,检查当前终端实际使用的版本:
node --version
npm --version
mkdir dsh-lab
cd dsh-lab
npm init -y
npm install --save-exact @deepseek-ai/[email protected]
npx --no-install dsh --version
最后一条应输出 0.2.0-rc.2。这里选择项目内安装,后面统一用 npx --no-install dsh:它应使用本项目的二进制,不临时下载另一个版本。不要在中途换成没有说明来源的全局 dsh。
保留 package.json 和 package-lock.json,另一个环境用 npm ci 安装。固定顶层版本解决“装到了哪个 CLI”的问题,锁文件进一步记录实际解析的依赖;插件有自己的安装状态,需要另外保存。
给练习使用独立的数据目录:
export DSH_HOME="$HOME/.dsh-tutorial-020"
后续几篇使用同一个变量。新开终端时重新设置它;不设置则使用默认的 ~/.dsh,你会看到另一套配置、凭据和会话。
2. 创建一个能核对答案的文件
在 dsh-lab 中创建:
cat > tutorial-input.txt <<'EOF'
service: tutorial-demo
port: 8421
EOF
故意让输入很简单。第一次使用时,目标是确认整条路径工作,而不是测试模型能完成多复杂的编程任务。
3. 启动 Web UI
npx --no-install dsh web --no-open --port 3099
等待终端打印访问地址,复制完整 URL 到浏览器。它会包含启动 token。--no-open 只是不自动打开浏览器,不会取消认证。
首次运行需要准备 profile,耗时取决于网络和机器。以就绪输出为准,不用固定睡眠秒数猜它是否已经启动。当前目录不要删除,服务运行期间保留这个终端。
对 0.2.0-rc.2,可以先通过这两份帮助分别检查 launcher 和 Web 参数:
npx --no-install dsh --help
npx --no-install dsh web --help
它们服务于不同层级。Web 端口等参数放在 web 后面;profile、配置导出和覆盖层由 launcher 管理。
4. 配置模型,再选择工作区
进入 Settings → Models,填写自己的 DeepSeek API key 并保存。凭据输入界面即可,不需要把它写入示例代码、仓库或截图。其他服务商和自定义地址按模型配置指南选择对应路由。
接着点 Choose workspace,添加并选择刚刚的 dsh-lab 目录。启动命令的工作目录与 UI 中当前选中的工作区是两个需要分别确认的状态;打开页面后仍要选择工作区,不能因为终端在正确目录就假定 UI 已经选好了。
如果消息输入区不可用,先检查工作区选择;如果发起任务后提示缺少凭据,检查当前模型路由和启动进程使用的 DSH_HOME。
5. 发送任务,并检查它是怎么完成的
新建会话,输入:
读取工作区中的 tutorial-input.txt,只返回 port 字段的值。不要修改文件,也不要运行其他命令。
预期答案是 8421。这不是一份伪造的运行输出,而是可以直接从文件核对的验收条件。再检查:
- 工具记录中出现对
tutorial-input.txt的读取。 - 文件原文没有被修改。
- 会话没有停留在等待授权或错误状态。
仅仅出现 8421 不足以证明工具路径已经走通;反过来,只有一个读取记录,也不能证明最终答案正确。这两方面都确认后,再把工作区换成真实项目,尝试阅读 README 和测试配置。
没有任何输出:先检查 Node 与命令来源
0.1.5-rc.1 的历史验证记录显示 在 Node v23.11.1 上静默退出、退出码为 0 的情况。其入口使用 if (import.meta.main),当该属性不存在时,入口函数不会执行。这是一条有版本范围的排错记录,不应概括成所有版本的行为。
这里要区分三个事实:
| 项目 | 它能说明什么 |
|---|---|
| 仓库声明的 Node engines | 上游声明支持的范围 |
| 某个 Node 特性的加入版本 | 该特性何时存在 |
| 实际使用的运行环境 | 这一次命令能否执行 |
Node 官方将 import.meta.main 的加入版本列为 24.2.0 和 22.18.0。因此,不能把旧仓库的 ^22.19.0 || >=24.0.0 解释为该特性的精确可用范围,也不能保证任意 24.0.x 都能靠这个判断启动。
遇到静默退出,先记录 node --version、锁文件中的 CLI 版本和实际执行路径。版本检查都没有输出时,先解决入口问题,再排查模型和网络。
页面返回 401:使用认证后的地址
启动 URL 中的 token 用来换取浏览器 cookie。直接输入一个没有 cookie 的裸地址会失败;打开完整 URL 后,浏览器会完成交换并回到普通地址。
换了 localhost、127.0.0.1 或端口,要重新从对应访问地址认证。不要把完整 token URL 当作公开书签或贴进问题截图。cookie 与 API 的 Host/Origin 检查是不同的机制,具体见Web 认证与排错。
暂时不要直接清空数据目录
DSH_HOME 保存 profile、凭据、工作区状态和会话。排查问题时,先用新的练习目录做对照,比删除原有 ~/.dsh 更容易回退。
确认这个练习目录不再需要后,再决定保留哪些配置和会话。卸载 npm 包不会自动解释哪些运行数据值得保留;重装 CLI 也不等于重置 profile。
完成文件阅读任务后,自动化方向接着读headless 与 CI,定制方向接着读profile 与插件管理。