8月13日深夜,DeepSeek 悄无声息地开源了一款叫 DeepSeek Harness(命令行工具叫 dsh)的 Agent 框架。到当晚为止,这个仓库上线还不到一天,GitHub 星标已经冲到 3.1 万,直接登顶 Hacker News 热榜第一(323 分、147 条评论)。这件事的分量在于:在此之前,OpenAI 有 Codex、Anthropic 有 Claude Code、Google 有 Gemini CLI,而 DeepSeek 是最后一个"模型能打、却没有自己第一方 Agent 框架"的头部实验室。现在这个空缺被填上了,而且它带来的不是一个普通仿品,而是一套叫 Cordis 的全新插件架构——"一切皆插件"。
先说清楚:harness 到底是个什么东西
很多读者第一次听到 harness 这个词会觉得抽象。其实你早就在用它:Claude Code、Codex CLI、Hermes Agent、Goose,这些"给大模型接上终端、文件系统、工具,让它可以自己循环干活"的宿主程序,本质上都是 Agent harness。如果把大模型比作发动机,harness 就是那台把发动机、方向盘、刹车、仪表盘组装起来的整车——发动机(模型)可以换,但整车(harness)决定了你的驾驶体验。
这一轮的竞争格局其实已经很清楚。Claude Code 靠 subagent 和 hooks 抢下了开发者心智,Codex 靠 Rust 重写的性能和沙箱安全在追赶,Hermes Agent 和 OpenClaw 这类开源选手在长记忆、多 Agent 编排上各有建树。DeepSeek 这次出的 dsh,最鲜明的差异点在于它完全开源(MIT 协议),而且底层用了一个叫 Cordis 的框架,把"插件"这件事做到了前所未有的彻底程度。它要打的牌,既不是性能,也不是易用性,而是"架构的可组合性"。
核心卖点一:一切皆插件,没有特权核心
dsh 的 README 只有一句话点题:"Everything is a plugin." 这句话不是营销口号,而是架构事实。在它的源码里,模型适配器、工具注册表、会话日志、甚至 Agent 主循环本身,全部都是插件。任何一个插件都可以在配置文件里被替换掉——没有一个"特权核心"是你能碰但不能改的。
这一点对做二次开发的创业者意义重大。传统 harness 里,如果你想改某个内置行为,要么 fork 整个仓库(从此失去上游更新),要么等官方暴露扩展点(通常要等好几个版本)。而 dsh 的扩展方式是把你的插件"挂载"到和官方插件同一层的位置上。用官方架构文档的原话说:"There is no privileged core to patch: you extend dsh by mounting a plugin beside the others, and registrations are effects that unwind when their plugin unloads." 翻译过来就是:没有特权核心可改,你通过把插件挂到别人旁边来扩展它,而插件的注册本身就是"可卸载时自动还原的效果"。
核心卖点二:时空可组合性,这次是有理论支撑的
dsh 底层依赖的 Cordis(cordiverse/cordis),不是随便起的名字。它背后有一篇 8 月 13 日刚挂出来的预印本论文,标题叫《A Programming Paradigm for Spatiotemporal Composability》。听起来很唬人,但拆开就两条。
第一,时间维度的可组合性——"可逆效应"。论文要求:每一个组件对运行环境做的修改,都必须带一个"逆操作",运行时负责追踪它。这样当你卸载一个插件时,它能被完整地还原掉副作用,而不是留下半死状态。这个需求对 Agent 场景尤其关键:一个插件可能改了系统提示词、注册了工具、挂了事件监听,你不想用它的那一刻,所有这些都得干净利落地退场,而不是让整个 harness 崩掉。
第二,空间维度的可组合性——"响应式coeffect"。传统插件系统的依赖关系是静态声明的,而 Cordis 让组件之间可以声明"我依赖什么、环境里一旦变了就通知我"。这样动态加进来的组件,能靠依赖注入式的显式链接彼此协作。
论文里还有一个更底层的动作值得留意:它把"效应上下文"(effect context,组件对外部做了什么)和"coeffect上下文"(外部环境给了组件什么)统一成单一的"上下文类型",再在此基础上给出一个动态组合的演算系统。也就是说,这不是一篇"我们造了个框架"的工程博客,而是一次想给"动态组合"这件事打地基的尝试——这也解释了为什么很多只扫一眼 README 的读者会觉得一头雾水:核心思想藏在那篇论文里,而不在安装命令里。
翻译成人话:热加载、热卸载、动态启停、依赖注入,这四个词概括了 dsh 相对传统 harness 的本质差异。HN 上有位读过论文的网友概括得最准:"它给插件系统加上了热重载和动态启停能力,并且把边界推到了 UI 组件层面。" 另一位更直白:"它的大想法,是支持依赖注入风格的、在动态加入的组件之间建立显式链接。"
它和 Claude Code、Hermes 到底差在哪
如果只看功能清单,dsh 和市面上的 harness 高度重叠,都是"读代码、调工具、跑循环"。真正的区别在三个维度。
一是扩展的粒度。Claude Code 的扩展靠 subagent 和 hooks,Hook 是挂载在固定生命周期点上的脚本;Hermes Agent 走的是 skill 和 plugin 的路线,围绕记忆和多 Agent 编排做文章。而 dsh 把"模型适配器、工具注册表、会话日志、主循环"这些通常被锁死的部分全部打开成插件。理论上,你能改的深度是最深的。
二是卸载的干净程度。多数插件系统的卸载是"尽力而为",残留状态得靠开发者自己收拾。dsh 的可逆效应把"卸载即还原"变成了框架级保证,这是它相对 Claude Code hooks 这类机制最硬的技术差异。
三是部署形态。dsh 提供了 web 和 headless 两种 profile,前者是带界面的桌面式体验,后者是连服务器都不起的单次执行器,适合塞进 CI 或 cron 里无人值守地跑。这种"可无头"的设计,对想把它当成批处理引擎的创业者尤其友好。
三分钟上手
环境要求很简单,装好 Node.js 之后一条命令就起:
npx @deepseek-ai/dsh web
这条命令会拉起一个 Web UI,默认跑在 http://127.0.0.1:3080。如果你更喜欢从源码构建,官方也给了完整路径:
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm run build
pnpm dsh web
启动后,你真正会频繁用到的,是看一眼自己机器到底加载了哪些插件、哪些能被替换:
dsh --profile web --dump-config
它会把你机器实际启动的整个插件树打印出来——每一行都是一个可以被你自己 patch 掉的配置项。这是 dsh 区别于大多数 harness 的"可观测性"起点:你不但能改,还能先看清楚改的是什么。
插件与配置:profile、bundle、patch 三层结构
dsh 的配置体系用三个概念组织,理解了它们才算真正会用。
profile(配置档) 是一个命名好的组合,存在 Harness home 目录里,列出它叠了哪些 bundle、装了什么 out-of-tree 插件,以及用户自己的补丁文件。web 和 headless 就是官方提供的两个模板 profile——前者带浏览器界面,后者是一个连服务器都不起的单次执行器。
bundle(分发包) 是一种把"配置行 + 对应代码"打包分发出去的格式,保证你插进去的东西还能被更上层的 patch 覆盖。每个 bundle 在自己的 package.json 里通过 dsh 字段声明自己:dsh.profile 列出某 profile 的 bundle,dsh.bundle 指向某 bundle 的补丁文件。
patch(补丁) 是一个 cordis.patch.yml,通过 id 定位某一行配置、整体替换,或者插入新行。
这三层按固定顺序叠加:profile 里列出的 bundle(按顺序)→ profile 的 cordis.patch.yml → home 级补丁 → 命令行 --patch 覆盖层。这意味着你可以不改官方任何代码,纯靠 patch 层就换掉模型适配器、注入自己的工具、甚至替换 Agent 主循环。
事件驱动:看懂它怎么"动"起来
dsh 的扩展点几乎全部通过事件暴露,官方文档把它分成三类,这也是你写插件时第一个要做的判断。
第一类是会话事件(session events),它们是写入日志的持久化事实,通过 session/event 广播。只要这个事实必须在重载后还活着,就用它。第二类是Agent 事件(agent/*),它们携带一个活的 Agent 对象:inbox、step、status、request、validation、continuation,用来观察或拦截正在进行的任务。第三类是能力事件(fs/*、tools/*、telemetry/*),它们给某个接缝挂策略和适配器,而不需要引入整个主循环。
它的运行流程也很清晰:一个 step 等于一次模型请求加上这次请求调用的所有工具;一个 turn 等于零个或多个 step。一个 turn 从 turn/start 开始,先取下一步输入,组装提示词段落和工具 schema,然后进入 agent/pre-step——你在这里可以拒绝,也可以注入消息。接着是 agent/request 触发 llm/stream,模型返回的 chunk 一个个流过 assistant/chunk,工具调用则依次经过 tools/pre-execute、tools/execute、tools/post-execute,最后落到 tool/result。这套流水线意味着:从"模型在想什么"到"工具执行前后"的每一个节点,你都有机会插入自己的逻辑。
全程可追溯:append-only 会话日志
dsh 落地页上有一个很吸引人的卖点,叫 "Every Run is Traceable"(每次运行都可追溯)。它把模型看到的一切都记录进一个 append-only 的会话日志:系统提示词、推理过程、工具调用与结果、子 Agent 调度、每一次上下文注入。这个日志对应源码里的 core/session 包,是一系列 SessionEvent 的持久化事实。
对创业者来说,这个设计的价值不只是调试方便。当你拿 dsh 去做自动化内容生产、批量代码审查这类任务时,append-only 日志意味着你能精确回放"模型当时到底看到了什么、为什么做出了那个决定"——这在出问题复盘、甚至给客户交付审计材料时都是刚需。HN 上有位网友调侃得很到位:"追踪它到底干了什么,而不是想方设法把一切都藏起来,这居然是个卖点。"
社区怎么看:两种声音,一个共识
HN 评论区有 147 条讨论,态度明显分两派,但双方都认可一个前提。
乐观派关注的是"补位"意义:DeepSeek 是最后一个没有第一方 harness 的顶级实验室,它下场之后,每个能打的模型厂商都配齐了自己的宿主程序。一位网友的原话很有代表性:"And that's it, that's the last lab releasing models worth coding with that didn't have a first party harness that its models are trained to use."
质疑派则集中在两点。一是"插件疲劳":有多年经验的开发者担心,靠社区插件撑起功能的产品,前六个月好用,之后就是一堆不兼容、弃坑、没人治理的插件。二是为什么选 Node.js/TypeScript——评论里甚至争论起"解释型语言适合做扩展系统,但性能堪忧""真正严肃的编程应该用编译型安全语言(比如 Codex 就是用 Rust 写的)"这类话题。还有人直接把"为什么这么多 harness 都写 Node.js"归因于路径依赖:第一个出圈的 harness 是 Anthropic 的,而 Anthropic 客户端团队的核心成员是 Electron 的原始作者之一,于是所有人都跟着抄。
但无论哪一派,都认可同一个事实:把模型适配器、工具注册、会话日志、Agent 循环全部插件化、且全程可追溯,这个架构方向本身是对的。争议只在于执行能不能跟得上。
与 DeepSeek 价格战的联动
把这件事放回时间线看会更有意思。就在同一天,DeepSeek 的 API 涨价公告也正式生效了——V4 Pro 0813 上线时官方就预告过"近期将显著上调整体价格",而 harness 正是这盘棋里的关键一步棋。
逻辑很简单:当你的模型便宜到每百万 token 不到一美元时,用户最大的顾虑已经从"用不起"变成了"怎么把用量跑起来"。一个开源的、官方维护的、能直接对接自家模型的 harness,等于给用户铺好了一条"从零到大规模用量"的高速路。模型是入口,harness 是留存,涨价的底气来自用户已经离不开这套工具链。对创业者来说,这也意味着"极致便宜"的窗口期和"工具生态成熟期"正在重叠——现在立项把用量跑起来的人,会同时吃到这两波红利。
一人公司可以怎么用
抛开宏大叙事,落到一个具体的一人公司场景里,dsh 至少有三个立即可用的切入点。
第一,做私有化的内容生产线。你可以用 patch 换掉模型适配器、注入自己的检索工具、把 prompt 模板做成插件,跑一套完全自托管、成本可控的批量内容生成流水线。append-only 日志还能帮你回放每一次生成的上下文,方便调优。
第二,做多 Agent 编排的底座。dsh 的事件系统天然适合"一个主 Agent 调度多个子 Agent"的结构,agent/* 事件让你能在任务进行中插入人工审批、成本拦截这类逻辑,而不用改官方代码。
第三,接自己的变现工具。因为"一切皆插件",你可以把支付回调、订单查询、客服知识库这类私域能力做成插件挂进去,让一个 Agent 同时干"内容 + 运营 + 客服"的活。这比在多个闭源产品之间切来切去要清爽得多。
给 AI 创业者的三个判断
第一,你的工具栈又多了一个"成本锚点"。dsh 开源免费,配合 DeepSeek V4 系列远低于闭源的价格,等于给了中小团队一条"开源框架 + 便宜模型"的完整自托管路线。之前这条路上最大的短板——没有官方 harness——现在被补上了。
第二,插件化是下一波 harness 竞争的分水岭。Claude Code 靠 subagent 和 hooks 已经建立了生态,Codex 靠 Rust 的性能和安全,而 dsh 押的是"彻底插件化 + 可逆性"。如果你正在构建自己的 Agent 工作流,花半小时读懂 Cordis 的"可逆效应"和"coeffect",会让你对后续工具选型有更清晰的判断。
第三,别急着把生产环境迁过去。官方在 README 里写得很直白:现在是 developer preview,快速迭代中,"THERE WILL BE COMPATIBILITY-BREAKING CHANGES"——会有破坏兼容性的变更。现在适合做的是跟踪、试用、储备插件开发能力,而不是立刻切主力。
踩坑提醒
别在生产环境直接用。 developer preview 阶段 API 不稳定,配置格式随时可能变。建议只在隔离环境里试,别把它当 Claude Code 的替代品上主力。
插件质量没有治理。 社区插件很可能良莠不齐,一个插件可以改系统提示词、注册工具、挂事件监听。装插件前先看它 hook 了哪些事件,尤其警惕有网络或文件系统权限的插件。
Node.js 生态的依赖风险。 dsh 是 pnpm monorepo,依赖树很重,构建和安装耗时较长,且 npm 生态的供应链安全问题是老生常谈。自托管时建议锁定依赖版本。
账号与 Key 的隔离。 dsh 需要接入模型 API Key。自托管时把 Key 放在服务端环境变量里,别写进会被 commit 的配置文件,也别让 Web UI 暴露到公网——默认只监听 127.0.0.1 是有原因的。
模型适配不是银弹。 虽然"一切皆插件",但换个模型并不等于体验一致。dsh 是为 DeepSeek 自己的模型打磨的,接第三方模型时工具调用格式、上下文管理都要自己验证。
结语
DeepSeek Harness 的发布,表面上是一家公司补上了自己的 harness 短板,深层看是 Agent 框架从"拼功能"转向"拼架构"的一个信号。当模型适配器、工具、会话日志、甚至主循环都变成可热插拔、可逆的插件时,harness 就不再是某个厂商的黑盒,而是一块任何人都能拆开重组的乐高底板。对 AI 创业者来说,这既是一个可以白嫖的高质量工具,也是一次近距离观察下一代 Agent 架构的机会。现在要做的不是冲进去,而是先读懂它的插件体系,再决定它在你自己的技术栈里该摆在哪。
