跳过主要内容
全部文章
指南

什么是 Agent Harness?定义、案例,以及 DeepSeek 为什么要造一个

Agent harness 是把语言模型变成 AI 编程智能体的运行时:工具执行、上下文、权限与会话,本文以 DeepSeek Harness 为实例展开讲解。

Agent harness(智能体运行框架) 是位于语言模型和真实世界之间的那层软件,把模型变成一个能干活的 AI 编程智能体:它运行工具调用循环、管理上下文和会话状态、执行权限策略、并提供一套扩展机制来添加能力。模型决定要做什么;harness 决定这个决定如何变成一条 shell 命令、一次文件编辑、或一次 API 调用——安全地、可重复地、且在多个步骤之间保有某种记忆。

Harness 实际提供的几个层次

去掉品牌包装和厂商专属命名之后,大多数 agent harness 都会收敛到同样几项职责:

作用
工具调用循环给模型发送 prompt 和可用工具,接收工具调用请求,执行它们,再把结果喂回去——如此循环,直到模型停止或被某个策略打断
上下文管理组装模型每一轮能看到的内容:系统提示词、项目指令、对话历史、工具结果——并在其增长时做压缩或裁剪
权限 / 沙箱决定一个请求的动作(写文件、跑命令、访问网络)是被允许、被拒绝,还是需要明确审批
会话状态在多轮对话之间、重启之间,有时候在被委派的子任务之间,持久化对话和任务状态
可扩展性一套无需 fork harness 本身就能添加工具、集成或行为的机制——插件、扩展,或某种等价物

单纯调用一次模型提供商的 API,这些东西一个都没有。Harness 就是你围绕那次调用所构建或安装的一切,把"一个能对文本做出回应的模型"变成"一个能在真实环境里把事情做完的智能体"。

这和"框架"或"agent SDK"有什么区别

这些术语在日常使用中经常混用,但有一个有用的区分:agent SDKagent 框架(比如 LangChain 这类库)通常给你的是构建块——你自己写编排代码,自己决定循环结构,自己把工具接进去。Harness 更接近一个成品应用:你直接运行它,它已经内置了一套有主见的工具调用循环、一个 UI 或 CLI、会话持久化,以及一套权限模型。你对 harness 做的是"扩展";对框架做的是"组装"。

实践中这条界线会模糊——有些 harness 会暴露类似 SDK 的编程接口,有些框架也会附带看起来像 harness 的参考应用——但"我是直接拿来运行,还是自己写编排循环"通常是判断某个东西属于哪一边最快的办法。

逐层拆解 DeepSeek Harness

DeepSeek-Harness(dsh)是 DeepSeek 开源的 agent harness,它是一个很好的实例,恰恰是因为它的架构把自己的设计哲学大声说了出来:一切皆插件。上面提到的每一层,都是在 Cordis 插件框架之上以插件的形式实现的,而不是各自拥有独立配置格式的独立内建子系统。

  • 工具调用循环与工具——ctx.tools.register() 注册一个工具的 schema 和处理函数;schema 会自动流入 prompt 组装环节。一个 DSH_TOOLS_MODE 环境变量甚至能让你在原生结构化工具调用和"Code Mode"(模型写代码以编程方式调用工具)之间切换。
  • 上下文管理——Session 会加载 AGENTS.md/CLAUDE.md 项目指令(渲染预算最高 65,536 字节),并用内存 SQLite 存储对 session 内容做索引;专门的压缩插件(compaction-basic、一个工具结果裁剪器、以及一个 /compact 人类命令)在对话不断增长时管理哪些内容留在上下文里。
  • 权限与沙箱——三档沙箱(read-onlyworkspace-writedanger-full-access),由平台专属的强制执行方式支撑(Linux 上是 bwrap/Landlock,macOS 是 Seatbelt,Windows 是 ACL,或可选的 E2B 云沙箱),并配合命名的权限预设,把沙箱模式和审批策略组合在一起。新 session 默认是 workspace-write + ask 审批。完整细节见 DeepSeek Harness 权限与沙箱
  • 会话状态——两种可插拔的持久化后端(JSONL 和 SQLite)存储 session 历史;一个 goal 概念在一个持续进行的 session 之上叠加了一个持久化、有状态的目标。
  • 可扩展性——这是 dsh 的设计对自己这套主张贯彻得最彻底的地方。Skill、斜杠命令、MCP server 连接、hook、模型适配器,乃至子代理委派,全部是同一种插件的不同用法,通过同一套 Cordis 机制注册——而不是五个各自拥有五种 manifest 格式的独立子系统。这在实践中到底意味着什么,完整拆解见 DeepSeek Harness 架构:「一切皆插件」到底意味着什么;准确讨论这套概念所需要的词汇,见 DeepSeek Harness 术语表

