博客

DeepSeek Harness 技术报告解读:三个能抄走的 Agent 架构决策

快速回答

DeepSeek Harness(dsh)的爆火(开源 1 个多小时破 2 万星、首日 2.8 万–3.1 万星)不是营销,而是几个反直觉的架构决策共同作用的结果。读完官方仓库(12,293 次提交、54 个 npm 包、约 59.1 万行 TypeScript),最值得关注的不是它有多少工具,而是四件事:

  • 没有特权内核:连 agent loop 本身都是插件,任何能力都能从配置整体替换。
  • 会话日志是唯一事实来源:fork / 恢复 / 上下文压缩 / 回放全是日志的免费派生品。
  • Agent 能现场改装自己:自引用工具集让运行中的 agent 可以定义新插件并立刻让模型看到新工具。
  • 沙箱是一张矩阵:Linux / macOS / Windows / 云端各配后端,强制级别如实上报。

这四件事里,前三件是可以抄走的架构决策,第四件是工程态度的体现。下面逐一拆开讲,并给出普通开发者视角:这些设计对你用 agent 意味着什么。

这篇「技术报告」到底是什么

先对齐一下:DeepSeek Harness 官方目前没有一份「论文」形式的正式技术报告,但它的设计依据、源码与文档本身就是一份可读的架构说明书。本文的解读基于对官方仓库与参考文档的拆解(版本 0.1.0-rc.5):

下面从「值得关注的原因」和「怎么抄」两个角度讲。

决策一:没有特权内核,一切皆插件

这是 dsh 与其他框架最本质的分水岭。绝大多数 agent 框架是「核心 + 插件」:一个带主循环(agent loop)的神圣不可侵犯的内核,扩展只能走官方预留的钩子。

dsh 反过来:

产品的每一部分都是插件,包括模型适配器、工具注册表、会话日志,甚至 agent loop 本身。

底层是 vendor 进来的 Cordis 插件框架。三条机制撑起这个承诺:

  1. 插件 = 可逆副作用。注册任何东西(提示词片段、工具 schema、适配器、事件监听器)都是副作用(effect),插件卸载时自动撤销,reload / HMR 时按声明顺序干净重来。没有「装上了就卸不掉」的遗留状态。
  2. 依赖用声明,不用编排。插件用 inject 声明自己需要的服务(ctx.toolsctx.llmctx.sessions…),框架按依赖自动决定加载顺序。你永远不 import 具体实现,只按 key 找服务——所以任何服务都可以从配置整体替换。
  3. 事件有四种分发模式emit(观察)、waterfall(环绕中间件,必须 next() 委托)、parallel(并行扇出)、serial(按序执行)。拦截、审批、改写全部是「挂一个 waterfall 监听器」,不需要改循环本身。

开发者视角:这意味着「给 agent 加一个工具」「只给终端 + 文件操作、不给网络」「把模型从官方 API 切到另一个端点」——这些在传统框架里要么要改核心、要么要等官方出钩子的需求,在 dsh 里都只是配置或一个插件。对想深度定制 agent 的团队,这是能力面的从「官方给什么用什么」到「我要什么拼什么」的转变。

决策二:会话日志是唯一事实来源

这是 dsh 最狠的一条,也是「省 Token」传言的真正来源。

它把一句话上升为运行时不变式(runtime invariant)

抵达模型请求的一切,都必须能从日志重建。

具体说,会话日志(SessionEvent log)是唯一事实来源。模型看到的一切——用户消息、助手 chunk、工具调用与结果、注入的上下文——都是追加式日志里的事件;deriveMessages() 从日志投影出模型历史,原始 assistant/chunk 事件保证回放和 UI 保真。

这个决策的连锁收益是「白捡的」:

