DeepSeek Harness 一条 dsh 命令多种模式:web、headless、sdk、acp 怎么选
npx @deepseek-ai/dsh web 里的 web 其实只是 dsh 命令的一个入口:同一条 dsh 命令还能跑 headless、sdk、sdk-minimal、acp 等多种模式,web 是 --profile web 的别名。要分清的是「dsh 启动器只认 --profile 这类启动参数,其余参数交给被启动的应用」——搞懂这条分界线,你就知道带什么参数、该用哪个模式。本文把 dsh 的每个模式逐个讲清,并给出一份「何时用哪个」的判断清单。
先认清分界:启动器参数 vs 应用参数
dsh 启动器只解析自己的标志,其后所有不认识的 token 都交给被启动的 profile 去解析。 这是理解 dsh 多条命令的钥匙。官方给出的示例(来源):
dsh --profile web --port 8080 # --port 属于 web 应用
dsh --profile tui --resume <id> # 假设已装 tui profile,--resume 属于终端应用
dsh --profile headless "run the tests" # 引号里的任务传给 headless 应用
dsh --profile web --help # 看的是 web 应用的参数,不是启动器的
dsh --help # 启动器自己的帮助
代码层面:dsh 由 src/args.ts 负责命令语法,src/bin.ts 只加载选中的 runner。因此无效命令、来自另一模式的参数、配置错误、启动失败都会以非零码退出(来源),你可以放脚本里判断。
dsh 的常用运行模式一览
dsh 是「唯一受支持的 Node 应用启动器」,profile 是插件 bundle 补丁层的有序堆叠;不同 profile 对应不同使用场景。 官方 Entry modes 表(来源):
| 命令 | 用途 |
|---|---|
dsh web | --profile web 的别名,启动交互式 Web UI |
dsh --profile headless "任务" | 跑一次全新持久化会话,打印最终答案后退出 |
dsh --profile sdk | 通过 JSON-RPC stdio 服务 SDK 客户端(默认值) |
dsh --profile sdk-minimal | 用独立极简 agent 树服务 SDK 客户端 |
dsh --profile acp | 通过 stdio 服务自动化客户端,直到断开 |
dsh plugin --profile <name> <pnpm 参数> | 转发给 profile 目录里的 pnpm 来管理插件 |
web、headless、sdk、sdk-minimal、acp 这五个 profile 会在首次使用时从内置模板自动初始化;其他 profile 必须通过 dsh plugin 创建(来源)。调用目录总被当作默认工作区根。
交互式模式:dsh web(对应 npx @deepseek-ai/dsh web)
dsh web 给人在浏览器里用,是官方 Quickstart 推荐的默认入口,等价于 npx @deepseek-ai/dsh web。 启动后:命令会打印访问地址(来源);在 Web UI 里先打开设置 → 模型输入 API 密钥并保存,模型路由立即可用、无需重启服务器;再点选择工作区添加并选中项目目录——选中之前会话输入框不可用(来源)。之后启动会话发任务,agent 可读写工作区文件、运行命令、委派工作,涉及审批的操作 Web UI 会先询问你。
日常开发、想一边看到 agent 逐步执行一边干预,就用这个模式。
一次性模式:dsh --profile headless
headless 不打开浏览器,跑一次新会话输出最终答案就退,适合脚本与 CI。 它的语义是「运行一个新鲜的持久化会话、打印最终回答、然后退出」(来源)。任务本身用引号包起来:
dsh --profile headless "run the tests"
因为每次都是全新会话,它天然适合批处理、定时任务、流水线里的一次性作业,不需要你盯着一台服务器手动点。
给代码调用的模式:sdk / sdk-minimal / acp
这三类模式都是给程序调用、不是给人看界面的,通过 stdio 与进程通信。 区别在服务对象与 agent 树规模(来源):
dsh --profile sdk:通过 JSON-RPC stdio 服务 SDK 客户端,是 SDK 的默认选择。dsh --profile sdk-minimal:用独立的极简 agent 树服务 SDK 客户端,适合只想用最小可用子集的场景。dsh --profile acp:通过 stdio 服务自动化客户端,直到客户端断开为止——适合把 DSH 嵌进别的自动化工具里。
Python 的运行时 wheel 打包的就是同一个 dsh 命令:SDK 默认走 sdk,极简示例走 sdk-minimal(来源)。如果你想用 Python 调 DSH,参考官方 Python SDK 指南;对应的不同 profile 就是在这里二选一。
何时用哪个模式:一张判断清单
选模式先问一句「我是人用还是代码用」,再问「要交互还是跑一次」。 按这个顺序判断:
- 人在浏览器里操作、要边跑边干预 →
dsh web(npx @deepseek-ai/dsh web或已全局安装用dsh web)。 - 脚本 / CI / 定时跑一次就完 →
dsh --profile headless "任务"。 - 用 SDK(如 Python JS)写程序调 DSH →
dsh --profile sdk,极简场景用sdk-minimal。 - 把 DSH 嵌进自动化客户端工具 →
dsh --profile acp,stdout 与客户端保持连接。 - 改端口 / 看某模式参数 → 把参数放在命令后,如
dsh --profile web --port 8080、dsh --profile web --help。 - 想装 / 卸插件 →
dsh plugin --profile <name> <pnpm 参数>。
装完 DSH 之后:用 DSH Plugin Hub 一键装插件
无论你选哪个模式,能力都来自插件——最省心的装法是 DSH Plugin Hub 的「设置 → 插件市场」。 装 Hub 本身一条命令:dsh plugin --profile web add dsh-plugin,装完重启 dsh web,打开 设置 → 插件市场 就是 DSH Plugin Hub 的插件市场首页,按分类浏览社区插件,卡片直接展示名称、描述、Star 与最近更新时间:

