· Jeff · 教程  · 12 分钟阅读

DeepSeek Harness(dsh)上手实测:官方开源的 Agent 框架,一条命令跑起来

DeepSeek 官方开源了自己的 Agent 框架 DeepSeek Harness(dsh)——「一切皆插件」,自带 Web UI,一条命令就能在本地跑起一个能读写文件、执行命令、委派子任务的智能体。这篇是我从安装到跑通第一个任务的完整记录,含 CLI 速查、Profile 机制、模型配置和踩坑表。

DeepSeek 官方开源了自己的 Agent 框架 DeepSeek Harness(dsh)——「一切皆插件」,自带 Web UI,一条命令就能在本地跑起一个能读写文件、执行命令、委派子任务的智能体。这篇是我从安装到跑通第一个任务的完整记录,含 CLI 速查、Profile 机制、模型配置和踩坑表。

DeepSeek Harness(dsh)上手实测:官方开源的 Agent 框架,一条命令跑起来

DeepSeek 除了模型,还开源了一个 Agent 框架:DeepSeek Harness,命令名 dsh。它不是又一个「聊天壳子」,而是把 Agent 拆成了可插拔的插件集合——模型、界面、工具、工作流各自是插件,按 profile 组合起来启动。

我装了一遍跑通了第一个任务,把过程整理成这篇。适合已经用过 Claude Code / Codex 这类工具、想看看 DeepSeek 官方这套怎么玩的人。

版本基线:@deepseek-ai/dsh v0.1.0-rc.6 | 项目状态:开发者预览(developer preview),迭代很快,不排除破坏性变更 | 实测环境:Linux + Node 22

一、它和别的 Agent 框架有什么不同

三个设计点值得先讲清楚,理解了这三条,后面的命令就都顺了:

设计含义实际影响
一切皆插件功能都以 plugin 形式组织,按需组合想要什么能力就装什么插件,不必背一整套全家桶
Cordis 架构驱动底层是「时空可组合」的组合式框架配置是可叠加的补丁层,能 dump 出来检查
Profile 启动器dsh 本身只是启动器同一份安装可以拉出 Web UI / headless / TUI 等不同工作环境

用一句话概括:dsh 不提供「一个固定产品」,它提供的是一套启动方式,你决定这次要拉起来什么。

二、安装:两条路,推荐全局装

环境要求很简单,Node.js 22 LTS 及以上即可:

node --version
npm --version

临时试一下(不装)

npx @deepseek-ai/dsh web

全局安装(推荐,后续命令都能直接敲)

npm install -g @deepseek-ai/dsh
dsh --version
# 输出示例:0.1.0-rc.6

国内网络如果卡在下载,先换源再装:npm config set registry https://registry.npmmirror.com

三、跑起来:Web UI 三步走

dsh web

终端会打印访问地址,默认 http://127.0.0.1:3080,浏览器打开就能用。常用参数:

dsh web --port 8080                 # 换端口
dsh web --host 0.0.0.0              # 监听所有网卡(局域网可访问,注意安全)
dsh web --trusted-host myhost:8080  # 额外放行的 /api 信任域,可重复

--port 0 会让系统随机分配一个空闲端口。

进界面之后只需要三步:

  1. 配模型 —— Settings → Models,在 DeepSeek 卡片里填 API Key 保存。保存即生效,不用重启。Key 是只写存储,页面只显示脱敏信息。
  2. 选工作区 —— 点 Choose workspace,把项目目录加进来并选中。dsh 默认以启动命令所在目录为文件系统根;没选工作区之前,会话编辑器是灰的,这点新手最容易卡住。
  3. 发任务 —— 新建会话,直接下指令,比如「总结这个仓库并列出主要包」。它会读写工作区文件、执行命令、拆子任务、维护执行计划;遇到需要审批的操作会先问你。

如果只是想在脚本或 CI 里跑一次性任务,用 headless 模式,出结果就退出:

dsh --profile headless "run the tests"

四、CLI 速查

dsh --help       # 启动器自身的帮助
dsh --version    # 版本号

入口模式:

命令用途
dsh --profile <name>启动 $DSH_HOME/profiles/<name> 下的指定 profile
dsh --profile headless "任务"跑一个全新持久化会话,打印最终答案后退出
dsh web--profile web 的别名,启动 Web UI
dsh plugin --profile <name> <pnpm 参数>在 profile 目录里转发给 pnpm,用来管插件