往 dsh 里装一个能力只需要一条命令:dsh plugin --profile web add <包说明符>,可以来自 npm、GitHub 仓库或本地路径——完整机制以及在你机器上执行代码的安全权衡,见如何安装 DeepSeek-Harness 插件

你会遇到的其他 harness

DeepSeek Harness 不是这个赛道里唯一的项目,这个品类在它之前就已经存在。Claude Code(Anthropic)和 OpenAI 的 Codex CLI 都是以终端为核心的编程 agent,符合同样的定义:一套工具调用循环、权限模型、会话管理,以及一套扩展机制(在 Claude Code 里是 skill、command、hook、MCP 连接,各自作为独立关注点组织,而不是 dsh 那种单一统一的插件机制)。OpenCode 是另一个形态类似、带终端 UI 的开源项目。每个项目在扩展机制的紧密程度、什么在哪里运行、权限默认值怎么定这些问题上,都做出了自己的设计选择——这是一个值得深入的真实对比点,详见 DeepSeek Harness vs Claude Code

无论你从哪个 harness 入门,有一个事实值得了解:dsh 提供官方的子代理 provider,可以把工作委派 Claude Code 或 Codex 作为后端(dsh-subagent-claude-codedsh-subagent-codex),并提供桥接插件直接复用已有的 Claude Code 或 Codex hooks.json 配置。这些工具并非纯粹互斥的关系——一个 harness 完全可以把另一个 harness 编排为自己的执行后端之一。

"Harness engineering" 是相关但不同的概念

你有时会在"agent harness"旁边看到 harness engineering 这个词——它指的是有意识地打磨一个代码库及其文档(AGENTS.md 文件、lint 规则、评测体系),让 AI agent 在这个项目里工作时更有效的一种实践。它是一门应用你所使用的任何 harness 之上的学科,而不是 harness 本身的另一种叫法;harness 是运行时,harness engineering 是你为它布置代码库的方式。

FAQ

Agent harness 和"AI agent"是一回事吗?

不完全是。Agent 是一种行为——模型加上工具完成一项任务。Harness 是让这种行为成为可能的基础设施:循环、权限、会话管理。你可以把 harness 描述成"把模型变成 agent 的那个东西",这大致就是这个术语存在的原因。

用 LLM 做编程任务一定需要 harness 吗?

对一次性的单次模型 API 请求来说不需要。但一旦你想要多步骤工具调用、持久化上下文、权限边界,或者一种无需自己手搓编排逻辑就能扩展行为的方式,你描述的就是 harness 要解决的问题——无论你是装一个现成的,还是自己搭一个最简版本。

Harness 和 IDE 插件有什么区别?

一个 IDE 插件(比如 Copilot 这类扩展)通常只是挂在一个已有编辑器上的一个集成点。Harness 是一个拥有自己的工具调用循环、权限模型和扩展系统的独立运行时——它可以通过一个 IDE 集成、一个 web UI、一个 CLI 或一个 SDK 暴露出来,但 harness 本身不由其中任何一种前端来定义。

DeepSeek Harness 和 DeepSeek 的模型 API 是一回事吗?

不是。DeepSeek 的模型 API 回答的是文本/对话请求。DeepSeek Harness(dsh)是一个独立的开源运行时,可以调用 DeepSeek 自家的模型——也可以通过自定义 provider 调用其他厂商的模型——并把它们放进一套完整的工具调用循环里,配上会话、权限和插件。项目层面的完整介绍见 什么是 DeepSeek Harness?

下一步

想看这个问题针对 DeepSeek 的具体版本——安装步骤、版本状态、以及它在更大生态里的位置——读什么是 DeepSeek Harness?。想看"一切皆插件"在完整架构细节上是怎么落地的,去看 DeepSeek Harness 架构。如果你正在拿 dsh 和你已经在用的另一个 harness 做评估,DeepSeek Harness vs Claude Code 是本站最深入的一篇对比文章。想看扩展机制的实际效果,可以逛开发与运行时分类或完整插件目录