ARTICLE · 1070047
DeepSeek把Agent做成插件
AI生成
8 月 13 日,DeepSeek 没有发新模型。
他们丢出的是 DeepSeek Harness,仓库里的名字叫 dsh。MIT 协议,TypeScript,约 45 万行代码,拆成 219 个 workspace 包。README 头部行写着:Everything is a plugin。
三天 12 万 star。到 9 月下旬,GitHub 上已经超过 21 万。这个增速,说明 Agent 构建者早就受够了「框架说可插拔、核心却碰不得」那套。
社区现在的状态很有意思:架构被吹爆,安装路径被喷烂。这两件事同时成立,而且都不是水军。
212kdeepseek-harness 当前 star(9 月下旬核对)
219workspace 包数量,约 45.3 万行 TypeScript
模型适配器、工具注册表、会话日志、沙箱、agent loop 本身,全是可替换插件。没有特权内核要打补丁。

一切皆插件,不是口号
dsh 底座是 Cordis。DeepSeek 没简单依赖上游,而是把 cordis 4.0.0-rc.7 源码 vendor 进仓库,打了 18 个本地补丁,改成 @deepseek-ai 命名空间。好处是框架层完全自持,代价是以后每次上游更新都是合并练习。
六个核心服务撑起控制脊柱:session 日志、agent 注册表、loop 驱动、工具注册表、prompt 组装、模型适配器注册表。其余全是能力接缝——文件系统、子进程、子代理、存储,都能换 provider。
更值得抄的是那条不变量:模型看得见的一切,要能从 append-only 会话日志重建。fork、resume、replay、transcript、token 计费,全部从这一条事件流投影出来。上下文压缩只是另一个挂在 pre-step 瀑布上的插件。
没有特权内核。扩展 dsh 的方式是再挂一个插件,而不是 fork 源码改核心。
它还长着一张「元 harness」的脸。subagent 接缝后面可以是进程内子代理、ACP 对端、Codex 进程,甚至 Claude Code 进程。原生读 AGENTS.md 和 CLAUDE.md,能桥接 Claude Code hooks,还能把 Claude Code 当工具调。深栈里 1372 条双语决策记录 .agents/notes/,读起来像给构建它的 agent 写的 RFC。
再往深一层,profile / bundle / patch 的三层组合才是它真正的产品。profile 是一份具名组合,web、headless、sdk、sdk-minimal、acp 都是模板。bundle 负责带配置行和要挂载的代码。你的 cordis.patch.yml 按 id 定位某一行,整段替换或插入新行。
跑 dsh --profile web --dump-config,打印出来的就是这台机器真实装载的插件树。每一行都能被 patch 掉。对担心框架漂移的团队来说,值得反复读的是架构文档,不是演示 demo。
会话日志那条不变量,工程含义比听上去重。任何进入模型请求的内容,都要能从事件流重放出来。于是 resume、fork、transcript、telemetry、网页 UI 全是同一来源的投影。你想给模型塞一条新可见信息,就得先定义一个新的 session 事件类型,不能从侧面走私上下文。
沙箱也不含糊。本地后端用 Node addon 包一层:Linux 走 Landlock,macOS 走 Seatbelt,Windows 走 ACL 受限令牌。fail-closed,和「模型写啥就跑啥」的演示型 harness 不是一路。
把五次 tool call 压成一次 TypeScript 程序,省的不只是往返。模型写程序时面对的是生成的 .d.ts,类型约束比 JSON schema 更接近它在预训练里见过的东西。中间结果也不再全部回灌上下文,只保留你 print 或 return 的那部分。长任务里的上下文膨胀,被这刀砍掉一大截。
安全边界没有因此放松。run_code 和 bash 走同一套 tools/pre-execute 策略门,worker thread 给的是隔离,不是多租户硬边界。官方文档写得很直白:需要硬隔离的部署,要把 code 和 bash 都放到容器级后端。
Python 侧的更小 profile 更克制。默认只有持久 shell,连文件编辑器都要自己用 patch 插回去。这种「显式组合」的取向,和某些框架「装上就全开」正好相反,也更符合可复现实验的口味。

Creator 模式还藏了一层产品意图:让做 preset 的人把实验结果固化成可分享的组合。你可以在运行时改插件树,看行为变化,再导出成 bundle。这等于把「配置即产品」推到了 UI 上。
对团队落地,profile 分层还有一个务实好处。dsh-base 装模型适配、工具、持久化、沙箱、审批、设置;web 再加浏览器应用;headless 是一次性 runner;sdk 给 JSON-RPC;acp 给自动化。同一套内核,五种交付形态,不必养五套代码。
四种模式,Code 最反直觉
Standard 是完整 coding agent:文件编辑、shell、文件与网页搜索、skills、规划、goals、subagents、workflows。Minimal 只留两个工具:持久 bash 和 str_replace_editor,专门给模型基准测试用。
Code mode 是设计上的亮点。模型不再一步步发 tool call,而是对着生成的 TypeScript SDK 写一段程序,五轮往返压缩成一次调用。Cloudflare 那套「写代码比发 tool call 更准」的观察,在这里落成了 ToolRuntime 的一等呈现模式。
Creator mode 给做自定义 preset 的人:Standard 全量能力,加运行时检查、插件实验、preset 编写指引。跑一次 dsh --profile web --dump-config,能打出你机器上真正装载的插件树。
Python SDK 也已上 PyPI(deepseek-harness-sdk)。不需要系统 Node.js,走 JSON-RPC over stdio。默认 profile 是 sdk-minimal:一个持久 shell、本地执行、JSONL 会话。文件工具、Web、subagent 要另装。
- - -

