事情是这样的。
8月13号深夜,DeepSeek在官宣V4-Pro转正和涨价预告两小时后,甩出了第三张牌:智能体框架DeepSeek Harness,代号dsh。
MIT协议,全量开源,TypeScript monorepo,50多个包。上线数小时2000+星,24小时内冲到4.6万星。
但真正让我停下来仔细看这个项目的,不是星数,而是它的一句话。
官方架构文档的开头几乎没废话,直接给结论:
每个部分都是插件,包括模型适配器、工具注册表、会话日志和agent loop本身,所以每个部分都可以从配置替换。
注意最后半句:没有特权核心。
这句话的分量,得先理解了现在Agent框架的普遍做法,才能体会。
Agent框架的三种范式,和DeepSeek的第四种
现在的Agent harness,大致分三派。
第一派是闭源深度集成派,代表是Claude Code。产品核心加插件附加,核心loop是黑盒,深度绑定Anthropic自家模型。插件市场很热闹,但插件只能加功能,改不了循环本身。你没法说"我不想用你这套agent loop,我要换一套"。
第二派是社区单点突破派,代表是Reasonix。DeepSeek原生,Go单二进制,围绕V4的缓存经济学做到极致。三段式上下文——不可变前缀、只追加历史、易失草稿区——硬保字节稳定,实测缓存命中率99.82%。GitHub 33.9k星。代价是单供应商锁定,这也是社区对它的最大争议。
第三派是通用开源派,Qwen Code、OpenCode是代表。兼容一切模型,能力均衡,但对V4的thinking模式细节没有专门适配。
DeepSeek Harness是第四派,官方原生派。
它不是"适配DeepSeek的通用harness",是"DeepSeek自己写的、从模型规格出发设计的harness"。这不是营销话术,是从源码里能看到的差异。
没有特权核心,是什么意思?
让我把这个概念拆开讲。
在Claude Code里,agent loop是产品核心,插件机制挂在外面。你能加工具、加技能,但改不了循环本身。核心是神圣不可侵犯的。
在dsh里,循环是core/agent-loop这个包,和一个普通插件平级。想换循环?注册你自己的ctx.agentLoop就行。
这不是"更开放一点",是架构哲学的根本不同。

官方文档里有一句话值得反复读:
没有需要patch的特权核心:你通过在旁边挂一个插件来扩展dsh,注册是effect,插件卸载时自动回卷。
"注册是effect",这是函数式编程的说法。插件挂载时注册的东西——服务、事件监听、工具——卸载时自动回滚,不留半死的监听器、不残留孤儿状态。这让"装一个插件试试,不合适拔掉"变成真正安全的操作。
还有更实在的一点:架构文档里有一张"新行为放哪"的表,几十行。从"加模型provider(注册ctx.llm)"到"加终端执行(注册ctx.terminals后端)"到"fork一个活会话(ctx.sessions.fork())",每个扩展点都有归属。想改harness的行为,不用翻源码找地方插桩,查表找到对应的注册点即可。
整张表加起来,就是官方给"harness能做什么"下的定义。
Cordis:这一切的底座
dsh建在Cordis插件系统之上。Cordis是一个为"时空可组合性"而设计的元框架,有专门的论文。
Cordis本身只负责一件事:插件的加载、卸载和依赖关系管理。dsh的所有具体组件——模型适配器、工具注册表、会话日志、agent loop——都是不同的Cordis插件。
这意味着什么?
想换模型提供商?替换模型插件。想换沙箱?替换沙箱插件。想要完全不同的agent循环?挂载你自己的插件。
不需要fork仓库,不需要改源码。
profile和bundle:插件怎么组合起来
"一切皆插件"听起来很美好,但要落地,得回答一个问题:插件按什么顺序、以什么组合装上?
dsh的答案是profile加bundle的分层模型。
一个运行中的dsh,是一棵插件树,由启动时按序叠加的层组成:
profile(命名组合)
└─ bundle 列表(按声明顺序叠加)
├─ dsh-base 第一层:模型适配、工具、持久化、沙箱
├─ dsh-web-app 第二层:浏览器应用
└─ dsh-headless 备选:一次性runner
└─ cordis.patch.yml 覆盖层
bundle是插件的发行格式。profile是命名的组合,官方自带web和headless两个模板。
最妙的是patch机制。patch按id定位一行配置,整行替换或插入新行。
你跑一行命令:
dsh --profile web --dump-config
打印出来的每一行,都能用你自己的patch覆盖。想换掉某个模型适配器、关掉某个工具、替换沙箱策略,写几行patch就行。
这是"可编程harness"的落地形态。配置即编程,而且配置本身可以被程序生成。
四种运行模式,四种活法
dsh提供四种运行模式,每种默认加载不同的插件集合。

