StableLearn Logo

搜索内容

AI Agents 10 min read

DeepSeek Harness 开源:把 Agent 的整套运行底座拆开了

DeepSeek Harness 开源了:由 DeepSeek AI 开发、Cordis 驱动的 Agent 运行底座,把模型、工具、会话、沙箱和 Agent Loop 都做成可组合插件。

Cover image for DeepSeek Harness 开源:把 Agent 的整套运行底座拆开了

本文发布于 36 天前,内容可能已过时,请注意甄别。

DeepSeek 又开源了一个新项目。这次放出来的不是模型,而是一套用来搭 Agent 的运行底座:DeepSeek Harness

它的命令行名字是 dsh,最醒目的设计只有一句话:Everything is a plugin(一切皆插件)

模型适配器、工具、会话记录,甚至驱动 Agent 一步步工作的 Agent Loop,都不被写死在核心里。想换模型、换沙箱,甚至换掉整套循环逻辑,都有明确的插入位置。

它到底是什么?

Harness 可以理解成 Agent 的运行骨架。模型负责回答,工具负责执行,但真正让一个 Agent 产品跑起来的,还有请求调度、上下文管理、会话回放、权限控制、沙箱和前端界面。

DeepSeek Harness 试图把这些部分放进同一套可组合的框架里。它不是一个新模型,也不只是一个聊天页面,更像是开发者搭建 Agent 产品时可以反复利用的底座。

不过,这个项目还处在 developer preview(开发者预览) 阶段。官方已经说明,后续会有破坏兼容性的变化。现在适合研究架构、写插件、跑工作流,暂时不适合把它当成接口已经冻结的生产平台。

最关键的决定:一切皆插件

DeepSeek Harness 建在 Cordis 之上。Cordis 的思路,是让插件向共享上下文提供服务、类型化事件和可撤销的副作用。

换句话说,系统里没有一个“所有功能都必须围着它改”的超级核心。新能力通过挂载插件加入,插件卸载时,自己注册的服务和副作用也一起撤回。

这会直接影响开发方式:

  • 换模型,主要替换模型适配器
  • 加工具,注册到统一的工具系统
  • 换本地执行为远程沙箱,替换文件系统、进程和终端提供方
  • 加审批、超时或遥测,挂到工具执行事件上
  • 调整 Agent 行为,可以替换 Agent Loop,而不是重写整个产品

很多 Agent 项目一开始都很轻:一个模型请求,加几个函数,再套一个循环。等到需要权限、恢复、长任务和远程执行,代码很快就缠在一起。DeepSeek Harness 选择一开始就把这些边界拆出来,换来的是更高的学习成本,但也少了一些后期硬拆的痛苦。

Profile 和 Bundle:运行配置也能组合

运行中的 dsh 不是固定模块的集合,而是一棵插件树。

profile 是一套命名好的运行组合。它决定加载哪些 bundle,也可以保存额外安装的插件和用户自己的 cordis.patch.yml。官方现在提供了两个模板:web 用来启动 Web UI,headless 用于一次性运行,并且不带服务器。

bundle 则是可以分发的插件组合。启动时,Harness 会从空配置开始,依次叠加 profile 指定的 bundle,再应用 profile、用户目录和命令行上的 patch。相同的底层组件因此可以在不同运行环境里换一套配置,不必复制项目代码。

想看当前实际加载了什么,可以运行:

   dsh --profile web --dump-config

这条命令很能说明它的取向:部署差异尽量放进配置组合,而不是变成一堆分支代码。

Agent 是怎么跑起来的?

官方把一次工作拆成 turnstep:一个 turn 是一轮完整任务,里面可以有多个 step;一个 step 对应一次模型请求,以及这次请求触发的工具调用。

简化后的流程是这样:

   turn/start
  -> 领取输入
  -> agent/pre-step
  -> 组装提示词和工具 schema
  -> agent/request
  -> llm/stream
  -> assistant/message
  -> tool/call
  -> tools/pre-execute
  -> tools/execute
  -> tools/post-execute
  -> tool/result
  -> step/end
  -> turn/end

这些事件不是为了把日志写得漂亮,而是给插件留下了具体的接入点。模型请求前可以改写或拒绝输入;请求发出时可以拦截;工具执行前后可以加入审批、超时、监控和策略检查。

会话日志:模型看到的内容必须能回放

Harness 把会话日志当成模型上下文的来源。模型最终看到的历史,不是某个藏在内存里的数组,而是从事件流投影出来的;原始的 assistant/chunk 事件还会保留下来,方便回放和 UI 展示。

官方架构里有一条很硬的规则:模型看到的内容,必须能从日志重建。

这对长任务尤其重要。任务失败后要重试,执行到一半要恢复,或者把会话 fork 出去继续跑,系统首先得回答一个问题:刚才模型到底看到了什么?如果上下文只存在于临时状态里,这些功能都会变得不可靠。

核心包各自负责什么?

官方架构文档把主要职责拆到了不同 package:

负责什么
core/session保存 SessionEvent 日志和内存状态
core/system-prompt组装提示词片段和工具 schema
core/tools注册工具,并管理工具执行流水线
core/agent定义 Agent 接口和活跃 Agent 注册表
core/agent-loop提供默认的 Agent Loop 驱动器
llm/llm处理消息、流式输出和模型适配器

这里没有一个“大 Agent 类”包办所有事情。模型是模型,工具是工具,循环是循环,需要时再把它们拼起来。

能力接口:换后端,不换产品

Harness 把可替换能力称为 seam。一个 seam 通常有三层:接口定义、具体提供方和使用它的模块。

以执行环境为例,本地文件系统、进程、Bash、PTY 和 LSP 可以共享同一个执行世界。如果把文件系统和进程提供方换成远程沙箱,相关工具就能一起迁移,不需要为每个工具重新写一套远程分支。

脚本式 Agent 更快写出来,Harness 更在意同一套 Agent 能不能换环境、换权限策略、换模型而继续工作。代价是理解 Cordis、插件树和事件流需要时间,但大型工作流迟早会遇到这些问题。

现在就能运行

安装 Node.js 后,直接执行:

   npx @deepseek-ai/dsh web

Web UI 默认运行在 http://127.0.0.1:3080

也可以从源码启动:

   git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm run build
pnpm dsh web

项目采用 MIT License。想继续往里研究,可以从官方架构文档开始,再看 dsh-plugin 话题下的插件生态。

这次开源的分量

DeepSeek Harness 不是把“模型 + 工具函数”重新包装一次,而是把 Agent 产品最容易失控的部分放到了架构层:运行时、状态、权限、执行环境、回放和部署组合。

它当然也不轻。插件树、profile、bundle、事件流和 seam 都增加了门槛,开发者预览也意味着接口还会变。但如果目标是做一个能跑长任务、能恢复、能审计、能换执行环境的 Agent,迟早要面对这些问题。

DeepSeek 这次公开的,正是这部分不太适合做演示、却决定 Agent 能不能长期运行的底层工作。

最后

DeepSeek Harness 现在还不是一个可以放心锁死版本的成熟平台,但它的方向已经很清楚:让模型、工具、会话、沙箱、UI 和 Agent Loop 都成为可以替换的组件。

想体验,运行 npx @deepseek-ai/dsh web 就够了;想开发插件,则从 Cordis 和官方架构文档读起。这个项目后面最值得看的,不是又多了多少按钮,而是“一切皆插件”最终能把 Agent 拆到多细、又能重新组合出多少种运行方式。

来源:

分享文章

更多文章