社区正在修的,不是功能
8 月 14 日,Discussion #1496 把五条独立讨论合并成一份 advisory:插件安装路径「fragile by install」。一条 dsh plugin add 就能让整个 profile 起不来,而且几乎没有可用诊断。
具体坑包括:duplicate loader entry id、ERR_MODULE_NOT_FOUND 整树阵亡、pnpm hoisting 把框架包重复进 profile、session resume 撞上非幂等的全局注册表。更阴的是 --dump-config 通过了,真实 boot 仍会炸——它根本没挂 loader。
社区的诉求写得很克制:加 dsh doctor,安装前校验,失败可回滚。有作者直接交出种子实现 check-dsh-profile.mjs,专门扫 id 冲突。
一次 dsh plugin add 就能干掉整个工作区。恢复手段是手改 YAML。这个成本,和「everything is a plugin」的愿景不匹配。
另一边,真插件已经在长。dsh-tool-policy 挂在 tools/pre-execute 上做 deny/ask/allow 路由;dsh-model-pricing 把 7178 条定价、213 家 provider 塞进 Settings 页。DEV 上有位作者用免费额度跑了一周,交付一个插件,LLM 成本 0 美元,墙钟 22 小时。
这里也有必要泼一盆冷水。tools/pre-execute 只能拦「已知坏形状」,换个拼写就能绕过。真正的能力边界还在 sandbox。把参数匹配当成安全边界,是当前插件讨论里更常见的错。
AIX Cove 的两周评测把社区反应切成两半。夸的集中在三处:插件粒度真的细、架构文档质量高、前沿实验室愿意放基础设施而不是又一个推理端点。中文报道则更强调架构开放。
保留意见也很一致。developer preview 说明破坏性变更,早期用户已经撞上 API churn;捆绑插件之外的生态还薄;写插件要先过 Cordis 服务、事件、可逆副作用三道心智门槛。谁这个季度就把生产负载押上去,谁就是在赌版本纪律。
Developers Digest 那篇代码精读补了个更冷的观察:BENCHMARK.md 只有三行,没有方法论、没有分数、没有评测脚手架。V4-Flash 的启动数字还是用 harness 的 minimal 模式跑出来的,但评测工具链没开源。想比,自己搭。
如果你已经在跑 Claude Code:驾驶舱可以留着,会话日志设计值得抄,dsh 更适合当便宜的 headless worker,一条命令丢任务。等 preview 标签摘掉,interop bridge 会把迁移成本压得比这个赛道通常更低。
如果你在做 agent 中间件:Code Mode 的 run_code 传输、tools/pre-execute 策略缝、subagent 抽象,都是可以直接对照的设计样本。它们回答的是同一类问题:能力如何被替换,而不被 fork。
如果你只是想日常写代码:现在没必要换主力。TUI 都还是文档里的假设项,终端党明显排在 Web 用户后面。头部批产品形态,是给搭 harness 的人准备的。
评估清单可以很短:能否从会话日志重放任意一次模型请求;插件卸载时注册是否可逆;沙箱失败是否 fail-closed;换模型适配器要不要改 loop。四问里有两问答不上来,就还没到生产门槛。
还有一条时间建议。官方明确说了兼容性破坏变更还会来。这个季度适合做 spike 和内部工具,下个季度再谈默认技术栈。21 万 star 是信号,不是稳定证明。
现在该怎么用
README 用大写字母写着:developer preview,会有兼容性破坏变更。BENCHMARK.md 只有三行,没有分数、没有方法论、没有 SWE-bench。想比就自己测。
合理姿势大概是:架构文档当教材读,headless 当便宜 worker 跑,插件实验锁版本。想把生产自动化押上去的,至少等 plugin API 稳定,或者接受每个季度一次迁移。
入口很短。npx @deepseek-ai/dsh web 起本地界面。仓库:https://github.com/deepseek-ai/deepseek-harness 。官方页:https://www.deepseek.com/harness/ 。
从 V4-Flash 配置脚注里的「to be released soon」,到 21 万 star 的插件运行时,DeepSeek 这次交的是基础设施,不是又一个推理端点。竞争已经上移了一层楼。
再补一个细节:会话恢复不是把聊天记录读回来这么简单。因为模型可见内容都落在事件流里,resume 实际是重放投影。你可以在任意事件点 fork,得到两条可审计的分支。调试 agent 行为时,这比翻截图有用得多。
工具执行管线同样完整。pre-execute、单调守卫、execute、post-execute、result 通知,native 和 run_code 走同一套。权限插件能在程序跑之前看源码,结果观察者拿到的是规范化外层结果。审计日志因此不会因为换了调用形态就缺口。
这些能力拼在一起,dsh 更像给 agent 时代准备的「可组合运行时」,而不是又一个聊天壳。它还没打磨好用,但它已经把难改的部分做成了可换的插件。


你会拿 dsh 当主力 harness,还是只抄它的会话日志设计?评论区聊聊。