DeepSeek Harness 深度研究:一切皆插件,连 Agent Loop 都是插件

> **本地可组装的 Agent 运行时底座 —— 一切皆插件,连 Agent Loop 都是插件** > >...

> 本地可组装的 Agent 运行时底座 —— 一切皆插件,连 Agent Loop 都是插件 > > 研究对象:github.com/deepseek-ai/deepseek-harness(v0.1.0-rc.5,MIT 协议,本地浅克隆 deepseek-harness-research) > 研究时间:2026-08-14 | 四路专项 Agent 并行深读真码(Cordis/工具流水线、四模式、多Agent、事件流)+ 外源核实(InfoQ、多家技术拆解、WebSearch) > 方法:代码级核证为主,每条关键结论附 文件:行号;凡与外源/InfoQ 不符处,单列「事实校正」。

〇、费曼视角 · 一句话讲清

设想市面上有三家卖「智能手机」的:Claude Code 与 Codex 是把模型与外壳焊死的成品机——你拿到就能用,但想换颗螺丝都得找原厂;DeepSeek Harness(下称 dsh)则不卖整机,它卖的是一整套「手机图纸 + 可拆装的乐高模组」:电池(模型适配器)、摄像头(工具)、操作系统(Agent Loop)、屏幕(UI)、甚至「怎么打电话」的规矩(调度/权限),全是一个个能拔能插的插件

一句话:Claude Code 像 iPhone(闭源、垂直整合),Codex 像开源但成品化的「一加」,dsh 像安卓——它把「造手机」的全套图纸开源,让任何人拼出自己的 Agent。官方公式 Model + Harness = Agent:模型是千里马,Harness 是鞍辔缰绳——让马在真实世界里干活的整套工程。

然则天下无免费之宴:dsh 把「可换」做到极致,也把「稳定」推到最远。v0.1 距「能放心上生产」尚有漫漫长途。此乃后文 PK 之主战场。

一、它到底是什么(侦察结论 + 事实校正)

1.1 基本档案

内容
定位开源 Agent 运行时底座(Plugin-Centric / Concrete-harness),非功能固定的 Coding Agent
作者DeepSeek(幻方)
首发2026-08-13(开发者预览)
当前版本v0.1.0-rc.5(README 明示「THERE WILL BE COMPATIBILITY-BREAKING CHANGES」)
实现TypeScript / Node.js(需 Node ≥ 22.19);底座为 Cordis 插件元框架
规模49 包 monorepo,1981 个 TS 文件(外源估约 19.8 万行)
许可MIT(可闭源商用);但 README 明示暂不接收外部 PR,引导至 GitHub Discussions 与社区插件
启动npx @deepseek-ai/dsh web → 默认 http://127.0.0.1:3080(本机监听)
模型模型无关:默认 DeepSeek,provider 目录含 Anthropic/OpenAI/Bedrock/Vertex/Azure 及任意 OpenAI 兼容端点
首日星标各源悬殊(33k–65.6k),待官方定论;社区 topic dsh-plugin

1.2 四处事实校正(读码前极易被带偏,已逐项以真码核证)