点进任意插件即可一键安装,后台串行执行、弹窗实时显示进度,装完大部分插件刷新页面即生效:

以上模式你都判断完、插件也接好了,接下来就能按需启动。想反过来弄懂 npx 这条命令到底下载了什么、数据存哪,可以看《DeepSeek Harness 用 npx 一键启动 Web UI:这条命令做了什么、数据存在哪里》。
常见问题
dsh 是 DeepSeek Harness 的唯一启动器,常用模式有 dsh web(即 --profile web)、dsh --profile headless "任务"、dsh --profile sdk、dsh --profile sdk-minimal 和 dsh --profile acp,分别对应 Web UI、单次任务、SDK 最小 agent 树与自动化客户端。
dsh web 启动交互式 Web UI,适合人在浏览器里逐步操作;dsh --profile headless "任务" 只运行一次全新的持久化会话、打印最终答案后退出,适合脚本或 CI 里跑一次性任务。
--profile <name> 指定要启动的 profile。web、headless、sdk、sdk-minimal、acp 会在首次使用时自动初始化并拿到快捷别名(dsh web 等价于 dsh --profile web),其他 profile 必须先通过 dsh plugin 创建。想让 web 变端口就写 dsh --profile web --port 8080。
sdk 通过 JSON-RPC stdio 服务 SDK 客户端,是默认值;sdk-minimal 用独立的极简 agent 树服务 SDK 客户端;acp 通过 stdio 服务自动化客户端直到断开。三者都是给代码调用,不是给人用浏览器。
dsh 只解析自己的启动参数,第一个它不认识的 token 之后全部交给 booted 的应用去解析。例如 dsh --profile web --port 8080 里 --port 属于 web 应用;dsh --profile web --help 看的是 web 应用帮助,dsh --help 看的是启动器帮助。
无效命令、来自其他模式的参数、配置错误、启动失败,dsh 都会以非零退出码结束,你直接在脚本里检查退出码即可,无需解析输出文本。
相关术语
- dsh web
- dsh web 是 dsh --profile web 的别名,用来启动 DeepSeek Harness 的交互式 Web UI;脚本里写成 npx @deepseek-ai/dsh web 时由 npx 先拉取官方包再执行 dsh。— dsh CLI README
- headless
- headless 是 dsh 的 profile 之一,用于运行一次全新的持久化会话:打印最终答案后退出,不打开浏览器,适合脚本或 CI 里的单次任务。— dsh CLI README
- exit code
- exit code 是进程结束时的返回码;dsh 启动器在命令无效、参数来自其他模式、配置错误或启动失败时都以非零码退出,因此适合在脚本中据此判断成功与否。— dsh CLI README
来源
- dsh CLI README· deepseek-ai
- DeepSeek Harness 官方文档 - Quickstart· deepseek-harness
- @deepseek-ai/dsh - npm· npm