文章目录
一、先搞清楚:网页版 vs 本地 DSH,区别到底是什么?
很多人(包括我一开始)有个误解:装了 DSH 是不是就在本地跑大模型了?
不是。 DSH 本质是一个本地客户端框架,模型推理仍然在云端:
| | DeepSeek 官方网页/App | 本地 DSH |
|---|---|---|
| 程序跑在哪 | DeepSeek 公司的服务器 | 你自己的电脑(Node.js 后端) |
| 数据存在哪 | DeepSeek 服务器(对话、上传的文件) | 本地硬盘(C:\Users\xxx\.dsh 或你指定的目录) |
| 模型选择 | 只能用 DeepSeek 官方提供的 | 可接 OpenAI、Claude、Gemini、本地 Ollama 等几十家 |
| 系统提示词 | 不能改 | 完全自定义 |
| 插件/扩展 | 没有 | 丰富的社区插件生态 |
| 隐私 | 数据上传给第三方 | 对话历史本地存储,只有 API 请求发出去 |
一句话总结:官方是"用别人的软件",DSH 是"自己搭一个可定制的客户端"。你的 API Key 还是调用 DeepSeek 的模型,但整个交互层在你本地。
二、环境准备:先把地基打好
1. Node.js 便携版
我使用的是便携版 Node.js,解压到:
D:\Program Files\Portable\Nodejs
为什么用便携版? 重装系统后不需要重新安装,直接设 PATH 就能用。
2. 先配置 npm 全局路径(关键!)
安装任何东西之前,先确认 npm 的全局安装路径是否在环境变量里。否则装完 dsh 命令会找不到。
#查看当前全局路径 npm config get prefix
输出:D:\Program Files\Portable\Nodejs
添加到用户 PATH(永久生效)
$npmGlobal = "D:\Program Files\Portable\Nodejs"
"Path",
([Environment]::GetEnvironmentVariable("Path", "User") + ";$npmGlobal"),
"User")
刷新当前窗口
$env:Path = [Environment]::GetEnvironmentVariable("Path", "User") + ";" +
[Environment]::GetEnvironmentVariable("Path", "Machine")
3. 配置 npm 国内源(加速安装)
设为淘宝镜像(或你喜欢的国内源)
npm config set registry https://registry.npmmirror.com
验证
npm config get registry
如果你用 pnpm(DSH 内部用 pnpm 管理插件),也顺手设一下:
pnpm config set registry https://registry.npmmirror.com
三、安装 DSH:千万别用 npx!
我一开始踩的坑:
❌ 错误!这是临时运行,跑完就消失
npx @deepseek-ai/dsh web
npx 的作用是临时下载并执行,不会在本地留下 dsh 命令。关闭窗口后,你的配置虽然还在,但程序本体没了,下次打不开。
正确做法:全局安装
powershell
npm install -g @deepseek-ai/dsh
装完后会在 D:\Program Files\Portable\Nodejs\ 下生成 dsh.cmd,以后任何位置直接打 dsh 就能用。
解决 PowerShell 执行策略
如果报错"无法加载文件...因为在此系统上禁止运行脚本":
powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
四、提前规划数据目录(避免后期迁移踩坑)
这是本文最核心的经验。
DSH 默认把数据存在 C:\Users\<用户名>\.dsh。但这里有两个问题:
1. 系统重装会清空 C 盘
2. pnpm 使用大量符号链接(symlink),普通复制工具(如 robocopy)会把它"展开"成真实文件夹,导致 DSH 启动时连环报错
正确顺序:先建目录、设环境变量,再装插件。
```powershell
1. 创建 D 盘数据目录
New-Item -ItemType Directory -Path "D:\AppData.dsh" -Force
New-Item -ItemType Directory -Path "D:\AppData.codex" -Force
2. 设置 DSH_HOME 环境变量(永久)
$env:DSH_HOME = "D:\AppData.dsh"
3. Codex 桌面版不支持环境变量,只能建 Junction(目录联接)
cmd /c mklink /J "C:\Users\$env:USERNAME.codex" "D:\AppData.codex"
```
为什么 Codex 用 Junction,DSH 用环境变量?
- DSH 官方原生支持DSH_HOME,直接改读取路径,最干净
- Codex Windows 桌面版硬编码读取%USERPROFILE%\.codex,不支持环境变量,只能用 Junction 做透明转发
五、安装插件:从毛坯房到精装房
DSH 官方只提供核心框架,所有功能扩展都来自社区插件。以下是我筛选后的"最小必要集":
| 插件 | 功能 | 安装命令 |
|------|------|----------|
| dshmarket | 可视化插件市场,以后装插件不用敲命令 | dsh plugin --profile web add dshmarket |
| @liustack/modlens | 视觉识图,支持 15+ 视觉引擎 | dsh plugin --profile web add @liustack/modlens |
| @liustack/modsearch | 联网搜索,补上没有实时信息的短板 | dsh plugin --profile web add @liustack/modsearch |
| dsh-at-file | 输入 @ 引用工作区文件 | dsh plugin --profile web add github:omdsh-dev/dsh-at-file |
| @linxin666/dsh-web-ui-all | UI 全家桶(任务看板、SSH 面板、皮肤中心、Git 图谱等) | dsh plugin --profile web add @linxin666/dsh-web-ui-all |
| dsh-notification | 桌面通知,长任务跑完自动提醒 | dsh plugin --profile web add github:omdsh-dev/dsh-notification |
| dsh-custom-tool | 自定义 JS 工具,Agent 可直接调用 | dsh plugin --profile web add github:omdsh-dev/dsh-custom-tool |
| dsh-annotation | 文本批注,选中段落让 AI 逐条修改 | dsh plugin --profile web add github:omdsh-dev/dsh-annotation |
重要提醒:这些插件全部来自社区(liustack、linxin666、omdsh-dev 等),不是 DeepSeek 官方维护。你的 API Key 会流经这些插件调用的第三方服务,请自行评估信任度。
启动 DSH
powershell
dsh web
浏览器自动打开 http://127.0.0.1:3080,在设置页里填入你的 API Key 即可开始使用。
六、关于识图:为什么 DeepSeek API 不够?
DeepSeek 官方 API(V3/R1)是纯文本模型,本身不能直接读图片。
你装的 modlens 识图时,不是调用 DeepSeek 官方 API,而是调用你配置的其他视觉模型:
- Google Gemini(有免费额度)
- Claude 3.5 Sonnet
- OpenRouter(聚合平台,一个 Key 通吃多家)
- 硅基流动(SiliconFlow,国内稳定)
- 本地 Ollama +
llava模型
流程是:你贴图 → 视觉插件把图发给 Gemini/Claude → 拿到文字描述 → 再把描述 + 你的问题一起发给 DeepSeek 回答。
所以你需要至少两个 Key:一个 DeepSeek(对话),一个视觉模型(识图)。
七、架构总结
最终我的环境架构如下:
| 组件 | 位置 | 机制 |
|------|------|------|
| Node.js + DSH 本体 | D:\Program Files\Portable\Nodejs | 便携版,重装后无需重装 |
| DSH 数据/配置/插件 | D:\AppData\.dsh | DSH_HOME 环境变量 |
| Codex 数据 | D:\AppData\.codex | Junction → C:\Users\...\.codex |
| pnpm 包仓库 | D:\Program Files\pnpm-store | pnpm config store-dir |
八、重装系统后的一键恢复
我编写了一个 PowerShell 脚本,重装系统后只需运行一次:
```powershell
restore-dsh.ps1
要求:以管理员身份运行
$NodeJsPath = "D:\Program Files\Portable\Nodejs"
$DshDataPath = "D:\AppData.dsh"
$CodexDataPath = "D:\AppData.codex"
$PnpmStorePath = "D:\Program Files\pnpm-store"
1. 检查数据完整性
if (-not (Test-Path $DshDataPath)) { throw "DSH 数据不存在" }
if (-not (Test-Path $CodexDataPath)) { throw "Codex 数据不存在" }
2. 设置环境变量
[Environment]::SetEnvironmentVariable("DSHHOME", $DshDataPath, "User")
$env:DSHHOME = $DshDataPath
3. 添加 Node.js 到 PATH
$currentPath = [Environment]::GetEnvironmentVariable("Path", "User")
if ($currentPath -notlike "$NodeJsPath") {
[Environment]::SetEnvironmentVariable("Path", "$currentPath;$NodeJsPath", "User")
}
4. 重建 Codex Junction
$codexJunction = "C:\Users\$env:USERNAME.codex"
cmd /c mklink /J "$codexJunction" "$CodexDataPath"
5. 设置 pnpm store
pnpm config set store-dir "$PnpmStorePath"
Write-Host "恢复完成!运行 'dsh web' 启动。"
```
脚本特性:
- 自动检测用户名是否变更,若变更则输出手动执行清单
- 若 D 盘数据路径变化,只需修改脚本顶部配置项

九、常见问题
Q:DSH 关闭 PowerShell 窗口后还能用吗?
A:不能。dsh web 启动的是本地后端服务器,关闭窗口等于关机。如需后台运行,可使用 pm2 等进程守护工具。
Q:Codex 的 .codex 文件夹为什么不用 CODEX_HOME 环境变量?
A:Codex CLI 支持 CODEX_HOME,但 Windows 桌面版硬编码读取 %USERPROFILE%\.codex,不支持环境变量,只能用 Junction。
Q:pnpm store 可以删掉吗?
A:不可以。它是 pnpm 的"中央仓库",DSH 的插件通过硬链接引用这里的包。删掉后插件会全部失效。
Q:为什么一开始不能用 robocopy 直接复制 .dsh?
A:pnpm 的 node_modules 包含大量符号链接,robocopy 默认会把它"展开"成真实文件夹。DSH 启动时检查发现 symlink 变成了真实文件夹,就会报错。正确做法是设 DSH_HOME 让 DSH 自己去 D 盘读写,或者复制时加 /SL 参数保留链接。
本文基于 DeepSeek Harness 实际配置经验整理,环境为 Windows 11 + VMware ESXi 虚拟机。
文章评论