常见说法核证结论依据
「四种模式 = 标准/PTC/极简/创造」内部命名为 Standard / Code(对外称 PTC 模式)/ Minimal / Creator;四者确为四套 cordis.yml preset 组合,非四套独立系统apps/cli/config/agent-presets/{standard,code,minimal,cordis}/agent.cordis.yml
「创造模式令 Agent 改写自身 Harness」半真,边界须正cordis_* 七工具齐备,动态包不可变、仅内存态(进程重启即失)纯 host 半激活无需审批(仅含浏览器 client 半的未授权包才 await-approval);「改自身」实为会话内临时叠加/换版本 + 借 tool-fs 写盘创作新 preset(需重启挂载),非运行中热替换当前装配tool-cordis/src/index.ts:148-379cordis-host-runner/src/sandbox.ts:6-7prompt.ts:7-8
「无特权内核(no privileged core)」成立但有边界:实现层——Cordis 服务层白名单门面、禁止服务返回 Context(denyContext);但 Host half 的 node:vm 沙箱自承「is not containment」,OS 级隔离另靠 packages/sandbox;契约语义层确有一「事实内核」(ctx. 服务键、agent/ 事件族、SessionEvent 类型、waterfall 分派)cordis-host-runner/src/guard.ts:669-781sandbox.ts:1-7docs/architecture.md:13,58,84
「记忆压缩/冲突清理/路径复用/Plan 校验是下一步重点」(InfoQ 专家)仅 compression 落地CompactionEngine 可替换缝 + BasicCompactionEngine 基础 provider 已实装;「长期记忆 / 自适应上下文压缩 ACP / 因果图检索」本版本代码与文档全无痕迹,属路线图而非已实现packages/compaction/*tool-ralph/src/index.ts:159(仅「工作区即长期记忆」一句设计陈述)

> 结论:dsh 的架构主张(一切皆插件、无特权内核、机械强制可观测性)代码级属实;但「创造模式自改 Harness」「无特权内核」「长期记忆」三处,InfoQ 与外部热文的表述均需在边界上打折。

1.3 Cordis 来历(外源 + 代码双证)

dsh 的底座 Cordis 源自 Koishi 生态的插件内核(cordiverse 组织维护),理论根基为论文 《A Programming Paradigm for Spatiotemporal Composability》(时空可组合,北大与 DeepSeek 研究者合著),已在 Koishi 实战四年。README.md:7 明确引用 Cordis 与该论文;仓库文档含「Koishi」字样,属同谱系前身。

二、架构鸟瞰(技术深拆)

2.1 第一性设计:微内核 + 插件星系

┌─────────────────────────────────────────┐ │ DeepSeek Harness (dsh) │ │ npx @deepseek-ai/dsh web │ └────────────────────┬────────────────────┘ │ 装配 (cordis.patch.yml, last-write-wins) ▼ ┌─────────────────────────────────────────┐ │ Cordis Context (微内核·无特权) │ │ 服务/事件/依赖 · Plugin挂载→effect │ │ 卸载→fiber.dispose() 一次性回卷 │ └──┬──────────┬──────────┬────────┬─────────┘ ┌────────────┘ │ │ └────────────┐ ▼ ▼ ▼ ▼ 模型适配器(llm) 工具注册(tools) 会话日志(session) 沙箱/权限(sandbox,guard) 可换:DeepSeek/ waterfall 拦截面 append-only OS级隔离 Anthropic/OpenAI/… pre→exec→post→result Turn/Step Windows/Linux/macOS │ │ │ deriveMessages │ ▼ ▼ ▼ ▼ Provider 插件 bash/fs/web/ model-visible Spawn/Fork/ skill/subagent means logged Ralph/workflow 机械强制 (Agent Loop 亦可换)

运行中的 dsh 本质上就是一个 Cordis Context:所有能力作为插件向 Context 注册服务、事件与 effect,最后由一份 cordis.yml 配置组装成可运行的 Agent。packages/extensions/cordis-host-runner/src/index.ts:7-8 直接 import { Context } from '@deepseek-ai/cordis'——Cordis 是真实内联框架,非营销名词。

2.2 四层配置合成(Profile → Bundle → patch → –patch)

配置合成是一条管道(apps/cli/src/dump-config.ts:30-52):bundle 层 → profile 自身 patch → home 可选 patch → --patch 覆盖层,按行 id 后写覆盖(last-write-wins)。dsh --dump-config不启动、不求值 !!js 的前提下纯合成并打印——配置即运行态,无漂移(packages/bundle/base/cordis.patch.yml:1-13)。这正是「一切皆插件」的操作入口:换能力 = 改配置,而非改源码。

2.3 三承重机制

其一,会话日志即唯一事实源(详第五章):Turn/Step 皆为日志事件,deriveMessages() 纯函数投影模型视图,且 agent-loop invariant 在每次派发前用 JSON.stringify 比对「即将发出的请求」与「日志重建结果」,不一致即 fail

其二,waterfall 拦截面(详 2.4):工具与 Agent 的关键决策点,是一串 around-middleware 事件瀑布。

其三,Capability Seam 三角色:可替换能力被规定为 服务定义(接口)/ 服务提供方(实现)/ 消费方(模型面向的工具)。其威力在「执行世界」抽象——文件系统与子进程共享同一 provider,把 provider 指向远端沙箱(仓库已有 E2B 概念验证),则 Bash/终端/LSP 整体迁移,消费方零改动。Subagent 是同一逻辑的极点:一个接口下并存六个 provider(详第四章)。

2.4 工具调用流水线(waterfall)

工具执行由 Cordis ctx.waterfall 驱动:tools/pre-execute → tools/execute → tools/post-execute → tools/result,外加 tools/code-dispatch-logpackages/core/tools/src/index.ts:1475-1666)。每个拦截监听器都拿到 next()必须显式调用才继续——不调用即中断链路。由此:

Hook/审批/权限/沙箱/超时全部串入同一条瀑布:超时挂 tools/executeguard/timeout-policy/src/index.ts:56)、沙箱提醒挂 tools/post-executeguard/repeat-tool-reminder/src/index.ts:213)、外部 Hook 桥(兼容 Claude Code/Codex 脚本)直接挂钩 tools/pre|post-executeagent/pre-stephooks/hooks-claude-code/src/index.ts:219-291)、审批 askpre-execute 返回 kind:'ask' 时触发(tools/src/index.ts:1479)。 – PTC 与普通调用共享同一安全观测:所有调用(模型驱动、workflow 脚本、subagent、ACP、remote)皆经同一个 ToolRuntime.execute 闸门(prepareExecutiontools/src/index.ts:1463-1507),故 PTC 子调用不能绕过审批与沙箱——InfoQ 此说代码坐实

2.5 沙箱 OS 级(非应用层「自觉」)

平台实现依据
WindowsCreateRestrictedToken(DISABLE_MAX_PRIVILEGELUA_TOKENWRITE_RESTRICTED)+ 原生 FFI,fails closedsandbox-windows-acl/src/token.ts:195-222
LinuxLandlock(@deepseek-ai/node-addon-landlock-run)/ bwrap(--ro-bind / / --die-with-parentsandbox-local/src/profiles.ts:16-36
macOSSeatbelt(sandbox-exec SBPL)sandbox-local/src/profiles.ts:51-58

bash-sandboxctx.sandbox.confine 串联(packages/shell/bash-sandbox/src/index.ts:88-179)。注意:Host half 的 node:vm 动态包沙箱自承「is not containment」(cordis-host-runner/src/sandbox.ts:1-7)——Creator 模式的信任边界依赖用户审批与人工把关,而非技术沙箱(详第三章)。

三、四种模式与创造模式(乙路核证)

3.1 四模式 = 四套 preset 组合

模式(内部名)基础工具集专属 diff用途
Standard文件编辑/Shell/检索/Skills/Plan/子代理/Workflow 全集常规 Agent 任务
Code(对外 PTC)继承 Standard 全集末行加 tool-presentation mode:code,wire 工具塌缩为仅 [run_code]模型写 TS 程序编排多步调用,把 5 轮往返压成 1 轮
Minimal仅持久 bash + str_replace_editorincludeRuntimeContext:false最小环境测模型
Creator(cordis)继承 Standard 全集追加 tool-cordis + 两 authoring skill运行时内省、试装插件、创作新 preset

PTC/Code 机制:模型只能直接调 run_codetools/src/code-mode.ts:20),在程序内以 await tools.name(args) 调原本独立工具;SDK 由系统提示生成,子调用作为嵌套执行仅外层结果入模型历史(code-mode.ts:1-6)。隔离跑在 ctx.codeRuntime 抽象 seam 上(worker-thread 后端)。

3.2 创造模式:cordis_* 七工具与真实边界

tool-cordis 定义 7 工具(tool-cordis/src/index.ts:42-379):cordis_define(不可变包定义,仅校验语法,不审批)/ cordis_run(激活,仅含 client 半的未授权包才 await-approval)/ cordis_stop / cordis_undefine / cordis_inspect_list|query|self(只读内省)。

真实能力边界: – 路径 A(内存态·临时)define+run 能让 Agent 在当前进程实时挂载模型写的 JS 插件、注册工具/服务、监听事件——确在「改正在运行的自己」。但仅内存态,重启即失;且是追加式换版本,不能就地热改当前已装载 composition。 – 路径 B(持久态·改预设):persona 允许 Agent 经 tool-fs 把新 cordis.yml 写至 ${DSH_HOME}/.agent-presets//,成为其他会话可挂载的 preset——但需重启/重新挂载方生效,且 PresetTree.write() 被刻意留空(preset 是输入而非自动回写目标)。

结论:Creator 能令 Agent「临时扩展运行时 + 持久创作新 preset」,但非运行中热替换当前装配;纯 host 半动态包激活无需审批即触达真实运行时(安全下限在此)。此正修正 InfoQ/外源「动态包激活前需审批」的笼统说法。

3.3 模式锁定

会话一旦开始(非空),服务端 agentPreset.select 硬性返回 agent-preset-lockedhost/apiproxy/src/api-proxy.ts:3105),仅 blank 会话可切——保可复现(preset 写入 session header 并 deep-frozen)。

四、多 Agent 编排(丙路核证)

4.1 Spawn / Fork / Ralph / Workflow

Spawnsubagent-spawn-in-process/src/index.ts:44):inheritsParentContext=false、无 seed,全新上下文子 Agent。 – Forksubagent-fork-in-process/src/index.ts:48-75):取父 session.events 中最后 turn/end 之前的前缀作 seed,inheritsParentContext=true,继承已完成回合(一次性快照,非活引用)。 – Ralphworkflow/tool-ralph/src/index.ts:90-177):写死的 JS 固定脚本for 循环每轮一个全新 structured-output 子 Agent,轮间仅传有界结构化 handoff;requireFreshProvider 强制 !inheritsParentContext,故只能跑在 spawn 上。模型只喂数据,不能改循环/provider/schema。 – Workflowtool-workflow/src/index.ts:138-150):模型手写 JS,在 worker-thread vm.Context 执行(workflow-worker-thread/src/runtime.ts:90-108),仅注入 agent/parallel/pipeline/phase/log/args 六钩子,无 fs/net/timer;parallel=Promise.all barrier,pipeline=每 item 串行穿 stage,并发/总数均设闸。

4.2 Subagent 接口:六 provider,仅 spawn/fork 默认开

ctx.subagents 是命名 provider 注册表(subagent/src/index.ts:171-202SubagentProvider 契约 types.ts:285-323)。内置 6 provider:

provider形态默认
spawn / forkin-process
claude-code(官方 Agent SDK CLI)out-of-process
codexcodex app-server --stdioout-of-process
acp(任意 ACP 子进程,permission 默认 rejectout-of-process
dsh-sdk(完整 dsh 运行时 via TS SDK)out-of-process

基础 bundle cordis.patch.yml:295-329 仅装 spawn+fork;claude-code/codex/acp/dsh-sdk 全 opt-in。确能把 Claude Code/Codex 经同一 subagent 工具委托出去(接口一致,tool-subagent/src/index.ts:29-31Config.provider 为任意已注册名)——这是架构抽象之妙,亦是「不绑模型、甚至不绑自家 Agent」的明证。

4.3 编排范式判定

dsh 的多 Agent 是受父 Agent/父脚本编排的 Worker 集合,即层级式 Supervisor–Worker:父拆解/分配/汇总,子执行;通信严格 parent↔child,无 sibling 直连;深度闸默认 maxDepth:3 巩固树状。全仓 grep swarm/self-organ/blackboard/peer-to-peer/negotiat 在编排域零命中——距真正 Swarm(自主发现/协商/竞争/动态接管/网状拓扑)有结构性差距,缺口在契约层无 Agent 对等原语,非「未实现某函数」。

故「架构有新意、编排范式无突破」成立(有代码硬证):把 Spawn/Fork/外部竞品/协议 Agent 统一到同一契约,确是清晰架构抽象;但编排本身未超出既有范式。

五、统一事件流与可观测性(丁路核证)

5.1 SessionEvent:唯一事实源 + 机械强制

一次运行拆为 Turn(零或多个 Step)/ Step(一次模型请求 + 工具调用),皆为 SessionEventMap 边界事件(session/src/types.ts:243-297)。「model-visible means logged」是运行时强制,非口头约定agent-loop/src/invariant.ts:39-52llm/stream 派发前,用 JSON.stringify 比对「即将发出的请求 options.messages」与「session.deriveMessages() 重建结果」,不一致即 fail;并比对 request/header 重建。

Session.deriveMessages() 沿 surface 折叠 deriveEventMessage()session/src/index.ts:726-747surface.ts:83-114),纯函数投影 user/messageassistant/messagetool/result 三类——模型历史从不单独存储,从日志派生;回放即同事件再派生docs/subsystems/session.md:5)。

5.2 Trajectory:按来源看「模型当时所见」

来源由 user/message.source 标注(MessageSourceMap = user|plugin|model|toolllm/llm/src/message.ts:100-105),pluginContextForm(instructions/catalog/snapshot/notice/relay/recall)覆盖系统提示/推理/工具/子Agent/上下文注入五轴。session-query 包提供 traceEvent/sourceEventSeqs/derivedEventSeqs 引用级溯源(tool-session-query/src/operations.ts:54-237),UI 在 ui-trajectory 组装轨迹节点。:代码库无名为 Trajectory 的单一服务,它是 surface + request/header + session-query + ui-trajectory 的组合概念。

5.3 恢复/分叉/回放共用同流 + 崩溃修复

Fork:取源会话前缀事件深拷贝为子 seed,原会话不受影响(session/src/index.ts:1081-1138)。 – Resume:取完整存储日志(index.ts:495)。 – 检索/回放:直读同一 SessionEvent 流。文档明示「Fork, resume, transcripts, telemetry, and persistence all derive from this stream」(docs/architecture.md:94)。 – 崩溃修复repair.ts:27-133 扫描「有调用无结果」的工具调用,合成 TOOL_OUTCOME_UNKNOWN/TOOL_NOT_STARTED,补 step/endturn/end{interrupted}interrupted 原因循环从不产生,专由恢复合成(types.ts:170-173)。 – 自动续跑需「经人授权的 Resume」docs/glossary.md:27 明确 goal activation 刻意不进持久回放,resume/fork 后须人授权 resume 方自动工作——印证 dsh 假定「人坐在前面」,自动性是特权而非本职。

5.4 压缩与长期记忆(早期能力)

CompactionEngine 可替换缝 + BasicCompactionEngine 基础 provider 已落地(回放前缀复用 KV cache 摘要)。但 InfoQ 专家所言「长期记忆 / 自适应上下文压缩 ACP / 因果图检索」本版本代码与文档全无痕迹——属路线图。冲突清理仅见 surfacereplace 阴影语义,路径复用/Plan 校验无直接对应代码。

六、对比坐标(代码事实 + 外部常识,后者标「外部」)

维度dsh(Plugin-Centric)Claude Code(闭源成品·外部)Codex(Rust 内核+双形态·外部)Anthropic Managed Agents(Interface-Centric·外部)
内核无特权微内核:Cordis 插件树闭源单体精品Rust 单体内核 + CLI/云端解耦 Agent/Environment/Session 三组件
多 Agent层级式 Supervisor–Worker(树)子 Agent 委派子 Agent/沙箱托管式、可被外部编排调用
对外委托SubagentProvider 可挂 claude-code/codex/acp(opt-in)自身即被委托方自身即被委托方dsh 经 ACP 可对齐
现场脚本是:workflow 写 JS(vm,无 fs/net)无(外部)无(外部)无(接口而非脚本)
上下文工程契约层:日志为唯一事实源极致上下文工程(外部)强上下文/沙箱(外部)接口定义上下文边界
稳定层「无特权内核」但契约语义层有事实内核产品即稳定层闭源代码即稳定层公开接口(wake/emitEvent)承诺稳定
许可MIT,不绑模型闭源商用开源 CLI + 闭源云端云服务一部分

> dsh 属 Concrete-harness(给出实现、允许替换);Managed Agents 属 Meta-harness(定义接口、不假设实现)。二者非替代:dsh 的 Loop 是可替换服务,一个实现 wake/emitEvent 的 provider 即可跑在托管平台之上;反之 Managed Agents 的接口亦可被 dsh 的 Subagent 缝吸收。真正竞争在生态标准位——谁的事件语义与接口形状成行业默认,谁握「稳定层」。

七、评价与风险(PK InfoQ 观点)

7.1 InfoQ 诸论,代码如何应答

「一切皆插件价值,在留替换/组合/试验空间」——成立。代码证实 Loop/模型/工具/UI 全可换,且「无特权内核」使外部作者与官方同平面。 – 「多 Agent 架构有新意、范式无突破」——成立(§4.3 代码证)。 – 「真正差距在局部:记忆压缩/冲突清理/路径复用/Plan 校验」——部分成立:仅 compaction 落地;长期记忆/因果图检索无迹,路径复用/Plan 校验无直接代码。InfoQ 专家把「路线图」说成「已确定方向」,措辞可更谨慎。 – 「差异化押注架构开放」——成立且深远:MIT + 不绑模型 + 可替换 Loop,把「模型之外如何工作」交给社区。

7.2 「什么都能换」不自动等于「更好用」

插件边界越深,五难随之而至(v0.1 尤甚): 1. 接口稳定性:契约语义层的事实内核(ctx./agent//SessionEvent)动不得,否则全生态断裂;README 明示破坏变更在即。 2. 依赖管理/版本兼容:49 包 monorepo,早期进入者承受高迁移成本。 3. 性能开销:waterfall 逐拦截 next()、日志逐事件投影,长任务有累积成本。 4. 调试复杂度:错误散落多插件,需 Trajectory 回放方能定位。 5. 生态治理暂不收外部 PR,社区插件质量与跨版本稳定性待验。

7.3 战略解读:Commoditize Your Complement

dsh 与 DeepSeek 模型是软协同——适配器默认路由 DeepSeek,但无硬绑定(上下文缓存计量对齐模型 API 形态,仅此而已)。这与 DeepSeek 一贯开源策略同构:模型权重如此,harness 亦如此——互补品免费且通用,需求自然流向最好的模型

双刃:MIT + 通用模型缝意味着竞品可零成本接入,harness 无法成模型护城河;此交易成立的前提是 DeepSeek 模型持续居 Agentic 能力第一梯队。商业化出口已被架构预留——无特权内核恰好允许把差异化能力(云端编排、托管运行时、企业治理)做成闭源 Bundle 挂开放底座,即「开放平台 + 私有云端 Profile」的 open-core 形态。

同期信号:DeepSeek 于 8-13 发布 V4-Pro 的同时,V4-Pro API 将于 8-16 起涨价约 4.6×(剃刀+刀片:送运行时、收推理)。开发者是否愿为开源底座承受涨价模型费,是未来十二个月的关键问。

八、结论

DeepSeek Harness v0.1 是迄今最激进的「一切皆插件」Agent 运行时:代码级证实其无特权微内核、机械强制的可观测性(model-visible means logged)、OS 级沙箱、以及把 Claude Code/Codex 接到同一 Subagent 接口的架构抽象。它不止是「DeepSeek 版 Claude Code」——它是把「造 Agent」的图纸开源。

然其成败不在当下体验,而在三件事: 1. 「可替换空间」能否转化为「稳定开发标准」——契约语义层的事实内核必须冻结,否则生态无根; 2. 官方能否给出高质量默认插件 + 可信组合范式 + 可信评测——插件系统给的是差异化空间,不是成功率; 3. 第三方是否围绕它持续构建——暂不收外部 PR、破坏变更在即、同日模型涨价,皆考验生态意愿。

v0.1 仍是一张设计蓝图:破坏变更在即、长期记忆未落地、Swarm 无原语、自动续跑需人值守。它最值得观察的,不是「今天多好用」,而是「一切皆插件」能否长成更多 Agent 产品共同采用的底层 Harness,还是止步于 DeepSeek 自己的 Coding 产品雏形。

附:四路专项报告原始路径(供溯源)

– 甲·Cordis 与工具流水线:deepseek-harness-research/report-甲.md – 乙·四模式与创造模式:deepseek-harness-research/report-乙.md – 丙·多 Agent 编排与对比:deepseek-harness-research/report-丙.md – 丁·统一事件流与可观测性:deepseek-harness-research/report-丁.md

发表回复

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网 🐾 智柴网 沪ICP备2024052574号-1