你要的功能 传统框架要付出的成本 dsh 的做法
fork 会话 单独序列化 / 复制状态 从某条边界事件派生,天然一致
恢复会话 额外「记忆序列化」 重放日志即可
上下文压缩 容易造成历史与 UI 分裂 在日志上做 surfaceOp: { op: 'replace' } 显式替换,压缩本身也只是个事件
回放 / UI 同步 另存一份副本 直接读原始日志,模型历史与 UI 永远同源

配套的 spill 存储:超大工具输出落盘,模型只拿定位符,上下文不再被巨量文本撑爆。

开发者视角:绝大多数框架把「会话日志」当调试功能;dsh 把它当唯一的真理来源。对使用者的直接好处是可解释、可恢复、可审计——一个 agent 会话为什么走到了这一步,回放日志就能看到;要分叉出一个「如果当时换个做法会怎样」的分支,fork 一下就行。这种「所有状态都是派生品」的设计,也大幅降低了长期跑 agent 的运维心智负担。

决策三:能力 seam 三件套(定义 / 提供方 / 消费方)

dsh 的可替换性不只是「插件系统」,而是落到一组具体的抽象上:Service Definition / Provider / Consumer 三件套。

最直观的例子是沙箱。进程沙箱是一个可替换的 seam(ctx.sandbox),后端按平台选:

平台 沙箱后端
Linux bwrap / Landlock(自带 native 的 landlock-run,含预编译产物与 CLI 契约文档)
macOS Seatbelt
Windows ACL 受限令牌(每个会话/工作区一对私有临时目录 + SID)
云端 E2B 远程 Linux 沙箱(文件系统、子进程、shell 适配器共享同一个远程工作树)

关键是:文件系统与进程执行共享同一套 provider 抽象。于是把 fs / subprocess 指向 E2B,Bash、PTY、LSP 就整体搬进远程沙箱,不需要为每个能力写平台专用 fork。这就是「能力 seam」的威力——换一个 provider,整条执行链跟着换。

沙箱还有一层工程态度值得单独说:强制级别如实上报。它区分 full / partial(旧 Landlock ABI、Windows ACL 的 Everyone 与硬链接边界算 partial),并明确要求「要求绝对保证的消费方必须拒绝 partial」。不假装安全,这是一个成熟系统该有的样子。

开发者视角:对普通用户,seam 意味着「迁移成本低」。把 dsh 从本机沙箱切到云端 E2B、把模型后端从官方 API 切到别的 OpenAI 兼容端点,都只是一行配置的事。对自建 agent 平台的人,这个三件套是一个可以直接抄的设计范式:先定义清楚能力接口,再让 provider 可插拔,最后消费方只依赖接口不依赖实现

最劲爆的一条:Agent 能改装自己

dsh 提供了一组自引用工具cordis_define / cordis_run / cordis_stop / cordis_undefine / cordis_inspect_*

含义是:运行中的 agent 可以现场定义一个新的 Cordis 插件,注入到真实运行时——而新插件注册的工具,立刻对模型可见。

这不是玩具。工具集背后是 dsh-cordis-host-runner 的 vm 沙箱和定义注册表,一个运行中的包甚至可以注册额外的模型可见工具,直到被 stop / undefine 或进程重启。它默认不进任何发行树(刻意 opt-in,因为「动态包代码会到达真实运行时」),但机制本身是闭环的:

text
用框架 → 在框架里定义框架 → 改自己的工具集 → 继续用

开发者视角:这是目前市面上几乎唯一把完整版「元编程闭环」做成工具暴露给模型的框架。想象一个场景:agent 在干活时发现需要某种能力,它自己写一个插件、注册进去、立刻用上——而不是停下来等开发者改代码。这种「自举」能力到底会在真实任务里被用到什么程度,还需要社区验证,但方向是真实的:agent 不只是「用工具」,还能「造工具」。

它的工程文化:为什么值得信任

