今年开源 Agent 的主战场,先是 skills,再是 MCP,现在轮到了 harness 本身。
DeepSeek 8 月放出的 DeepSeekRuntime(命令是 dsh)走了一条比较少见的路线:它不止开放插件接口,而是把整个运行时拆成插件——模型适配器、工具注册表、会话日志,连 agent loop 都是可替换的一层。仓库现在约 28.1 万星(2026-11-14 核对),MIT 许可。
先说一个必须写在前面的前提:官方把它标为 developer preview,README 里用大写提醒「会有破坏性变更」。这不是谦虚,是让你别急着把生产流程搬过去。
它到底怎么组织的
底座是一个叫 Cordis 的框架。按官方架构文档的说法:插件向共享上下文贡献三类东西——服务(services)、带类型的事件(typed events)、可回退的副作用(reversible effects)。关键在于最后一条:插件注册的东西是"副作用",插件卸载时会自动回退。所以官方才敢写「没有需要打补丁的特权内核」。
一个运行中的 dsh,是启动时按有序层组装出来的插件树。这里有两个概念:
| 概念 | 是什么 | 怎么声明 |
|---|---|---|
| profile | 一份具名组合:叠了哪些 bundle、装了哪些树外插件、你的 cordis.patch.yml | 存在 Harness home 里;自带 web、headless、sdk、sdk-minimal、acp 五个模板 |
| bundle | 配置行加代码的分发格式,插进来的东西仍然可被上层 patch | package.json 的 dsh 字段:dsh.profile 列 bundle,dsh.bundle 指向 patch 文件 |
五个 profile 的差别不是"功能开关",是装配方案:web 带浏览器应用,headless 是一次性 runner 不带服务端,sdk 起 JSON-RPC 服务,acp 是纯自动化服务端。sdk-minimal 是刻意的例外——它自带完整显式 SDK 树,不套用共享底座。
共享底座 dsh-base 负责:模型适配器、工具、持久化、沙箱与审批策略、设置、凭据、遥测。也就是说,这些在别的 harness 里是"核心代码"的东西,在这里只是第一层插件。
patch 层:改行为不用改代码
层叠顺序是:profile 的 bundle 序列 → 该 profile 的 cordis.patch.yml → home patch → 命令行 --patch 覆盖。patch 按行 id 定位,要么替换整段 config,要么插入新行。
有个命令值得记住:
dsh --profile web --dump-config
它打印你这台机器实际启动的那棵树,打印出来的每一行都能被自己的 patch 覆盖。这句话是整套设计的核心卖点——没有"这个参数写死了"的地方。
热更新也由配置控制:base 开启仅配置的 dsh-hmr;headless、SDK、ACP 三个 profile 关掉;sdk-minimal 干脆不带。
三种事件,扩在哪里要分清
这套架构里最容易混淆的是"事件",官方分了三域,用途完全不同:
- 会话事件:落进 append-only 日志的耐久事实,重载后还在。要记下来的用它。
- Agent 事件(
agent/*):携带活着的 Agent,覆盖 inbox、step、status、request、validation、continuation。要观察或拦截进行中的工作用它。 - 能力事件(
fs/*、tools/*、telemetry/*):给某个接缝挂策略和适配器,不用导入 agent loop。
另外几个术语也得对齐:step 是一次模型请求加上它调用的工具;turn 是零个或多个 step,从第一次输入被认领开始,到没有待办为止。工具执行是固定管线:tools/pre-execute → tools/execute → tools/post-execute。想加审计、加拦截、加成本统计,就挂在这条链上。
核心包也各自占一个 ctx 键,职责划得很干净:sessions(日志与内存存储)、systemPrompt(提示词分段与工具 schema 组装)、tools(作用域化注册表 + 受控执行)、agents(Agent 接口与实时注册表)、agentLoop(默认驱动)、llm(消息与流式词汇 + 适配器接缝)。
迁移成本要算清楚
这是本文最想说的一段,因为"插件化"三个字很容易让人低估代价。
它不是"给现有工具装插件",是换掉整个 harness。Claude Code 一类工具的扩展面是 skills、MCP、hooks——你在它的既有循环上加东西;dsh 的扩展面是循环本身。好处是任何一层都能换:换个模型适配器、换掉工具注册表、甚至换掉 agent loop,都不用 fork。代价是你得学 Cordis 这套"服务 + 事件 + 副作用"的模型,理解 profile / bundle / patch 三层,才能改到想改的地方。
而且生态还没成形。官方给的插件发现机制是 GitHub 话题 dsh-plugin,这说明目前还没有一个成熟的插件市场或审核机制。所谓"插件化生态"现在只是入口,不是存量。
再加上预览版的破坏性变更,实际影响是:适合拿来做研究、做定制运行时、做自己的 agent 产品底座;不适合这周就要上生产。
怎么跑起来
npx @deepseek-ai/dsh web
默认在 http://127.0.0.1:3080 起 Web UI 并打开浏览器;SSH 环境下不自动打开(本地转发地址由客户端或编辑器持有)。不想开浏览器加 --no-open。
从源码跑:
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm run build
pnpm dsh web
该信多少
- 本文读的是 README 与官方架构文档,没有安装、没有实际启动,所以不给"好不好用"的结论。
- 星数 28.1 万(2026-11-14 核对),但它 8 月才创建,涨得快也意味着社区验证时间短。
- 架构文档里那些包名、事件名、层叠顺序都是文档现状,预览版随时会改——这也是官方自己说的。
- 文档质量本身是个信号:有架构总览、事件生产者消费者表、配置目录、子系统文档,说明工程投入是真的;但文档完整不等于实现稳定。
一句话判断
DeepSeek 这次没有去卷模型,而是卷"运行时的可替换性"。方向是对的:Agent 产品最终会像编译器一样,前端(交互)、中端(编排与策略)、后端(模型)都该能换。dsh 把这三段全做成插件,代价是把复杂度也交给了使用者。如果你只是想用得顺手,现在还不是它的时机;如果你在造自己的 agent 底座,它值得读一遍架构文档——哪怕你最后不用它。
来源
- deepseek-ai/deepseek-harness(README;280,570 星,创建 2026-08-13,最后提交 2026-11-13,MIT)
- 官方文档(运行方式与用户指南)
- 架构文档(Cordis、profile/bundle、事件三域、核心包)
说明:星数由 GitHub API 与 ungh.cc 于 2026-11-14 核对;本文未安装或运行 dsh,内容为官方文档解读。