FIELD GUIDE · 12

DeepSeek Harness 常见问题与报错排查

DSH 出问题时,最忌讳的做法是看到一个报错,就同时去改模型、权限、profile(配置档案)、插件、工作区和 MCP——这样即使恢复了,也很难说清到底是哪一层出了问题。本篇是 Learn 的总排错入口:先把故障拆成八层,从最后一个正常层向下定位第一个异常层,一次只改一个变量。内容基于官方文档整理,基线 DSH 0.1.1-rc.2,DSHOPC 尚未实测。

直接答案

先把故障按八层定位:Node 环境 → 启动 / Web 服务 → 模型 / 凭据 → 工作区 / 权限 → profile / 插件 → 技能 → MCP → 最后恢复手段。找到最后一个正常层,再检查它的下一层,每次只改一处,并用明确测试验证恢复。
本篇目录

DSHOPC 建议先把故障分成八层,排错原则只有一句:先找最后一个正常层,再检查下一个异常层。

  1. Node.js / 本机环境
  2. DSH 启动 / Web 服务
  3. 模型 / 凭据
  4. 工作区 / 会话 / Agent 预设 / 权限
  5. profile / 配置 / 插件
  6. skill(技能)
  7. MCP
  8. 最后恢复手段

举一个例子:Web UI 能打开、普通模型聊天正常、工作区正常、只有文件读取失败——这时不应该先重装 DSH。因为前面几层已经证明安装、Web 服务、模型链路基本正常,此时应该优先检查的是工作区、Agent 预设、权限和工具调用。

示意图
01排错主线只有一条:逐层定位、一次只改一处、每层都用明确测试验证,最后再考虑恢复手段(第一步的快速症状索引在本文末尾,可直接跳转)。

按报错信息速查

  1. command not found: nodeNode 未安装、版本过低,或 PATH 指向旧版本,先解决 Node 环境跳到详解小节 ↓
  2. dsh plugin 报 pnpm 不存在插件管理会把参数转发给 pnpm,先确认 pnpm -v 本身可用跳到详解小节 ↓
  3. 3080 端口被占用先用 --port 3081 换端口验证,把故障限制在端口占用层跳到详解小节 ↓
  4. EACCES(权限相关端口错误)换一个普通高位端口验证,不要第一步就提权运行跳到详解小节 ↓
  5. MISSING_CREDENTIAL当前模型提供方缺可用凭据,逐项确认密钥与环境变量跳到详解小节 ↓
  6. UNKNOWN_MODEL当前模型 ID 不在提供方配置里,重新选择一个明确存在的模型跳到详解小节 ↓
  7. 获取模型列表返回 401检查 API 密钥、地址与凭据权限;部分服务本就不提供 GET /models跳到详解小节 ↓
01 / RUNTIME

Node.js、npm、npx 或 pnpm 有问题

如果 DSH 连启动阶段都没到,先从本机环境查起。

症状:node 找不到

终端提示 command not found: node,Windows 下则是 'node' 不是内部或外部命令。先运行 node -v:当前 DSH 0.1.1-rc.2 对 Node.js 的要求是 ^22.19.0 || >=24.0.0。如果 Node 未安装、版本过低,或 PATH(系统查找可执行程序的环境变量)指向旧版本,都要先解决 Node 环境。

怎么确认修好了?

详细安装流程见《DeepSeek Harness 安装与启动教程》(/deepseek-harness/install/)。

症状:npx 可以用,但 dsh plugin 报 pnpm 不存在

插件管理和普通启动不是同一路径:dsh plugin --profile <name> ... 会把后面的参数转发给 pnpm。所以先运行 pnpm -v。如果找不到 pnpm,这是插件管理环境的问题,不是插件本身已经坏了。

怎么确认修好了?

详细见《DeepSeek Harness 插件教程》(/deepseek-harness/plugins/)。

症状:终端里明明装了 Node,换一个终端却找不到

这通常属于 PATH / Shell 环境不一致。先确认 which node,Windows PowerShell 可以用 Get-Command node。如果不同终端解析到了不同位置,先统一 Node 环境,再排 DSH。

02 / WEB SERVICE

DSH 启动失败、Web UI 打不开或端口冲突

如果 Node 环境没问题,下一层看 DSH 进程和 Web 服务。