全局选项里有两个排查利器:

选项说明
--patch <path>追加一个补丁层(可重复),在 profile 层之后应用
--dump-config打印组合后的完整配置树后退出
--dump-default-config打印不含用户层与 --patch 的默认配置树后退出

参数传递有一条铁律:启动器只解析自己的参数,剩下的原样透传给 profile 应用。所以启动器参数在前、应用参数在后

dsh --profile web --port 8080        # --port 是 web 应用的参数
dsh --profile web --help             # 看 web 应用自己的帮助(不是启动器的)
dsh --help                           # 看启动器的帮助

我第一次就栽在这里:想看 Web 参数敲了 dsh web --help,结果出来的是应用侧帮助,还以为文档写错了。

五、Profile 与插件:配置是怎么叠出来的

一个 profile 目录就两样东西:

  • package.json —— 声明目录外的插件依赖,以及 profile 清单 dsh.profile(里面是有序的 bundles 列表)
  • cordis.patch.yml —— 你自己的补丁层

最终配置树按固定顺序叠加,后者覆盖前者

  1. dsh.profile.bundles 里每个 bundle 的补丁(按列表顺序)
  2. profile 自己的 cordis.patch.yml
  3. 用户主目录级 $DSH_HOME/cordis.patch.yml
  4. --patch 指定的覆盖层

bundle 优先从 dsh 安装包里解析(@deepseek-ai/dsh-basedsh-web-appdsh-headless 等),找不到再看 profile 自己的 node_modules。想确认自己改的配置到底生效没有,用 --dump-config 打印一遍,比猜快得多。

加插件就是往 profile 里装包:

dsh plugin --profile tui add <package>
dsh plugin --profile <name> <pnpm>   # 其余 pnpm 命令照常转发

webheadless 两个 profile 首次使用会自动从内置模板初始化;其他 profile 得自己用 dsh plugin 建。

六、模型配置:官方 Key、目录 Provider、自建网关

模型改动在下一次请求时生效,不需要重启服务,这点体验很好。

官方 DeepSeek:Settings → Models,卡片里只有一个 API Key 输入框,填完保存。

目录 Provider:Add provider → 从目录里选(Anthropic、OpenAI 等),填 Key 保存。目录会自带端点、协议和模型列表。

注意:原生认证的 provider 不是填个 Key 就完事——Bedrock / Vertex / Azure / Codex 分别要 AWS 凭据+region、ADC 项目、api-version、OAuth。

自建网关 / 第三方兼容端点:选 Add a custom provider,需要提供 Provider ID(小写,定了就不能改,因为请求、会话、模型默认值、凭据引用都挂在它上面)、显示名、base URL、API 协议、凭据,以及至少一个模型。想改 ID 只能新建一个再删旧的。表单填好后点 Model catalog 的 Fetch available models,能从当前 base URL 拉取模型列表(走 OpenAI 兼容的 GET /models,不支持该端点的就手动填)。

让模型支持图片:手工填的模型默认按纯文本处理,要开视觉得在 $DSH_HOME/settings.yaml 里给该模型加 input

llm-pi-ai:
  providers:
    my-gateway:
      apiKeyEnv: GATEWAY_API_KEY
      api: openai-completions
      baseURL: https://gateway.example/v1
      models:
        - id: legacy-chat
        - id: vision-preview
          input: [text, image]

input 支持 textimage,只作用于这一个模型;想让路由下所有手工模型都支持图片,可以在 route 上设一次 defaultInput: [text, image](作为回退,不是强制覆盖)。目录模型则用 modelOverrides 按模型 id 单独收窄。

七、数据都在哪儿

所有用户态配置集中在 $DSH_HOME(不设置就用默认位置):

路径用途
$DSH_HOME/profiles/<name>/各 profile 目录
$DSH_HOME/cordis.patch.yml用户主目录级补丁层
$DSH_HOME/settings.yaml设置(provider、input / defaultInput 等)
$DSH_HOME/.credentials.yaml凭据存储,只写

迁移或备份时,把这几个位置打包走就行。

八、踩坑表(实测汇总)