标准模式,完整的工具组合,日常Agent工作。
PTC模式,这是dsh的特色。PTC是Programmatic Tool Calling,程序化工具调用。模型不再逐次发起多个工具调用,而是生成一段代码,由这段代码编排多个工具调用的顺序。这减少了往返次数、提升了可靠性,也让模型能以更富表现力的方式组合工具。
极简模式,仅保留一个shell工具和文件编辑工具。这是官方9项benchmark的跑分环境。7月31日官方文档里说"极简模式即将发布",现在就是仓库里checked-in的Python例程。官方分数从此可以自己复现。
创造模式,检查当前运行时、在内存中试验Cordis插件,据此组合和创作新的模式。对插件开发者来说,这是最实用的环境——无需重启即可设计dsh的下一种配置。
追记式会话日志:模型看到的一切,都有迹可循
dsh最受开发者欢迎的特性之一,是它的可观测性。
每一次运行都有迹可循。模型看到的一切——系统提示词、思维链、工具调用与结果、子Agent调度、每一次上下文注入——都会写入追记式(append-only)会话日志。
在Trajectory视图中,你可以按来源查看这些信息。由于日志是追记式的,任何内容都不会被静默改写。

这个设计带来了一个贯穿全文的不变量:
模型能看到的必然已入日志。
模型历史不是"状态",是从session log投影出来的。fork、resume、telemetry、持久化,全部从这条流推导。
恢复、分叉、检索与回放,共享同一份事件流。你可以从断点恢复会话、向新方向分叉、检索历史记录。
对于构建生产级Agent的团队而言,这种级别的可追溯性意味着"知道"而非"猜测"。当Agent运行出错时,会话日志会精确展示模型在每一步看到了什么——确切的系统提示词、确切的工具输出、确切的上下文注入。
事件系统:三种域,一个流
插件之间怎么通信?dsh的事件系统把扩展点分了三个域。

session事件,包括session/event、turn/、step/、tool/*。这些是持久事实,追加进会话日志,重启后存活。
agent事件,包括agent/pre-step、agent/request、agent/turn-stopping。这些观察和拦截飞行中的工作,携带活着的Agent。
capability事件,包括fs/、tools/、telemetry/*。不import循环也能挂策略与适配器。
这里有个细节值得注意。step是一次模型请求加上它调用的工具;turn是零到多个step,从第一条输入开始,到没有任何未清账的请求为止。turn打开在第一个输入被认领之前,关闭在"什么都不欠"之后。这个账本模型让会话有了明确的边界。
两类监听的差别也很关键:agent/pre-step、agent/request这些是瀑布,监听者必须调next()把控制权交给下一个;agent/turn-stopping是串行钩子,没有next。瀑布适合"加工",串行适合"把关"。选错域是新手最常见的错。
直连V4:适配器里的DeepSeek细节
别的harness接DeepSeek靠OpenAI兼容端点。dsh自带一个直连适配器@deepseek-ai/dsh-llm-deepseek,直接fetch加SSE打官方chat-completions接口。

这套适配器里藏着几个只有DeepSeek用户才懂的细节。
第一个是reasoning passback规则。V4在thinking模式下有个硬性要求:带工具调用的assistant轮次,历史里必须回传reasoning_content,否则400。适配器把这条做成了规则——带工具调用的轮次原样回传,没有工具调用的轮次直接丢弃。一句话同时解决了正确性和省token的问题。
这是拿Claude Code的兼容端点跑V4时踩过的坑。兼容端点直接忽略thinking budget字段,官方适配器把坑填平了。
第二个是reasoning effort的三档配置。off、high、max,high和max序列化成官方顶层reasoning_effort,off序列化成thinking: {type: 'disabled'}。部署方可以加一把锁,锁上之后任何请求都不能开thinking。还有个细节:给会话起标题的请求强制关thinking,起个标题不值得烧推理token。
第三个是数字都是照着V4的规格写的。contextWindow默认1,000,000,maxTokens默认256,000,缓存计量直接读prompt_cache_hit_tokens。
但dsh不是只认自家模型的封闭壳。同一个LLM seam上,直连适配器注册的是deepseek-official路由,另一个适配器llm-pi-ai提供多provider聚合。加上配置里models字段完全开放,这个"官方harness"从第一天起就不是封闭的。
为什么这件事重要
说回最开始那句话。
"没有特权核心"。
这句话的深层含义是:dsh不是在卖一个Agent框架,是在定义一种Agent框架的架构范式。
过去两年的Agent框架,不管是闭源的Claude Code还是开源的LangChain,本质上都是"核心加扩展"的思路。核心是神圣的,扩展是附加的。你在核心允许的范围内做定制,超过这个范围,你就得fork或者换框架。
dsh把这条线打破了。包括agent loop本身在内的一切,都是可替换的。这不是"更开放",是"开放"变成了底层性质,而不是附加功能。
这让我想起一个更大的趋势。Agent框架正在从"框架"走向"操作系统"。一个框架告诉你"你可以这样做",一个操作系统告诉你"你想怎么做都行"。dsh显然在朝后者走。
当然,v0.1开发者预览版还有很多路要走。官方自己说了,未来会有破坏性兼容变更。但方向已经定下来了。
一句话总结
DeepSeek Harness带着一个大胆的判断进入Agent基础设施领域:Agent Harness的正确架构,就是一切皆插件。
从模型到工具,从会话到循环,没有什么是不能替换的。
npx @deepseek-ai/dsh web,一分钟内就能跑起来。
大时代啊,朋友们。
夜雨聆风