第 3 章 五分钟上手:Web UI 从零跑通
3.1 环境要求
先确认两件事:
Node.js:官方要求 ^22.19.0 或 >=24.0.0。在终端跑 node -v 查看版本,不满足就去 nodejs.org 下载 LTS 以上版本。
一个 DeepSeek API Key:到 DeepSeek 开放平台申请。没有 Key 也能启动界面,但跑任务前必须配置。
小提示:如果你在国内网络环境,npm 源可能慢。可以设置镜像源(如 npmmirror)后重试,教程本身不需要科学上网。
3.2 一行命令启动
安装 Node.js 后,打开终端执行:
代码块
Plain Text
npx @deepseek-ai/dsh web
首次运行会下载 dsh 包(npx 会提示是否安装,选 yes)。启动成功后,终端会打印访问地址,默认是:
代码块
Plain Text
用浏览器打开它,你会看到 dsh 的 Web UI。
想固定版本、日常使用?
可以全局安装,以后直接敲 dsh:
代码块
Plain Text
npm install -g @deepseek-ai/dsh
dsh web
想读源码、追最新提交?
开发者预览期迭代很快,很多人选择源码运行:
代码块
Plain Text
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm run build
pnpm dsh web
源码运行适合两类人:想改插件的,以及想第一时间跟进官方提交的。
3.3 首次配置:三步走
第一步:配置 API Key
进入 设置 → 模型,找到 DeepSeek 卡片,粘贴你的 API Key 并保存。
关于安全,三个要点:
•
Key 是只写的:保存后页面只显示脱敏描述符,永远不会回显明文;
•
Key 存放在本地 $DSH_HOME/.credentials.yaml,不会上传;
•
配置变更下一次请求即生效,不需要重启服务器。
第二步:选择工作区
点击 选择工作区,添加你启动 dsh 时所在的目录(或任意你想让 agent 干活的项目目录),然后选中它。
注意:选中工作区之前,会话输入框是不可用的。这是设计,防止 agent 在没明确工作区时乱跑。
第三步:跑第一个任务
新建一个会话,输入类似这样的任务:
代码块
Plain Text
Summarize this repository and identify its main packages.
也可以换成中文:
代码块
Plain Text
总结这个仓库,列出它的主要包和各自的职责。
你会看到 agent 开始:读取文件 → 制定计划 → 调用工具 → 汇报结果。当操作在当前权限策略下需要审批时,Web UI 会弹窗问你。点允许,它就继续。
3.4 它能做什么:一次真实的体验
把你手头任何一个项目目录作为工作区,试试这些任务:
•
"找出这个项目里最可疑的 bug,并给出修复方案";
•
"给这个 README 补一段快速开始";
•
"跑一遍测试,把失败的那几个修好";
•
"帮我重构这个文件,保持行为不变";
你会发现 dsh 的行为模式:先规划,再动手,边做边记录,遇到权限边界停下来问你。这就是"harness"和"聊天机器人"的区别——它有工作区、有工具、有审批、有审计日志。
3.5 常见启动问题速查
#qGqXWvedkTXL text { white-space: pre; }#qGqXWvedkTXL .fb0 { stroke: var(--N900-FG, 0.15); }#qGqXWvedkTXL .fb0 {stroke: rgba(31,35,41, 0.15)}#qGqXWvedkTXL .fx0 { stroke-miterlimit: 10; }#qGqXWvedkTXL .fx0 {stroke-miterlimit: 10}#qGqXWvedkTXL .fa1 { fill: rgb(187, 191, 196); }#qGqXWvedkTXL .fa1 {fill: rgb(187, 191, 196)}#qGqXWvedkTXL .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#qGqXWvedkTXL .fx1 {font-style: normal}#qGqXWvedkTXL .fx2 { text-anchor: middle; }#qGqXWvedkTXL .fx2 {text-anchor: middle}#qGqXWvedkTXL .fx3 { dominant-baseline: central; }#qGqXWvedkTXL .fx3 {dominant-baseline: central}#qGqXWvedkTXL .fx4 { stroke: none; }#qGqXWvedkTXL .fx4 {stroke: none}#qGqXWvedkTXL .fc0 { fill: var(--text-caption); }#qGqXWvedkTXL .fc0 {fill: #646a73}#qGqXWvedkTXL .fa2 { fill: var(--text-link-disabled); }#qGqXWvedkTXL .fa2 {fill: rgb(187, 191, 196)}#qGqXWvedkTXL .fa3 { fill: rgb(232, 239, 250); }#qGqXWvedkTXL .fa3 {fill: rgb(232, 239, 250)}#qGqXWvedkTXL .fx5 { font: 700 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#qGqXWvedkTXL .fx5 {font-style: normal}#qGqXWvedkTXL .fx6 { text-anchor: start; }#qGqXWvedkTXL .fx6 {text-anchor: start}#qGqXWvedkTXL .fx7 { dominant-baseline: alphabetic; }#qGqXWvedkTXL .fx7 {dominant-baseline: alphabetic}#qGqXWvedkTXL .fc1 { fill: rgb(30, 42, 58); }#qGqXWvedkTXL .fc1 {fill: rgb(30, 42, 58)}#qGqXWvedkTXL .fx8 { font: 400 11px LarkHackSafariFont, LarkEmojiFont, Consolas, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, "Noto Sans", Tahoma, "Nimbus Sans L", Arial, "Liberation Sans", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC", "Source Han Sans CN", "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", STHeiti, SimHei, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", system-ui; }#qGqXWvedkTXL .fx8 {font-style: normal}#qGqXWvedkTXL .fc2 { fill: rgb(26, 58, 122); }#qGqXWvedkTXL .fc2 {fill: rgb(26, 58, 122)}#qGqXWvedkTXL .fx9 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#qGqXWvedkTXL .fx9 {font-style: normal}#qGqXWvedkTXL .fb1 { fill: var(--N900-FG, 0.15); }#qGqXWvedkTXL .fb1 {fill: rgba(31,35,41, 0.15)}#qGqXWvedkTXL .fb2 { fill: rgb(201, 212, 230); }#qGqXWvedkTXL .fb2 {fill: rgb(201, 212, 230)}#qGqXWvedkTXL .fa4 { fill: var(--bg-body); }#qGqXWvedkTXL .fa4 {fill: #fff}AB1234567现象原因与处理node -vMISSING_CREDENTIALUNKNOWN_MODELdsh web --port 8080--port 版本过低端口 3080 被占用提示 提示 输入框不可用国内网络下载慢升级到 Node 22.19+ 或 24+换个端口:(注意 属于 web 应用参数,要放在 dsh 自己的参数之后)还没配置 API Key,去 设置 → 模型 保存选一个已配置的模型,或检查自定义提供方的模型列表还没选中工作区配置 npm 镜像源后重试
3.6 本章小结
•
npx @deepseek-ai/dsh web 一行启动,默认地址 http://127.0.0.1:3080;
•
三步配置:API Key → 工作区 → 发任务;
•
Key 只写、存本地、改配置不用重启;
•
agent 会规划、执行、审批,行为是"工作台"而不是"聊天框"。
下一章,我们离开图形界面,看看命令行和无头模式怎么玩。