☰
DeepSeek Harness 安装与配置指南:Windows 下 dsh 开机自启与 TaoToken 接入
2026/10/17 2:32:07 网站建设 项目流程

1. Windows 上跑 DeepSeek Harness 到底卡在哪:dsh 安装与配置的真实场景

DeepSeek Harness(命令行叫 dsh)是 DeepSeek 官方出的 Agent 工作台,跑起来之后会在本机起一个 Web UI,默认地址是http://127.0.0.1:3080,你可以在浏览器里做对话、任务编排、工具调用这些事。它适合谁?适合想在 Windows 本地把 Agent 工作流跑通、又不想每次都手动敲命令启动的开发者。说白了,它就是一个「本地常驻的 Agent 控制台」。

但真在 Windows 上装,坑比想象中多。我见过最多的三类问题:第一,Node.js 版本不对,dsh 要求 v20 及以上,很多人机器上还是 v16 或者更老的,npm install -g直接报 engine 不匹配;第二,装完了不知道怎么让它开机自己起来,每次重启电脑都要手动开一个 PowerShell 敲dsh web,用两天就烦了;第三,模型通道默认走的是 OpenRouter 那套配置,Key 散落在环境变量和 settings.yaml 里,换机器或者换 Key 的时候要翻好几个地方。

这篇就按「装 → 配 → 自启 → 验证 → 排障」的顺序走一遍,重点放在两件事上:一是 Windows 计划任务实现 dsh 开机自启的完整脚本和注册命令,二是把模型 API 通道统一改到 TaoToken 管理,Key 只维护一份。中间所有配置文件、命令都是可以直接复制粘贴的,路径和你机器上的%USERPROFILE%\.dsh\保持一致。

先说清楚 dsh 的目录结构,后面所有操作都围绕它:配置目录是%USERPROFILE%\.dsh\,里面会有settings.yaml(模型配置)、.env(API Key)、logs\(运行日志),自启脚本也建议放这里。Web 默认端口 3080,命令是dsh,包名是@deepseek-ai/dsh。记住这几个,后面看命令就不会晕。

环境要求就两条:Windows 10 / 11,Node.js v20 及以上(推荐 LTS)。npm 跟着 Node.js 一起装。先检查版本:

node -v npm -v

如果node -v出来是 v18 或者更低,先去 nodejs.org 下个 LTS 装上,装完重开一个 PowerShell 再验一次。这一步别偷懒,版本不对后面全是玄学报错。

2. 把模型通道切到 TaoToken:dsh 统一管理 API Key 的前置准备

dsh 默认的模型配置走的是 OpenRouter 那套 provider 写法,settings.yaml里写baseURL: https://openrouter.ai/api/v1,Key 放OPENROUTER_API_KEY。这套能用,但如果你手上有多个项目、多个 Key,管理起来就散。我的做法是把通道统一收到 TaoToken,好处是 Key 只在一个地方维护,换模型或者换 Key 的时候改一处就行,dsh 这边只认一个 baseURL 和一个 Key。

TaoToken 的 API 入口是https://taotoken.net/api,官网是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。它兼容 OpenAI 的 completions 接口格式,所以 dsh 里 provider 的api字段填openai-completions就能对接,不需要额外装适配层。

前置准备分三步。第一步,去 TaoToken 控制台建一个 API Key,地址是https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite,建完把 Key 复制出来,形如sk-开头的一串。第二步,确认你要用的模型 ID,这个在模型列表或者文档里能查到,比如deepseek-chat这类,具体以你账号下可用的为准。第三步,想清楚 Key 放哪:我建议放%USERPROFILE%\.dsh\.env里,用环境变量引用,而不是直接写死在settings.yaml,这样settings.yaml可以进 Git,.env加进.gitignore就行。

这里有个细节要注意:dsh 的settings.yaml里 provider 配置用的是apiKeyEnv字段,意思是「从这个环境变量名里读 Key」,不是直接填 Key 本身。所以你在.env里写TAOTOKEN_API_KEY=sk-xxx,然后在settings.yaml里写apiKeyEnv: TAOTOKEN_API_KEY,两边名字对上就行。