现象 / 报错处理方式
MISSING_CREDENTIAL去 Models 页保存 provider 密钥,或提供它引用的环境变量
UNKNOWN_MODEL选一个已配置的模型,或给自定义 provider 补上缺失模型
拉取模型列表返回 401检查 Key;模型发现走 GET /models,不提供该端点的服务只能手填
图片发送前就被拒模型没声明图片模态,给自定义模型加 input: [text, image](DeepSeek 官方 chat-completions 路由只支持文本,改不了)
端点拒绝带图请求模型声明了图片但后端不支持,从 input / defaultInput 里去掉 image,然后新开会话(旧会话日志里还带着图,会重复同一个错误请求)
会话编辑器点不动没选工作区,先去 Choose workspace
配置改了没效果--dump-config 看叠加结果,注意 profile 层会被用户层和 --patch 覆盖

九、想从源码跑

git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm run build
pnpm dsh web

生产运行前必须先构建包和前端产物(pnpm run build),再用 pnpm dsh <args...> 跑 TypeScript 入口。

十、我的判断

dsh 目前还在 developer preview,别急着拿它替掉日常主力工具,但**「一切皆插件 + profile 组合」这个思路值得早点上手熟悉**——它意味着同一套框架既能当 Web IDE 里的编码助手,也能当 CI 里跑一次就退出的批处理执行器,切换成本只是换个 profile。

我的建议路径:全局装 → dsh web 配好 DeepSeek Key → 拿一个小仓库选成工作区 → 让它「总结仓库并列出主要包」,跑通这一条你就明白它和聊天机器人的区别了。

参考资料


总结

DeepSeek Harness(dsh)是 DeepSeek 官方开源的 Agent 框架:一条 npm install -g 装好,dsh web 拉出 Web UI,配好 Key、选好工作区就能让它动手干活。核心概念就三个——插件、profile、补丁层叠加;踩坑集中在模型声明(图片模态)和参数传递顺序上,都有明确的解法。

相关文章:

☕ 如果这篇文章对你有帮助

欢迎请 Jeff 喝杯咖啡,支持我持续分享更多软件技巧~

打赏功能即将上线,先点个赞也是支持 ❤️

返回博客

相关文章

查看全部 »
自建 AI Agent 记忆系统的冲突消解:软失效、事件账本,和同一个 bug 我修了两次

自建 AI Agent 记忆系统的冲突消解:软失效、事件账本,和同一个 bug 我修了两次

Agent 的记忆越攒越多,新事实和旧事实开始打架。本文记录我给自己那套记忆系统做「冲突消解」的完整实现:为什么不能直接删、软失效 + 事件账本怎么设计、用什么判据判定两条记忆冲突。重点是一个真实的翻车——判据太激进,一条新记忆横扫了 50 条无关事实,误杀 19 条。更值得记的是:同一个 bug,我修了两次。

进程还在,端口已死:一个单线程 HTTP 服务的「假活」陷阱,和我的四层加固

进程还在,端口已死:一个单线程 HTTP 服务的「假活」陷阱,和我的四层加固

我自建的一个统计面板曾经挂了整整 16 天我才发现:进程从没退出、端口一直在 LISTEN、CPU 占用是零,看上去「健康得不得了」,可所有新连接都拿不到响应,公网一律 504。根因是单线程 HTTPServer 没有 socket 超时,被一条半开连接永久阻塞;更值得记的是第二层——进程监督器只认「进程存活」,这种假活对它完全不可见。这次我给它上了四层加固,也第一次想明白:为什么「重启脚本」这种修复,会被下一次部署悄悄冲掉。

AI Agent 定时任务为什么静默失败:两个我踩过的坑与实测数据

AI Agent 定时任务为什么静默失败:两个我踩过的坑与实测数据

定时任务连续几天不出活,日志里却看不出错——这是跑 LLM 自动化最常见的一种失败。本文是我排查一个每日定时任务的完整记录,两个真实根因:推理型模型的 token 预算被思维链烧穿(实测 4096 下 2/6 空回复、8192 下 0/6),以及框架的「模型漂移保护」fail-closed 静默跳过任务。附复现方法、修法和一份模型横向压测表。

Google Search Console 从验证到收录:新站接入实操与踩坑清单

Google Search Console 从验证到收录:新站接入实操与踩坑清单

新站被搜索引擎冷落,第一步不是狂发外链,而是把 Google Search Console 接上——它决定你能不能看见「爬虫到底来没来、收录卡在哪」。这篇是完整实操:网域还是网址前缀、四种验证方式怎么选、DNS TXT 验证的准确姿势、验证后必做的三件事、多久有数据,以及我踩过的六个坑,附 GSC / Bing / 百度三平台对照。