症状:执行启动命令后进程立刻退出

TERMINAL
npx @deepseek-ai/dsh web

不要只看浏览器,先看终端有没有明确错误。常见故障范围包括:

  • profile 配置错误
  • 插件模块解析失败
  • 配置 schema 错误
  • 端口问题
  • 新 Bundle 启动失败

症状:终端进程还在,但浏览器没有自动打开

这不等于 DSH 启动失败。当前默认 Web UI 地址是 http://127.0.0.1:3080,可以手动在浏览器打开。如果你使用了 npx @deepseek-ai/dsh web --no-open,本来就不会自动打开浏览器;SSH 环境下 DSH 也可能主动跳过本机浏览器交接。

怎么确认修好了?

症状:3080 端口被占用

可以先换端口验证:

TERMINAL
npx @deepseek-ai/dsh web --port 3081

然后打开 http://127.0.0.1:3081。如果换端口后正常,说明故障更可能在原端口占用,而不是整个 DSH 安装。

怎么确认修好了?

症状:看到 EACCES、权限相关端口错误

先做最小检查:换一个普通高位端口,例如 npx @deepseek-ai/dsh web --port 3081。如果恢复正常,就把故障限制在监听端口 / 系统权限层。

症状:想用 --host 0.0.0.0 但启动失败

当前 CLI 有意不支持 --host 0.0.0.0,所以这不是「你的系统网络坏了」,而是当前产品行为。远程访问属于部署 / 网络架构问题,不要把改 host 当作普通的本地启动排错步骤,应当单独设计。

03 / MODEL

模型、API 密钥、自定义 API 报错

如果 Web UI 已经正常打开,但发消息失败,进入模型层。

症状:MISSING_CREDENTIAL

  • 当前选的是哪个提供方
  • API 密钥是否已经保存
  • 该提供方是否依赖环境变量
  • 环境变量是否真的存在

怎么确认修好了?

详细见《DeepSeek Harness 模型配置教程》(/deepseek-harness/models/)。

症状:UNKNOWN_MODEL

第一检查点:当前选中的模型 ID 是否还存在于当前提供方配置。尤其是删除过提供方、改过模型 ID、更新过自定义模型目录以后,容易出现这类问题。

怎么确认修好了?

症状:获取模型列表返回 401

优先检查 API 密钥、API 地址,以及当前服务是否允许这个凭据访问模型列表。但要注意:有些兼容服务本身就不提供 GET /models,所以获取不到列表不等于一定不能调用模型。如果服务文档明确给出了模型 ID,可以手动添加再验证请求。

症状:普通聊天成功,但智能体工具调用失败

这是非常重要的分层点:普通聊天成功,不代表工具调用一定兼容。自定义 OpenAI 兼容端点可能在 developer 角色、token 字段、工具协议或其他请求字段上存在差异。不要因为「模型回答你好没问题」,就直接判断 DSH 智能体已经完全兼容。

怎么确认修好了?

症状:刚改模型配置,但旧会话表现没变化

模型设置要区分「新请求 / 新会话」和「已经有历史的会话」:已有会话可能保留自身日志里的模型信息。排错时,新建一个干净会话更容易确认当前配置。

04 / AGENT LAYER

工作区、会话、Agent 预设、权限或工具调用异常

如果 Web UI 正常、模型能回答,但智能体做不了真实任务,重点看这一层。

症状:输入框不能正常开始任务

先检查有没有选择工作区。当前全新 Web UI 在没有选中工作区时,不能正常开始普通会话任务。选择一个明确的测试工作区即可,不要第一反应改模型。

症状:智能体说「找不到文件」

先确认三件事:

  1. 当前 Web UI 选中的工作区
  2. 文件是否真的在该工作区
  3. 文件名 / 路径是否正确

你可以在终端独立确认文件是否存在:

TERMINAL
node -e "console.log(require('fs').existsSync('目标文件'))"

如果输出 false,那问题先在路径 / 工作区,而不是智能体的推理能力。

症状:模型回答了,但没有任何工具调用

检查当前 Agent 预设是否拥有对应工具。例如极简模式,当前就没有标准模式那套完整的技能、网页检索、计划、子代理等能力。第一次排错建议使用标准模式,减少变量。详细见《DeepSeek Harness Agent 预设怎么选?》(/deepseek-harness/agent-modes/)。

