最近 DeepSeek 开源了 DeepSeek Harness,项目介绍里有一句很醒目的话:Everything is a Plugin。
看到这里,我第一反应是:这和我正在做的 Hold Rein 很像。
Hold Rein项目地址:
Hold Rein 同样不是一个"给模型套聊天界面"的项目,而是把模型放进一个可持续运行、可以调用工具、可以管理上下文、可以扩展能力的运行时里。两者都在回答同一个问题:
大模型本身只是 Agent 的一部分,真正决定它能否稳定完成任务的,是模型周围的运行环境。
不过,"相似"不等于"相同"。如果把两者都简单称为"插件化 Agent",反而会错过它们在架构目标、插件边界和产品形态上的差异。
本文基于 Hold Rein 当前实现,以及 DeepSeek Harness 官方仓库和架构文档的公开信息进行对比。DeepSeek Harness 仍处于 developer preview,后续 API 和目录结构可能发生兼容性变化,因此本文比较的是当前公开版本的设计方向,而不是最终产品承诺。
先说结论:它们属于同一个方向,但不是同一个产品
可以先用一句话概括:
Hold Rein 更像一个本地优先、模型无关、面向项目和长期任务的 Agent 工作台;DeepSeek Harness 更像一个以 Cordis 为内核、把整个 Agent 运行时拆成可重组插件树的通用 Harness。
两者的共同点在"运行时思维",差异在"运行时如何被组织"。
| 对比维度 | Hold Rein | DeepSeek Harness |
|---|---|---|
| 核心定位 | 本地 Agent 工作台 / 运行平台 | Agent Harness / 可组合运行时 |
| 插件范围 | 服务端插件 + Web 插件 | 模型适配器、工具、会话、Agent Loop 等都可插件化 |
| 组合方式 | 插件贡献 tools、skills、system prompt、路由和 UI | profile、bundle、patch 组成插件树 |
| 模型策略 | 模型无关,支持多提供商和自定义 endpoint | 官方项目围绕 DeepSeek 生态展开,同时保留适配器扩展点 |
| 工作对象 | 工作区、任务、插件、技能、定时任务 | session、agent、tool、event、profile |
| 交互形态 | CLI 启动 + 浏览器控制台 | Web、headless 等 profile 模式 |
| 长任务能力 | session 持久化、子 Agent、continuation、定时任务 | session event log、turn/step loop、fork/resume、agent 事件 |
| 当前取舍 | 更偏产品化和项目协作 | 更偏运行时抽象和组合能力 |
这个表格里最容易被忽略的是:两者并不是在竞争同一层。
Hold Rein 试图把 Agent 运行时做成开发者可以直接使用的工作台;DeepSeek Harness 试图把 Agent 运行时本身做成一个可以被重新拼装的系统。
什么是 Harness:从"调用模型"到"管理一次任务"
一个最小的模型调用大概是这样:准备消息,发送请求,拿到回复。
但真实任务通常是一个循环:
text
用户目标
-> 选择上下文
-> 组装 prompt 和工具 schema
-> 请求模型
-> 执行工具
-> 收集结果
-> 检查状态、权限和错误
-> 继续下一步或结束
这个循环还需要处理会话持久化、上下文裁剪、失败恢复、审批、子任务、用量和可观察性。包住模型并负责这套循环的那一层,就是 Harness。
所以 Harness 不是一个更长的 system prompt,也不只是一个 tools 列表。它决定模型能看到什么、能做什么、做完以后系统如何判断"这一步是否真的完成"。
Hold Rein 从一开始就沿着这条思路设计:工作区是上下文边界,任务是运行单元,session 保存过程,插件向运行时贡献能力,事件把执行过程暴露出来。DeepSeek Harness 的官方架构文档则把这个思路推得更彻底:模型适配器、工具注册、session log、Agent 接口和 Agent Loop 都由插件提供,不存在一个必须被修改的"特权核心"。
相同点一:插件不只是工具函数
很多框架把插件理解成"多提供一个函数"。Hold Rein 和 DeepSeek Harness 的共同点,是插件可以影响 Agent 的运行方式。
在 Hold Rein 中,服务端插件可以贡献:
- tools
- skills 和 skillDirs
- system prompts
- 自定义 API routes
- Agent 事件订阅
- 任务结束后的 continuation
Web 插件还可以增加工具结果渲染、右侧面板、发送框动作、设置页和浏览器侧交互。
因此,一个代码图插件可以改变 Agent 获取项目上下文的方式;一个记忆插件可以在任务结束后整理并写入工作区;一个自我管理插件可以让 Agent 读取和调整平台配置。
DeepSeek Harness 的插件边界更靠近运行时内核。官方文档列出的核心插件包括 core/session、core/system-prompt、core/tools、core/agent、core/agent-loop 和 llm/llm。换句话说,在 dsh 里,工具只是插件的一类,连"怎样保存会话"和"怎样驱动 Agent Loop"都可以被替换。
共同点是能力可插拔;差异是插件插入的层次不同。Hold Rein 更强调扩展一个已经可用的工作台,dsh 更强调整个工作台本身可以重新组装。
相同点二:上下文是运行时状态,不是一次性字符串
在简单 Demo 里,上下文就是 messages 数组。长任务里,这个模型很快不够用:工具结果会不断增长,用户会中途追加要求,任务可能暂停后恢复,还可能需要从某个节点派生子任务。
Hold Rein 的上下文来源包括当前工作区、任务记录、session 消息、技能、插件注入的 system prompt,以及工具调用产生的结果。工作区路径会进入 Agent 的运行上下文,插件可以根据项目类型决定应该暴露哪些能力。
DeepSeek Harness 则把 session event log 作为上下文的事实来源。官方架构文档明确提到,模型历史由日志投影得到,fork、resume、transcript、telemetry 和持久化都从这条事件流派生。这样做的价值是:只要某个内容真正进入模型请求,就应该能够从日志中重建出来。
两种实现的共同目标都是可恢复、可追踪、可继续;不同点在于,Hold Rein 以"工作区 + 任务"作为用户理解系统的主线,dsh 以"事件日志 + Agent 事件"作为运行时的主线。
相同点三:都把长任务拆成可观察的步骤
Hold Rein 支持运行中任务管理、工具审批、Agent 事件、子 Agent 和 continuation。它不要求一个请求一次性完成全部工作,而是允许 Agent 在工具调用之后继续推进,必要时暂停、取消或把部分任务交给子 Agent。
DeepSeek Harness 对执行过程的抽象更细:一个 turn 可以包含多个 step;一个 step 是一次模型请求和它调用的工具。agent/pre-step、agent/request、tools/pre-execute、tools/post-execute 等事件可以观察或拦截执行过程。
这说明两者都不把"模型返回文本"当成任务完成,而是把一次任务看成一组可检查的运行步骤。对于调试、审计和失败恢复,这个转变非常重要。
最大差异:Hold Rein 的插件是"平台扩展点",dsh 的插件是"系统构成单元"
这是两者最核心的区别。
Hold Rein:在一个工作台上扩展能力
Hold Rein 有一个相对稳定的平台骨架:CLI 负责启动本地运行时,Web 控制台负责交互,后端管理工作区、模型、任务、定时任务和用量。插件通过明确的 Server Plugin 和 Web Plugin 接口接入。
这种设计的优点是上手直接。开发者不需要先理解整个运行时,只要初始化一个插件包,就可以增加工具、技能、接口或 UI。插件开发命令也很明确:
bash
hold-rein plugin init --path ./plugins --name my-plugin
hold-rein start --plugin-dev ./plugins/my-plugin
这是一种"平台提供稳定扩展 API"的思路。
DeepSeek Harness:把运行时本身拆成插件树
DeepSeek Harness 使用 Cordis 组织共享上下文、服务、类型化事件和可逆效果。官方文档强调:每个产品部分都是插件,并且没有必须直接修改的特权核心。
一个 dsh profile 会按顺序叠加多个 bundle,再应用 profile 和用户自己的 patch。web 和 headless 可以是不同的组合模板;用户也可以通过 patch 替换某个配置行或插入新的配置。
这是一种"系统由插件组合而成"的思路。
两者都支持扩展,但扩展对象不同:
text
Hold Rein:平台核心 + 插件
DeepSeek Harness:插件树 + profile = 平台实例
模型无关和模型协同:两种合理选择
Hold Rein 把模型无关作为产品定位的一部分。用户可以配置不同模型提供商、模型和自定义 endpoint,工作区和任务不需要绑定到单一厂商。这适合多模型路由、企业内部 endpoint、本地模型和成本控制等场景。
DeepSeek Harness 则是 DeepSeek 生态的一部分,运行时对 DeepSeek 模型和相关开发体验会有更强的协同空间。它并不意味着"只能使用一个模型",但它的产品价值会和 DeepSeek 的模型、工具链和开发者生态更紧密地结合。
这不是谁更先进的问题,而是平台边界不同:
- 如果你希望把 Agent 当作跨模型的基础设施,Hold Rein 的模型无关更合适。
- 如果你希望围绕 DeepSeek 模型打造一套深度优化的 Agent 体验,DeepSeek Harness 的协同路线更有吸引力。
产品工作台和运行时内核:关注点也不同
Hold Rein 额外关注很多"把 Agent 用起来"所需的产品能力:
- 面向真实项目的工作区。
- 浏览器中的任务和文件交互。
- 定时任务,让 Agent 按计划运行。
- 用量统计,帮助理解 token 和成本。
- 插件对应的 UI 面板和工具结果渲染。
- 面向用户的模型、技能和插件管理。
DeepSeek Harness 的公开架构文档则更集中在运行时骨架:session log、system prompt 组装、tool registry、agent loop、profile、bundle、patch、event 和 capability seam。它提供 Web 和 headless 形态,但重点是让同一套运行时能力可以按配置重新组合。
可以把它们看成两层视角:
text
Hold Rein:我如何把 Agent 变成一个可长期使用的项目工作台?
DeepSeek Harness:我如何让 Agent 运行时的每个部件都能被替换和重组?
一个具体例子:加入"代码图能力"时,两者会怎么做?
假设我们想让 Agent 理解一个陌生仓库的依赖关系。
在 Hold Rein 中,可以开发一个代码图插件:
- 服务端建立或更新代码关系索引。
- 向 Agent 暴露查询上下游节点的工具。
- 通过 skill 和 system prompt 告诉 Agent 什么时候先查关系、什么时候再读文件。
- Web 端提供项目关系图面板,让人和 Agent 使用同一份导航信息。
插件完成后,它是 Hold Rein 工作台里的一个可选能力。
在 DeepSeek Harness 中,可以把代码图能力拆成一个或多个插件,接入工具注册、上下文注入或事件管道;还可以通过 profile 或 patch 决定这个能力是否出现在某一类 dsh 实例中。
它的自由度更高,但也意味着开发者需要理解更多运行时扩展点,以及插件之间的组合关系。
哪些地方不能简单地说"Hold Rein 已经等同于 DeepSeek Harness"?
这里需要主动划清边界。
第一,Hold Rein 的插件系统和 dsh 的 Cordis 插件树不是同一个实现。Hold Rein 有自己的插件接口、服务端/Web 双端贡献模型和任务生命周期;dsh 有自己的 context、service、event、profile、bundle 和 patch 机制。
第二,二者的成熟度和公开信息不同。DeepSeek Harness 官方仓库明确标注为 developer preview,并提示可能出现兼容性破坏;Hold Rein 也仍在快速迭代,不能把文章中的架构描述理解成稳定版本承诺。
第三,Hold Rein 当前更像完整的本地产品,dsh 当前更像可编程的 Harness 基座。前者更关注用户能否配置、运行和管理任务,后者更关注开发者能否替换运行时部件。
因此,更准确的说法不是"Hold Rein 复制了 DeepSeek Harness",而是:
Hold Rein 和 DeepSeek Harness 在 Agent Harness 这一层产生了相同的设计判断:Agent 的核心竞争力不只来自模型,而来自模型、工具、上下文、状态和执行环境的组合。但它们选择了不同的工程落点。
从这次对比得到的几个设计启发
1. 插件 API 的边界比插件数量更重要
插件多不代表系统可扩展。真正重要的是:插件能否安全地贡献能力,能否卸载,能否按工作区或 session 隔离,能否被用户观察和控制。
2. 所有模型可见信息都应该可追溯
无论采用工作区上下文还是事件日志,都需要回答一个问题:模型为什么看到了这段信息?如果无法重建上下文,调试和复现就会变得困难。
3. 长任务需要状态机,而不是更长的 prompt
任务恢复、审批、取消、重试、子 Agent 和定时唤起,本质上都是状态管理问题。Prompt 只能描述规则,不能替代运行时状态。
4. Harness 应该和模型解耦,但不必拒绝模型协同
模型无关有利于迁移和成本控制;针对特定模型做缓存、协议和工具优化,又能获得更好的体验。一个好的架构应该让这两种策略可以共存。
5. Web UI 不是 Harness 的全部,但会决定它是否真正可用
运行时抽象决定上限,任务记录、审批、日志、配置和可视化决定日常使用的下限。把两者连接起来,才是一个真正能进入开发流程的 Agent 平台。
最后:Hold Rein 想继续往哪里走?
DeepSeek Harness 的出现,让"Agent Harness"从一个相对小众的工程概念进入了更多开发者的视野。对 Hold Rein 来说,这不是简单的概念追随,而是一次很好的对照:我们正在做的工作区、session、插件、技能、子 Agent、审批、定时任务和用量统计,确实都属于模型之外的 Agent 运行时。
接下来 Hold Rein 还可以继续加强几个方向:更明确的事件模型、更细粒度的能力隔离、更好的上下文可视化、更可靠的任务恢复,以及让插件能够在不破坏平台稳定性的前提下组合出不同的 Agent 工作流。
最后用一句话收束这篇文章:
模型决定 Agent 能走多远,Harness 决定它能不能在真实世界里走完。