如果你还想在接入前先验证一下模型通不通,可以先用模型对话页面测一下:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite,确认 Key 和模型 ID 都能用,再往 dsh 里配,能省掉一轮排查。

另外提一句,如果你后面要长期跑编码类 Agent 任务,可以了解下 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite,不过这篇的重点还是先把 dsh 本地跑起来,通道配通。

3. 可复制的 dsh 配置:settings.yaml 与 .env 完整片段

这一节是全文最核心的部分,所有片段都可以直接复制。先装 dsh:

npm install -g @deepseek-ai/dsh

装完验证:

dsh --version where.exe dsh

where.exe dsh应该输出一个路径,通常在%APPDATA%\npm\下面。如果这里报「找不到」,说明 npm 全局 bin 目录不在 PATH 里,把%APPDATA%\npm加进系统环境变量 Path 就行。

接下来配模型通道。先建.env文件,路径%USERPROFILE%\.dsh\.env:

TAOTOKEN_API_KEY=sk-你的TaoToken密钥

注意这个文件不要提交到 Git,建议在项目根目录的.gitignore里加一行.dsh/.env或者直接忽略.env。

然后改settings.yaml,路径%USERPROFILE%\.dsh\settings.yaml。把原来 OpenRouter 那段替换成下面这样:

llm-pi-ai: providers: taotoken: apiKeyEnv: TAOTOKEN_API_KEY api: openai-completions baseURL: https://taotoken.net/api supportsDeveloperRole: false maxTokensField: max_tokens models: - id: deepseek-chat name: DeepSeek Chat agent-default-model: provider: taotoken model: deepseek-chat

几个字段解释一下,避免你改错。apiKeyEnv填的是环境变量名,不是 Key 本身,所以这里写TAOTOKEN_API_KEY,和.env里的变量名一致。api填openai-completions,因为 TaoToken 兼容 OpenAI 的 completions 格式。baseURL填https://taotoken.net/api,注意结尾不要多加/v1,dsh 会自己拼路径,多写了反而 404。models下面id是实际请求时用的模型标识,name是显示名,随便起。agent-default-model指定默认用哪个 provider 和哪个模型,这里指向taotoken和deepseek-chat。

如果你更习惯用 Web UI 配,也可以打开http://127.0.0.1:3080,进 Settings → Models,把 Base URL 填https://taotoken.net/api,API Key 填你的 Key,模型 ID 填deepseek-chat。但 UI 配的不会写进settings.yaml的 provider 段,换机器要重配,所以我更推荐直接改文件。

配完先别急着设自启,手动前台起一次,确认能通:

dsh web --no-open --port 3080

--no-open是不自动开浏览器,--port 3080是指定端口。起来之后另开一个 PowerShell 验证:

curl.exe -sS http://127.0.0.1:3080/ -o NUL -w "HTTP %{http_code}`n"

返回HTTP 200就说明服务在线。然后进 Web UI 发一条消息,看模型能不能正常回。如果这一步就报错,先别往下走,去第 5 节排障。

4. Windows 开机自启:计划任务 + 脚本三件套完整部署

手动起服务能用,但每次重启都要敲命令,不现实。Windows 上做开机自启,最稳的是「计划任务 + 启动脚本」组合。我在%USERPROFILE%\.dsh\下放了三个脚本:start-dsh-web.ps1负责检测和调度,start-dsh-web.cmd负责实际拉起 node 进程,stop-dsh-web.ps1负责停服务。日志统一写到%USERPROFILE%\.dsh\logs\dsh-web.log。

先建日志目录:

New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.dsh\logs"

然后是start-dsh-web.cmd,路径%USERPROFILE%\.dsh\start-dsh-web.cmd:

@echo off setlocal set "NODE=C:\Program Files\nodejs\node.exe" set "DSH=%APPDATA%\npm\node_modules\@deepseek-ai\dsh\lib\bin.js" set "LOG=%USERPROFILE%\.dsh\logs\dsh-web.log" if not exist "%USERPROFILE%\.dsh\logs" mkdir "%USERPROFILE%\.dsh\logs" echo %date% %time% starting dsh web on port 3080>>"%LOG%" "%NODE%" "%DSH%" web --no-open --port 3080 >>"%LOG%" 2>&1