症状:会话开始后找不到切换 Agent 预设的入口

这是当前的生命周期设计:Agent 预设在会话开始时固定,设置页修改的是后续新建会话的默认预设。如果当前任务确实需要换预设,就新建会话,不要把它当成 UI Bug。

症状:设置页改了权限,但当前会话没变化

设置中的权限主要控制后续新建会话的默认权限;当前会话的权限仍然可以单独调整。记住二者区别:Agent 预设开始后固定,权限在当前会话内仍可调整,不要混淆。

症状:一直卡在「等待审批」

先检查审批内容:智能体到底请求什么操作。如果操作合理且属于当前任务,再判断是否允许;如果明显无关,不要为了让流程继续而盲目批准。

症状:开启 Full access 后问题「好了」

这并不能直接说明原来是 DSH Bug,更可能说明原任务受到了权限 / 审批边界的限制。正确做法是找到具体是哪一项操作被拦住,而不是长期用 Full access 掩盖权限设计问题。

怎么确认这一层修好了?

05 / PROFILE & PLUGIN

profile、配置或插件导致异常

如果问题发生在安装 / 更新 / 删除某个插件或修改 profile 配置之后,优先看这一层。

症状:插件命令执行成功,但能力没出现

先运行:

TERMINAL
npx @deepseek-ai/dsh --profile web --dump-config

检查对应 Bundle 层有没有进入 profile。依赖安装成功,不等于已经成为 DSH 配置层:如果包里没有 dsh.bundle 字段,它可能只是普通依赖。

症状:dump-config 能看到插件,但当前 Web UI 还是旧能力

如果你刚刚安装、更新或删除过 Bundle,记住:正在运行的 profile 不会热切换 Bundle 集合。需要:

  1. 停止当前 DSH
  2. 重新启动对应 profile
  3. 再验证能力

症状:刚装插件,重启以后 DSH 起不来

这时不要同时改十个东西。先记录插件包名、版本 / Commit、DSH 版本和错误日志,然后运行 npx @deepseek-ai/dsh --profile web --dump-config 检查新增的层。如果问题明显从这个插件变化开始,优先回退最后一个变化。

最小回退

TERMINAL
npx @deepseek-ai/dsh plugin --profile web remove <package>
TERMINAL
npx @deepseek-ai/dsh --profile web --dump-config

确认对应层消失后,再用 npx @deepseek-ai/dsh web 启动。如果基线恢复,问题与该变化高度相关。

症状:GitHub 插件安装卡在 prepare / allowBuilds

这通常是 pnpm ≥10 阻止了 Git 依赖安装阶段的构建脚本。

症状:改 cordis.patch.yml 后行为异常

先不要继续叠更多 patch,运行 npx @deepseek-ai/dsh --profile web --dump-config 理解最终组合。当前 patch 的一个关键边界是:对目标行的 config 是整体替换,不是只深度合并你写的某一个键。所以如果你只重写了这样的片段:

YAML
config:
someField: value

就可能把原来那一行里其他必需配置一起替掉。这是 profile / patch 层的问题。

06 / SKILL

skill(技能)不被发现、不生效或不自动调用

如果问题只发生在技能上,不需要先重装插件。

症状:新建技能后完全识别不到

先检查路径。项目级优先位置是 <projectRoot>/.dsh/skills,例如 .dsh/skills/seo-audit/SKILL.md。确认:

  • SKILL.md 直接在 skill 根下一层
  • 没有套很多级目录
  • name 是 kebab-case(小写短横线命名)
  • frontmatter 格式正确

当前不支持任意 **/SKILL.md 深度递归发现。

症状:项目级技能没有覆盖用户级同名技能

当前本地 rank(来源优先级数值,低者优先)如下:

来源rank
project-dsh100
project-agents200
custom300
user-dsh400
user-agents500
bundled600

如果实际没有按预期生效,检查当前项目根:它通常取最近的 .git 祖先目录,没有 .git 时才回退到当前 cwd(工作目录)。

症状:/name 显式调用失败

检查三件事:skill 是否被发现;名称是否完全一致;是否设置了 user-invocable: false

