












最近深度读了两个很有代表性的 Agent 项目:
它们都在解决同一个问题:怎样把“大模型 + 工具调用”变成一个能够长期运行、可以恢复、可扩展、可治理的 Agent 系统。
但读完代码后,我发现它们其实不在同一条赛道上。
DeepSeek Harness 更像一套为 Coding Agent 产品准备的可组合运行时内核;AgentScope Java 更像一套面向 Java 企业应用的Agent 框架、Harness 与服务平台。
如果只看 README,容易得出“两个项目功能差不多,只是一个用 TypeScript、一个用 Java”的结论。真正进入源码后,会看到两套完全不同的架构取向:
先说我的结论:
如果你想造一个 Coding Agent 产品,或者深度定制 Agent Runtime,DeepSeek Harness 更值得研究;如果你想把 Agent 纳入现有 Java 企业系统,并进一步做成可运营的服务,AgentScope Java 路线更直接。
在讨论这两个项目之前,先要回答一个基础问题:什么是 Harness?
一个最简单的 Agent 循环通常只有几步:
这只是 ReAct Loop。真正进入生产后,系统还要处理很多模型并不关心、但工程上无法回避的问题:
Harness 就是包围在模型循环之外的这一整层工程系统。
从这个定义看,两边虽然都叫 Harness,但边界不同。
DeepSeek Harness 的产品边界从底层事件、工具和文件系统能力,一直延伸到 Web UI、CLI、SDK 和插件开发体系。运行中的 dsh 本身就是一棵插件树。
AgentScope Java 则更明确地分成三层:
agentscope-core 提供模型、消息、工具、事件和 ReActAgentagentscope-harness 在 Core 之上叠加工作区、记忆、压缩、技能、子 Agent、沙箱等能力agentscope-service 再向上提供 Agent 注册、Session 管理、团队编排、Dashboard 和分布式控制面所以,更准确的对比不是“框架 A 对框架 B”,而是:
一套高度可组合的 Agent 产品运行时,对比一套 Java Agent 框架及其生产服务平台。
DeepSeek Harness 最鲜明的设计不是工具多,也不是 UI 完整,而是它真的贯彻了“一切皆插件”。
底层的 Cordis 提供共享 Context、服务注册、类型化事件和可撤销副作用。模型适配器、工具注册表、会话日志、Agent Loop,甚至持久化与沙箱策略,都是挂载在同一棵树上的插件。
这意味着系统里没有一个必须不断打补丁的“神圣内核”。一个插件注册服务、工具或监听器时,这些注册都会绑定到插件生命周期;插件卸载时,副作用也会被撤销。依赖服务消失,消费它的插件会一起卸载;服务恢复后,再重新加载。
这套设计带来三个很强的能力。
传统框架常见的“可插拔”,其实只是允许你传一个接口实现。DeepSeek Harness 的粒度更细:
例如把本地文件系统和进程执行替换成 E2B provider,Shell、文件工具等消费者可以继续复用同一套上层语义。它强调的是“能力接缝”(capability seam),而不是在每个工具内部判断当前跑在本机、容器还是远端。
这很适合构建 Coding Agent:底层执行世界会变化,但上层 Agent Loop 不应该跟着分叉。
因为注册本身就是可撤销副作用,DeepSeek Harness 可以在运行时卸载、替换、重新挂载插件。配置文件变化时,Loader 会比较配置项,只重载发生变化的部分;无效的新配置不会摧毁当前可用的插件树。
这不只是“保存文件后少重启一次”。它说明这个系统从一开始就在处理一个困难问题:动态变化的能力集合,如何不留下失效引用和脏状态。
对于需要安装第三方插件、切换 Agent Profile、运行不同产品形态的系统,这个底座很有价值。
DeepSeek Harness 把事件分成三个域:
agent/* Event:正在运行的 Agent 状态与控制例如工具执行不是简单调用一个函数,而是经过:
pre-execute → 单调守卫 → execute → post-execute → finalize → result
审批、沙箱、超时、重试、指标、结果改写都可以挂在流水线上,不必让具体工具直接依赖这些策略。
这类设计的好处是扩展面非常清楚;代价则是概念多、学习曲线陡。你必须理解 Context、Service、Effect、Scope、Waterfall Event、Profile、Bundle 和 Patch,才能真正驾驭它。
我认为 DeepSeek Harness 最有含金量的部分,不是插件,而是它对 Session 的定义。
它把会话建模为一份只追加的事件日志。turn/start、step/start、用户消息、模型流式 chunk、完整 assistant message、工具调用、工具结果和结束边界都会进入日志。
模型看到的上下文不是另一份独立状态,而是通过 deriveMessages() 从日志投影出来。
它甚至把原则写得非常直接:
模型可见即已记录。
这句话很重要。很多 Agent 系统同时维护三份相似但不完全一致的状态:
一旦三者漂移,就会出现最难查的 Agent Bug:界面上看到了某条消息,但模型没看到;模型根据某段隐藏上下文做了决定,但重启恢复后这段上下文丢了。
DeepSeek Harness 试图从结构上消灭这种分叉。原始流式 chunk 保证 UI 可以精确回放;完整消息用于派生模型历史;压缩通过 surface replacement 表达;fork、resume、transcript 和 telemetry 都从同一事件流产生。
Crash Recovery 也遵循这个思路:如果载入时发现一个 turn/start 没有对应的 turn/end,系统不会粗暴截断已经持久化的长任务,而是补上一个 interrupted 结束事件,保留中断前已经发生的事实。
这种做法更像事件溯源系统,而不是传统聊天记录。
它的收益是:
但它也把兼容性压力集中到了事件协议上。当前 Session 格式版本仍是 0,官方明确表示没有兼容承诺;一旦事件含义变化,迁移就会成为非常严肃的问题。
工具调用是比较两个项目时最能体现设计差异的地方。
DeepSeek Harness 会为每一个待执行调用查询 executionMode:
parallel 可以与相邻安全调用重叠exclusive 必须独占执行,并形成顺序屏障Agent Loop 使用滚动并发池执行安全调用,同时保证结果仍按模型调用顺序写回。更关键的是,分类发生在调用级,而不只是工具级。理论上,同一个工具可以根据本次参数判断它是只读操作,还是需要独占的写操作。
它的工具流水线还把权限、单调守卫、沙箱、超时、重试、结果规范化和持久化观察分开。任何一层失败,都要被转成唯一、可记录的最终结果。
AgentScope Java 2.0 的 Toolkit 默认开启并行执行。工具可以通过 concurrencySafe 标记自己是否能安全并发;连续的安全工具会并发运行,不安全工具形成串行槽位,输出顺序仍然保留。
这已经比“整个批次要么全并行、要么全串行”细很多,也很符合 Java 工程团队的使用习惯。但它当前主要还是工具定义级标记,表达力不如 DeepSeek Harness 的调用级动态分类。
因此,如果你在做文件编辑、终端、数据库变更这类副作用复杂的 Coding Agent,DeepSeek Harness 的执行语义更精细;如果大多数工具本身就是业务 API,AgentScope 的模型更直接,也更容易让普通团队理解。
DeepSeek Harness 还有一个很有辨识度的能力:Code Mode。
普通 Function Calling 会把每个工具的完整 JSON Schema 暴露给模型,模型每调用一次工具,结果又会进入对话上下文。工具一多,Schema 和中间结果会持续占用 Token。
Code Mode 则只向模型暴露一个 run_code 入口和一份自动生成的 TypeScript 或 Python SDK。模型在临时程序中调用:
1 2 3 4 5 | |
中间工具结果留在本次执行局部,只有 return 或 console.log 的内容回到模型上下文。
这带来的价值不是“模型会写代码”——Coding Agent 本来就会——而是:
它本质上是把一部分 Agent 编排从自然语言推理迁移到一次性的确定性程序中。
不过 Code Mode 也不是免费午餐。当前每次运行都是全新状态,不是持久 REPL;中间值不能从会话日志重建,而且执行局部没有统一字节上限。如果程序拿回超大对象,仍然可能造成 worker 内存压力。
如果说 DeepSeek Harness 的关键词是“可组合”,AgentScope Java 的关键词就是“可运营”。
它的双层 Agent 结构很清楚。
ReActAgent 负责核心推理循环,把模型、Toolkit、权限、Middleware、事件和 AgentState 组合起来;HarnessAgent 是外层包装,通过固定顺序的 Middleware 和工具,增加工作区、长期记忆、上下文压缩、技能、子 Agent、沙箱和 Plan Mode。
这种设计没有追求“一切皆插件”的纯粹性,而是刻意保留一个容易使用的 Builder:
1 2 3 4 5 | |
对于 Java 团队,这种体验很熟悉:核心抽象稳定,基础设施通过 Builder 和 Spring Boot Starter 接入,扩展行为走 Middleware。
更重要的是,AgentScope Java 没有停在 SDK 层。仓库中的 agentscope-service 已经把 Agent 运行进一步拆成 Gateway、Control Plane、Dataplane 和 Scheduler,并提供 Dashboard、Managed Agents 与 Agent Teams。
因此它真正想解决的不是“如何写出一个聪明的 Agent”,而是:
一家公司里有很多 Agent、很多用户和很多运行副本时,怎样统一注册、恢复、观察、调度和治理。
两边都重视持久化,但设计中心不同。
DeepSeek Harness 以 append-only Session Event Log 为 Source of Truth。状态恢复、模型历史和 UI 展示尽量从事件投影得到。
这是偏运行时语义的选择:重点是“过去到底发生了什么”。
AgentScope Java 把状态分成几层:
RuntimeContext:当前调用的 userId、sessionId 和临时属性,不持久化AgentState:对话上下文、权限、Plan Mode 和工具状态,通过 AgentStateStore 跨调用恢复MEMORY.md同一个 Agent 实例可以服务多个用户和会话。系统通过 (userId, sessionId) 定位状态;同一 Session 的调用串行化,不同 Session 可以并行。再配合 Redis、MySQL、PostgreSQL、OSS 或 COS 等后端,实例本身可以保持无状态并水平扩容。
这是偏服务架构的选择:重点是“下一次请求由任何副本接手时,怎样继续运行”。
两种模型没有绝对高下。
DeepSeek Harness 的本地 Sandbox 更贴近开发者桌面和 Coding Agent。Linux 可使用 bubblewrap / Landlock,macOS 使用 Seatbelt,Windows 有 ACL restricted-token runner。它强调同一宿主执行世界里的文件写入边界,并且在无法落实策略时 fail closed,而不是悄悄降级为无限制执行。
远端执行则不被塞进同一个进程沙箱接口,而是通过替换文件系统与进程 provider,把整个执行世界一起移动。目前仓库也已经提供 E2B 的文件系统和进程实现。
AgentScope Java 的沙箱更偏服务部署。它把 Docker、Kubernetes、Daytona、E2B 和 AgentRun 视为同类后端,并进一步考虑:
所以,DeepSeek Harness 更关心“这条命令在当前执行世界里是否越界”;AgentScope Java 更关心“这个租户的执行环境能否隔离、持久并被另一台机器接手”。
DeepSeek Harness 把 Subagent 做成可替换 capability seam。不同 provider 可以在同一 Context 共存:进程内 spawn、基于历史 fork,以及对接 Codex、Claude Code、ACP 或 DSH SDK 的外部执行器。
它还区分一次性子 Agent 和可继续对话的子 Agent。后者拥有持久 Session、可冷恢复的 Activation、唯一 inbox 和明确的父子授权关系。实验性的 Agent Teams 则在其上增加 roster、task board 和 mailbox。
AgentScope Java 的多 Agent 更贴近业务使用:
agent_spawn 创建同步或后台子任务agent_send 向已创建的子 Agent 继续发消息简单说,DeepSeek Harness 优先解决的是“如何把不同 Subagent 实现放到同一个抽象后面”;AgentScope Java 优先解决的是“如何让一组 Agent 在企业平台里持续协作”。
| 维度 | DeepSeek Harness | AgentScope Java |
|---|---|---|
| 核心定位 | 可组合 Agent Runtime 与产品底座 | Java Agent 框架、Harness 与服务平台 |
| 技术栈 | TypeScript / Node.js,含 Web、Native 与 Python SDK | Java 17 / Reactor / Maven / Spring Boot,Service 含 Go 与前端 |
| 核心抽象 | Cordis Context、Plugin、Service、Event、Effect、Scope | Agent、ReActAgent、HarnessAgent、Middleware、RuntimeContext、AgentState |
| 执行循环 | Turn / Step 边界明确,行为大量通过事件拦截 | ReAct 核心循环稳定,Harness 通过 Middleware 叠加能力 |
| 状态真相 | Append-only Session Event Log | AgentStateStore + Session Log + Workspace / Memory |
| 回放能力 | 强,原始 chunk、调用与结果都进入事件日志 | 更偏事件流展示和状态恢复,不以统一事件溯源为核心 |
| 工具并发 | 调用级 parallel / exclusive 分类与屏障 |
Toolkit 批量并发,工具级 concurrencySafe 标记 |
| 工具扩展 | 多阶段 waterfall、守卫、审批、沙箱、结果规范化 | Toolkit、权限系统、Middleware、执行配置 |
| Code Mode | 原生支持 TypeScript / Python 工具编排 | 不是当前核心设计 |
| 沙箱 | 本机强制隔离 + E2B provider,可替换整个执行世界 | Docker / K8s / Daytona / E2B / AgentRun,快照与分布式锁完整 |
| 多 Agent | 多 provider、一次性与可继续子 Agent、实验性 Teams | 同步/后台子 Agent、持久任务、Teams 与控制面 |
| 企业集成 | 需要自行组合和建设 | Redis、MySQL、PostgreSQL、OSS、COS、Nacos、Spring Boot、Channel |
| 产品形态 | CLI、Web、Headless、SDK、插件 Profile | Core、Harness、Extensions、Service、Dashboard |
| 当前成熟度 | 0.1.0-rc.8,Developer Preview |
2.0 已 GA,主干继续快速迭代 |
它的风险主要有三个。
第一,项目仍处于 Developer Preview,当前版本是 0.1.0-rc.8,官方明确提示后续会有破坏性变化。Session 格式也是预发布的 v0,没有内置迁移链。
第二,Cordis 的抽象能力很强,但认知成本也高。插件树、Service 注入、Scope 隔离、Effect 回收、Waterfall Event、Bundle 和 Patch 共同工作时,调试难度不低。
第三,它更像一个完整产品底座,而不是一个轻量 SDK。如果团队只是想在已有业务里增加几个 Agent 能力,引入整套运行时未必划算。
AgentScope Java 的风险也很明显。
首先,ReActAgent 和 HarnessAgent 都已经是体量很大的中心类。大量能力虽然通过 Middleware、Toolkit 和 Builder 暴露,但编排与兼容逻辑仍集中在核心实现里。未来功能继续增加时,维护成本值得关注。
其次,它的“可扩展”更接近企业框架的扩展方式,而不是 DeepSeek Harness 那种运行时级可替换。你可以加 Middleware、工具和 Store,但很难像 Cordis 一样把整个 Agent Loop 当成普通插件换掉。
最后,AgentScope Service 已经覆盖控制面、托管运行时和 Teams,能力很诱人,但这也意味着更重的部署和运维成本。只有当组织真的存在多 Agent、多租户、多副本和统一治理需求时,这一层平台才有足够回报。
如果你的目标是下面这些,优先研究 DeepSeek Harness:
如果你的目标是下面这些,优先考虑 AgentScope Java:
还有一种常见情况:团队只是验证一个小型 Agent 功能。
这种时候,两套方案都可能太重。直接使用简单的模型 SDK、少量工具和一个清楚的状态边界,往往更合适。不要因为 Harness 很先进,就默认所有 Agent 都需要 Harness。
DeepSeek Harness 展示的是一种 Runtime-first 路线:
把 Agent 的每一项能力都变成可组合、可替换、可回收的运行时部件,再用统一事件日志保证执行语义。
AgentScope Java 展示的是一种 Production-first 路线:
把 Agent 纳入成熟的应用服务体系,解决租户、状态、沙箱、存储、渠道、调度和控制面,再让企业真正运营它。
前者更像在设计 Agent 时代的“运行时内核”,后者更像在建设 Agent 时代的“应用服务器与控制平台”。
两边最终很可能会互相靠近:DeepSeek Harness 会继续补生产基础设施,AgentScope Java 也会继续细化运行时语义。但至少在当前阶段,选型边界非常清楚:
造 Agent Runtime 和产品,选 DeepSeek Harness;在企业系统里运行和治理 Agent,选 AgentScope Java。
这也说明 Agent 开发已经进入了一个新阶段。竞争不再只是“谁的模型更聪明”或“谁的 Demo 工具更多”,而是:
谁能把不确定的模型行为,装进一套可恢复、可解释、可扩展、可治理的软件系统。
本文阅读基线为 2026 年 8 月 21 日,主要参考两个仓库当时的主干源码与文档:DeepSeek Harness 141eb6f(0.1.0-rc.8)和 AgentScope Java 643905e。关键资料包括 DeepSeek Harness 架构、Agent 生命周期、工具执行流水线、AgentScope Harness 架构、AgentScope Agent 与 AgentScope Service。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。