这里NODE路径默认是C:\Program Files\nodejs\node.exe,如果你装 Node.js 时改了路径,这里要跟着改。DSH指向全局 npm 包里的bin.js,路径是%APPDATA%\npm\node_modules\@deepseek-ai\dsh\lib\bin.js,一般不用动。

接着是start-dsh-web.ps1,路径%USERPROFILE%\.dsh\start-dsh-web.ps1:

$ErrorActionPreference = 'SilentlyContinue' $port = 3080 $log = "$env:USERPROFILE\.dsh\logs\dsh-web.log" # 检测端口是否已有服务 $conn = Get-NetTCPConnection -LocalPort $port -State Listen if ($conn) { Write-Host "dsh web already listening on $port" exit 0 } # 校验 node 和 dsh 是否存在 $node = "C:\Program Files\nodejs\node.exe" $dsh = "$env:APPDATA\npm\node_modules\@deepseek-ai\dsh\lib\bin.js" if (-not (Test-Path $node)) { Add-Content $log "node.exe not found"; exit 1 } if (-not (Test-Path $dsh)) { Add-Content $log "dsh bin.js not found"; exit 1 } # 调用 cmd 后台启动 Start-Process -FilePath "$env:USERPROFILE\.dsh\start-dsh-web.cmd" -WindowStyle Hidden

这个脚本干三件事:先看 3080 端口有没有在监听,有就直接退出,避免重复起;再校验 node 和 dsh 文件在不在;最后用Start-Process隐藏窗口调 cmd 脚本。

stop-dsh-web.ps1路径%USERPROFILE%\.dsh\stop-dsh-web.ps1:

Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match '@deepseek-ai\\dsh\\lib\\bin\.js.*web' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }

它按命令行特征匹配 dsh web 的 node 进程,全部结束掉。

三个脚本就位后,注册计划任务。以当前用户执行,不需要管理员也行:

$taskName = 'DeepSeekHarness-Web' $scriptPath = "$env:USERPROFILE\.dsh\start-dsh-web.ps1" Unregister-ScheduledTask -TaskName $taskName -Confirm:$false -ErrorAction SilentlyContinue $action = New-ScheduledTaskAction ` -Execute 'powershell.exe' ` -Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptPath`"" $trigger = New-ScheduledTaskTrigger -AtLogOn -User $env:USERNAME $trigger.Delay = 'PT30S' $settings = New-ScheduledTaskSettingsSet ` -AllowStartIfOnBatteries ` -DontStopIfGoingOnBatteries ` -StartWhenAvailable ` -RestartCount 3 ` -RestartInterval (New-TimeSpan -Minutes 1) Register-ScheduledTask ` -TaskName $taskName ` -Action $action ` -Trigger $trigger ` -Settings $settings ` -Description 'Auto-start DeepSeek Harness web UI on port 3080'

触发条件是用户登录后延迟 30 秒(PT30S),失败重试最多 3 次、间隔 1 分钟。-AllowStartIfOnBatteries和-DontStopIfGoingOnBatteries是笔记本场景下别因为电池就停掉。注册完查状态:

Get-ScheduledTask -TaskName 'DeepSeekHarness-Web' | Select-Object TaskName, State

State 是Ready就对了。想立刻验证,不用重启,手动触发一次:

Start-ScheduledTask -TaskName 'DeepSeekHarness-Web' Start-Sleep -Seconds 5 curl.exe -sS http://127.0.0.1:3080/ -o NUL -w "HTTP %{http_code}`n"

返回 200 说明自启链路通了。日常运维命令也给你备着:启动用powershell -NoProfile -ExecutionPolicy Bypass -File "$env:USERPROFILE\.dsh\start-dsh-web.ps1",停止用stop-dsh-web.ps1,看日志用Get-Content "$env:USERPROFILE\.dsh\logs\dsh-web.log" -Tail 30。升级 dsh 用npm update -g @deepseek-ai/dsh,升完记得重启服务。

5. 常见报错排查:401、EADDRINUSE、开机没起来、模型不响应