YAML
user-invocable: false

如果用户入口被关闭,/name 本来就不会调用。

症状:显式 /name 成功,但自然语言不自动调用

这不等于 skill 无效,反而说明技能本身的发现与加载链路可能正常。此时优先优化 name、description,以及任务描述与技能范围的匹配度。当前模型目录主要看到 name + description,所以不要把关键路由信息只写在正文里。

症状:模型从来不看到这个技能

检查 frontmatter 是否开启了 disable-model-invocation: true——开启后这个 skill 不会进入模型可调用目录。另外还要检查当前 Agent 预设是否包含 skill 工具:极简模式就不是标准模式那套完整技能组合。

怎么确认技能修好了?

07 / MCP

MCP 连接失败、工具不出现或调用超时

MCP(Model Context Protocol,模型上下文协议)的错误最容易被一句「MCP 连不上」混在一起。实际上至少有五层:

OUTPUT
配置
→ 连接
→ 工具发现
→ 工具调用
→ 外部真实结果

症状:加了 MCP 配置,但完全没看到工具

第一步:

TERMINAL
npx @deepseek-ai/dsh --profile web --patch ./mcp-test.patch.yml --dump-config

确认四件事:MCP Client 插件行存在;serverName 正确;Transport(传输方式)正确;command / url 正确。如果配置根本没进入组合,先别急着查 Server。

症状:Web UI 正常打开,但 MCP 工具不存在

注意当前默认 failOnStartupError: false,所以 MCP 初始连接失败时不一定让整个 DSH 启动失败。也就是说,Web UI 能打开不等于 MCP 成功,要继续看启动日志和 Tools 发现情况。

症状:stdio MCP 启动失败

检查 command 本身能不能在终端执行。比如配置了 command: node,就先确认 node -v;配置了 command: npx,就先确认 npx 和目标包可用。

症状:HTTP MCP 连接失败

逐项检查:

  • URL
  • 网络
  • Header
  • Token
  • Server 是否真的在线
  • Server 是否支持当前 MCP Transport

不要先把问题归到 DSH 模型层。

症状:MCP 工具出现了,但调用超时

当前默认 toolCallTimeoutMs = 60000,也就是 60 秒。先确认:Server 有没有收到请求;外部 API 有没有响应;工具本身是不是卡住。

症状:MCP Server 崩了以后没恢复

当前 MCP Client 默认会自动重连,但重连有失败预算,不是永久保证。连续失败达到上限后,工具会被注销并停止继续恢复。先修复 Server,再重新加载或重启,并确认工具重新出现。完整参数和生命周期见《DeepSeek Harness MCP 教程:连接外部工具》(/deepseek-harness/mcp/)。

症状:改了 serverName 后原工具名全变了

这是预期行为。公开工具名来自 mcp__<serverName>__<rawName>,所以改 serverName 就会改变智能体看到的工具命名空间。如果只是调整连接参数,尽量保持 serverName 稳定。

症状:MCP Server 支持 Resources / Prompts,但 DSH 里看不到

怎么确认 MCP 修好了?

08 / RECOVERY

什么都试过了,还没恢复怎么办?

到这里才考虑更重的恢复手段。顺序仍然是:备份 → 最小回退 → 重建基线,而不是直接清空所有状态。

先记录当前环境

至少记录以下字段:

  • DSH 版本
  • Node.js
  • 系统
  • 启动命令
  • profile
  • Agent 预设
  • 模型
  • 最后一次正常时间
  • 最后一个改动
  • 完整错误

如果问题与插件 / MCP 有关,再加三项:插件版本 / Commit、MCP Server 版本、Transport。这些信息决定后面能不能复现。

先确认「最小基线」还能不能跑

建立一个新的空测试目录,运行:

TERMINAL
npx @deepseek-ai/dsh web

不要先加自定义 patch、新 MCP、新插件或复杂工作区。然后按这条链路验证:

OUTPUT
Web UI
→ 官方模型
→ 标准模式
→ 测试工作区
→ 随机文件读取

如果这个最小基线能跑,原问题大概率属于附加配置 / 项目 / 插件 / MCP 层;如果最小基线也失败,再回到安装、模型和 profile 基础层。

手工修改配置前先备份

删除整个 ~/.dsh 应该是最后手段

