DeepSeek Harness:官方开源 AI Agent 框架,我给它套了个 macOS 外壳

📂 技术工具 📝 1452 字 ⏱️ 3 min

💻 先说说这个项目

DeepSeek Harness 是 DeepSeek AI 官方开源的 AI Agent 框架(deepseek.com/harness),MIT 协议,代码在 GitHub 上完全公开。它最有辨识度的设计是一句话:一切皆插件——模型接入、工具注册、会话日志、甚至 agent 的主循环本身都是插件,由 Cordis 框架组合装配,想换哪块换哪块,都写在配置文件里。

开发预览版已经发布到 npm,一条命令就能跑:

npx @deepseek-ai/dsh web

然后浏览器打开 http://127.0.0.1:3080:填 DeepSeek API Key、选一个工作区,就能让 Agent 干活了——读代码、改文件、跑命令、拆子任务、维护计划,涉及敏感操作它会先征求你同意。

框架是好框架,但每次启动都离不开终端。我自己天天用,早就习惯了,直到这周想把它介绍给朋友——发现"先装 Node、clone 仓库、pnpm install、再敲一长串命令",这一套门槛直接把对方劝退。于是我决定:给它套一个 macOS 外壳,双击就能打开。

📦 为什么不能只打包静态文件

一开始我想得简单:web 项目嘛,构建完把静态文件打包进客户端不就行了?实际试了才发现不行。

Vite 构建出来的只是外壳:界面上那些功能,全靠宿主进程在背后动态提供——插件 bundle 服务、接口桥、WebSocket 流,缺一不可。官方直接在构建配置里写死了拒绝"裸静态文件启动",之前就有过"HTTP 200 不等于应用就绪"的翻车记录。

所以正确形态必须是两个进程:

Electron 壳
  │  spawn: node apps/cli/src/bin.ts web --host 127.0.0.1 --port 0
  ▼
dsh web 宿主进程(与 pnpm dsh web 同一条启动路径)
  ▲
  │  等待就绪信号:dsh web: http://127.0.0.1:<port>
窗口加载该地址

几个关键决策:端口用 –port 0 交给系统分配,不怕端口被占;窗口关闭时先 SIGTERM、超时再 SIGKILL,把宿主子进程杀干净,不留僵尸进程;渲染进程保持沙箱隔离,导航锁在本地 origin 内。

🍎 打包成 .app 和 dmg

打包用 electron-builder,一条命令出两样东西:

npm run dist:mac:arm64

产物是 DeepSeek Harness Desktop.app,外加 dmg 和 zip,图标沿用 Web 版的鲸鱼。版本 0.1.0,dmg 已经躺在 dist/ 目录里。

为了让"出包"这件事自动化,我又配了 GitHub Actions:改到 desktop/ 的代码推上去,自动打 arm64 + x64 双架构;打 tag desktop-v0.1.0 推上去,构建产物自动挂到 Release 页面。macOS 的构建 runner 排队是出了名的慢,十几分钟起步,今天亲眼看着构建任务在队列里趴了 16 分钟——这也是真实开发节奏的一部分。

踩坑也记了两个,都挺典型:

  • electron-builder 会向上探测到仓库根的 pnpm workspace,改用 pnpm 收集依赖导致构建失败,解决方式是让 CI 在 workspace 外的临时副本里安装
  • 第一次打 tag 时 Release 挂上了多余文件,后来改成只挂 dmg 和 zip 两个归档

⚠️ 说点诚实的现状

这个客户端还是 POC:没签名、没公证,Mac 上首次打开需要右键→打开才能过 Gatekeeper;正式对外分发要走 Apple Developer 证书签名加公证,这是下一步。另外当前壳里没有内置宿主代码,运行时会从安装目录向上查找仓库 checkout——真正交付给普通用户,要把宿主和 Node 运行时一起打进应用资源里。

但把它当成"自己用、给朋友演示"的工具,已经够顺了:双击打开、填 Key、干活,全程不碰终端。

🚀 想试试?

官方仓库在 github.com/deepseek-ai/deepseek-harness;我加了桌面客户端的 fork 在 github.com/leonhe/deepseek-harness,desktop/ 目录就是客户端源码,dist/ 下有现成的 dmg。

自己动手的话:

git clone https://github.com/leonhe/deepseek-harness.git
cd deepseek-harness && pnpm install && pnpm run build
cd desktop && npm install && npm run dist:mac:arm64

你平时跑本地 AI 工具,是开终端派还是客户端派?评论区聊聊👇

关注我,用产品思维看热点。