这一节按真实报错来,你遇到哪个对哪个。

401 Unauthorized / invalid api key。这个基本是 Key 的问题。先确认.env里TAOTOKEN_API_KEY的值没有多余空格和引号,然后确认settings.yaml里apiKeyEnv写的是TAOTOKEN_API_KEY而不是别的名字。还有一个容易漏的点:dsh 读.env是在启动时读的,你改了.env必须重启服务才生效,光刷新 Web UI 没用。重启命令就是先stop-dsh-web.ps1再start-dsh-web.ps1。如果还报 401,去 TaoToken 控制台确认 Key 没过期、没被禁用。

EADDRINUSE: address already in use 127.0.0.1:3080。说明 3080 已经有实例在跑。先停再起:

powershell -NoProfile -ExecutionPolicy Bypass -File "$env:USERPROFILE\.dsh\stop-dsh-web.ps1"

如果停了还报,可能是别的进程占了 3080,查一下:

Get-NetTCPConnection -LocalPort 3080 -State Listen | Select-Object OwningProcess Get-Process -Id <上面查到的PID>

确认是无关进程就换端口,启动命令里--port改成 3081 之类,同时计划任务里的端口也要跟着改。

开机后没自动起来。按顺序查:先看计划任务状态Get-ScheduledTask -TaskName 'DeepSeekHarness-Web' | Select-Object TaskName, State,如果是Disabled就Enable-ScheduledTask。再看日志Get-Content "$env:USERPROFILE\.dsh\logs\dsh-web.log" -Tail 50,日志里通常会写清楚是 node 找不到还是 dsh 找不到。最常见的原因是 Node.js 装在非默认路径,start-dsh-web.cmd里的NODE变量还指着C:\Program Files\nodejs\node.exe,改一下就行。还有一种情况是登录延迟 30 秒还没到你就去看,等一会儿再看。

模型不响应 / reading choices 报错。这类通常是settings.yaml里 provider 或 model 名字对不上。检查agent-default-model里的provider是不是taotoken,model是不是和models列表里的id一致。另外baseURL结尾别多写/v1,写https://taotoken.net/api就行。改完settings.yaml同样要重启服务。如果还不行,去 Web UI → Settings → Models 里重新选一次模型,有时候 UI 里缓存了旧配置。

local proxy failed 类报错。这种一般是网络层的问题,先确认本机能正常访问https://taotoken.net/api,用curl.exe -sS https://taotoken.net/api -o NUL -w "HTTP %{http_code}n"` 测一下。如果这里就不通,那是网络环境的事,跟 dsh 配置无关。如果通,再回头看 dsh 的 baseURL 有没有写错。

排障的时候有个通用技巧:先手动前台起dsh web --no-open --port 3080,报错会直接打在终端上,比翻日志快。确认能起来再交给计划任务。

6. 接入文档与 Key 管理入口

配置和自启都跑通之后,日常要动的其实就两件事:Key 和模型 ID。Key 在 TaoToken 控制台管理,地址https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite,换 Key 或者加 Key 都在这里。换完记得同步更新%USERPROFILE%\.dsh\.env里的TAOTOKEN_API_KEY,然后重启 dsh 服务。

接口细节和参数说明看接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,里面会写清楚 baseURL、鉴权方式、模型列表这些。dsh 这边只要api填openai-completions、baseURL填https://taotoken.net/api,剩下的按文档对就行。

如果你用的是 Claude Code 这类工具,TaoToken 也有对应的接入方式,文档在https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude-code-anthropic&utm_campaign=rewrite,思路和 dsh 一样,都是把 baseURL 和 Key 指过来。dsh 这边配好之后,settings.yaml里那套 provider 写法其实可以复用到别的兼容 OpenAI 格式的工具上,改改apiKeyEnv和baseURL就行。

最后留一个我自己的习惯:把%USERPROFILE%\.dsh\整个目录做个备份,尤其是settings.yaml和三个自启脚本。换机器的时候,装完 Node.js 和 dsh,把目录拷过去,重新注册一次计划任务,五分钟就能恢复。.env单独存,别跟着目录一起传。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询