如果最终确实要重建 Harness home,按这个顺序:

  1. 先完整备份
  2. 记录版本和错误
  3. 明确这是最后恢复实验
  4. 重建后只恢复一项配置
  5. 每恢复一项就测试一次

不要用 Full access 作为最后恢复方案

Full access 是权限模式,不是修复损坏配置、模型协议、MCP Server 或插件兼容性的工具。如果开 Full access 后某一步能执行了,只能说明权限边界发生变化。它不能修复这些问题:UNKNOWN_MODEL、Bundle 启动错误、技能路径错误、MCP Server 离线、Node 版本错误。

什么时候应该进入 Lab,而不是继续猜?

如果你已经做到:记录环境、能稳定复现、换回基线正常、加上某个插件 / MCP / 配置就必现——这就已经不是简单的 Learn 排错了,应该进入 Lab 做完整验证:

OUTPUT
基线
→ 加一个变量
→ 复现
→ 回退
→ 再复现

最终才能判断:当前版本兼容或不兼容、某操作系统特有、某配置冲突、第三方项目问题,或者 DSH 本身可能存在 Bug。

STEP

快速症状索引

示意图
02先用这张地图确认症状属于哪一层,再去下面的症状索引表或对应小节查具体排查步骤。
症状优先检查
node 找不到Node / PATH
pnpm 找不到插件管理环境
DSH 一启动就退出启动日志 / profile / 新插件
浏览器没自动打开手动访问 127.0.0.1:3080
3080 打不开进程 / 端口
MISSING_CREDENTIAL模型凭据
UNKNOWN_MODEL模型 ID / 提供方
能聊天,不能调用工具模型兼容 / Agent 预设 / 权限
输入框不能开始工作区
读不到文件工作区 / 路径 / 工具 / 权限
Agent 预设不能切已开始会话预设固定
插件装了没能力dump-config / Bundle
插件更新后没变化重启 profile
技能 /name 不识别路径 / name / user-invocable
技能不自动触发description / 模型路由
MCP Web UI 能开但没工具初始连接 / tools/list
MCP 调用超时Server / 外部 API / 60 秒超时
MCP 重连最后停止重连预算耗尽
STEP

怎样算一次排错真正完成?

不要用「现在好像没报错了」作为结束标准。至少要做到:

  1. 知道故障属于哪一层
  2. 知道你改了什么
  3. 能说明为什么这个修改与故障有关
  4. 使用明确测试确认恢复
  5. 没有为了恢复破坏无关配置

例如一条合格的排错记录长这样:

OUTPUT
症状:
MCP 工具不出现

定位:
HTTP MCP Token 环境变量未传入

修改:
正确设置 MCP_TOKEN

验证:
工具重新发现
+ mcp__example__get_status 出现
+ 真实工具调用返回可核对结果

这才是一条可复现、可验证的排错记录。

STEP

页面分流

如果已经定位到具体层,就不要一直停留在这篇总入口,直接进入对应教程:

问题域对应教程
安装 / 启动安装与启动教程(/deepseek-harness/install/)
第一次完整智能体闭环第一次使用(/deepseek-harness/first-run/)
模型 / API模型配置教程(/deepseek-harness/models/)
工作区 / 会话 / 权限 / 轨迹Web UI 使用指南(/deepseek-harness/web-ui/)
Agent 预设Agent 预设怎么选?(/deepseek-harness/agent-modes/)
profileProfile 是什么?(/deepseek-harness/profile/)
插件插件教程(/deepseek-harness/plugins/)
技能技能教程(/deepseek-harness/skills/)
MCPMCP 教程(/deepseek-harness/mcp/)
STEP

DSHOPC 排错框架小结

以下属于 DSHOPC 的分析建议,供参考:

  • 按故障层级排查,而不是一次修改多个变量
  • 用「最后一个正常层」缩小范围
  • 每次修复都要求明确的 Verification(验证)
  • 插件和 MCP 采用分层验证
  • 自动路由失败与 skill 本身失效分开判断
  • Full access 不作为万能修复
  • 删除整个 Harness home 只作为备份后的最后恢复手段

SOURCES

DSHOPC 是独立社区项目,与 DeepSeek 不存在隶属、授权或背书关系。