除了架构,仓库本身透露出的工程文化也值得关注:

  • Postmortem 文化:仓库里有 4 份正式事故复盘。最出名的一条:178 项无密钥测试全绿时,真实 ACP 客户端会话当场崩溃——于是他们建立了独立的、带 secret 的真实 API e2e CI(对线上 DeepSeek API 跑真实模型调用、真实 bash、多轮次、恢复),并把「无密钥测试证明的是管线,不是产品」写进测试文档。
  • 运行时不变式注册表ctx.invariants,每个工作区包都必须自带 ./invariant 配套插件,无检查项也得写注释解释为什么;verify-package-invariants 机械拒绝空安装器。
  • 生成式文档 + 机械校验:Cordis API 目录、工具 schema 目录全部由脚本从源码生成,CI 里逐字节校验,防止文档与代码漂移。
  • 用 Agent 造 Agent:1,386 份 agent 笔记(.agents/notes),git 分支名大量是 codex/...agent/...worktree/...——这个框架很大程度是 AI 编码 agent 自己写出来的,而这套 agent 机制又反过来支撑了这些 agent 的日常工作。狗粮吃到闭环。

开发者视角:对开源项目来说,「态度」本身就是一种可靠性信号。4 份 postmortem、逐字节校验的生成式文档、机械拒绝空检查项的 invariant 注册表——这些都是「这个项目会长期维护」的实证。

泼冷水:架构方向真实,但版本是预览版

再强调几条必须知道的边界:

  1. 明确标注 Developer Preview,官方声明「未来将有破坏兼容性的变更」。现在抄它做生产依赖,要做好追版本的心理准备。
  2. 每次 release 都是 222 个文件同步改版本号——54 个包同步发版的代价就是这种机械 churn。
  3. 底层 Cordis 是 vendor 方式引入的,不是 dsh 自研——对 Cordis 的信任要并入技术评估。
  4. 沙箱矩阵很强,但 partial 强制级别如实存在,生产环境必须逐个确认自己平台的强制完整性。
  5. 「对标 / 取代 Claude Code」是媒体叙事;一个 rc.5 的预览版谈「取代」为时过早,但架构方向是真实的。

常见疑问

Q:DeepSeek Harness 有正式的论文 / 技术报告吗? 目前没有单篇「论文」形式的官方技术报告。它的设计依据是 Cordis 论文《A Programming Paradigm for Spatiotemporal Composability》,而 dsh 自身的架构说明书 = 源码 + 参考文档。本文解读的就是这份「隐形的技术报告」。

Q:这三个架构决策里,哪个最值得我抄? 如果是自建 agent 平台:能力 seam 三件套最直接,先把能力接口定义清楚,再让 provider 可插拔。如果是想让自己的 agent 系统更可靠:日志即唯一事实来源收益最大,把会话状态做成可重放的派生品,fork / 恢复 / 审计全免费。

Q:这些设计对普通用户有什么实际好处? 可解释(回放日志就知道 agent 干了什么)、可恢复(会话随时 fork / 续跑)、成本可控(spill 落盘 + 便宜模型)、迁移成本低(换 provider 只需改配置)。想低成本体验,一个 key 把 DeepSeek V4 接进来即可。

Q:什么时候适合认真跟进 dsh? 想深度定制 agent、想做 agent 架构研究、或想「便宜跑 agent 规模」的人,现在就可以跟进。前提是接受 Developer Preview 的不稳定。想清楚再动手,见《DeepSeek Harness 是什么》。

想低成本跑一个 DeepSeek V4 的 agent 来验证这套架构,到 TeamoRouter 注册拿一个 key,把 DEEPSEEK_BASE_URL 指过去即可。想看到这套框架在真实多智能体场景里怎么用,接着读《用 DeepSeek Harness 跑一个多智能体协作场景》。

准备好接入了吗?登录控制台 · 购买额度 · 创建 API Key,三步即可开始。
DeepSeek Harness 技术报告解读:三个能抄走的 Agent 架构决策 · TeamoRouter