Harness 架构深度解析:Claude Code 为什么强?
[进阶选读] 本篇深度解析 Claude Code 的底层架构设计。如果你的目标是快速上手用好 Claude Code,可以先跳过,等用顺手之后再回来读。读完之后,你对 CLAUDE.md、Hooks、MCP 的理解会上一个台阶------知道自己在调什么,而不只是知道怎么调。
时效说明:本文内容以 2026 年 3 月为基准。
很多人都问过这样一个问题:Claude Code 最懂工程,究竟强在哪里?
这个问题背后还有另一个问题:同样是调用 Claude 模型,为什么 Claude Code 能做到裸 API 做不到的事?
答案只有一个词:Harness。
先做一个对比实验,感受 Harness 的存在。用裸 API 和 Claude Code 分别执行同一个任务:
bash
# 方式一:裸 API 调用(没有 Harness)
curl https://api.deepseek.com/v1/chat/completions \
-H "Authorization: Bearer $DEEPSEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-chat",
"messages": [{"role":"user","content":"找出当前目录下所有 TODO 注释并列出文件名和行号"}]
}'
# 方式二:通过 Claude Code(有 Harness)
claude -p "找出当前目录下所有 TODO 注释并列出文件名和行号" --output-format text
裸 API 的回答 :它会告诉你"你可以用 grep -rn 'TODO' . 命令来搜索"------因为它没有手脚,只能说。
Claude Code 的回答 :它会直接执行 Grep 工具搜索 TODO,返回完整的文件名、行号和上下文------因为 Harness 给了它行动的能力。
同一个大脑,有没有 Harness,结果天壤之别。

同一个模型,有无 Harness 的能力差距------左侧只能说,右侧能干活
8.1 Harness 是什么
Anthropic 官方文档给出了这样的定义:
Claude Code serves as the agentic harness around Claude: it provides the tools, context management, and execution environment that turn a language model into a capable coding agent.
(Claude Code 是包裹在 Claude 模型外面的智能体编排框架,提供工具、上下文管理和执行环境,把一个语言模型变成有能力的编码 Agent。)
注意这个定义里的三个关键词:工具、上下文管理、执行环境。
模型本身只会生成文本。是 Harness 给了它读文件的能力、写代码的能力、搜索代码库的能力、在终端执行命令的能力。没有 Harness,Claude 就是一个只会说话的大脑------有智力,没有手脚。
业界对 Harness 的核心共识是:
Agent Harness = 包裹 LLM 的运行时基础设施,管理工具调度、上下文工程、安全执行、状态持久化和会话连续性。LLM 只负责推理决策。
2026 年的关键洞察:竞争差异化的重心已从 Model 转移到 Harness。同一个模型在不同 Harness 中的表现差距,远大于不同模型在同一个 Harness 中的差距。
8.2 Harness 的五个组件
Agent = Model + Harness。
模型是核心,但它不能独立行动。真正让它变成 Agent 的,是包裹在它周围的五个 Harness 组件。
┌─────────────────────────────────────────────────────┐
│ Harness │
│ │
│ ┌─────────┐ ┌──────────┐ ┌───────────┐ │
│ │ Tools │ │ Context │ │ Memory │ │
│ │ (手脚) │ │ (记忆 │ │ (长期存储)│ │
│ │ │ │ 加载器) │ │ │ │
│ └────┬────┘ └────┬─────┘ └─────┬─────┘ │
│ │ │ │ │
│ └──────────────┼────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Model │ │
│ │ (推理决策) │ │
│ └────────┬────────┘ │
│ │ │
│ ┌──────────────┼────────────────┐ │
│ │ │ │ │
│ ┌────▼────┐ ┌────▼─────┐ │ │
│ │ Hooks │ │Permissions│ │ │
│ │ (神经 │ │ (安全 │ │ │
│ │ 反射) │ │ 围栏) │ │ │
│ └─────────┘ └──────────┘ │ │
└─────────────────────────────────────────────────────┘
模型不直接接触外部世界,所有交互都通过 Harness 的组件中转。Harness 是模型和现实之间的唯一接口。

Harness 整体架构------Model 居中,五个组件(Tools/Context/Memory/Hooks/Permissions)环绕,共同构成完整的 Agent 运行环境
8.2.1 Tools:模型的手脚
Read、Write、Edit、Bash、Grep......这些工具赋予模型与文件系统、终端、网络交互的能力。没有工具,模型只能说,不能做。
Claude Code 内置了 20+ 个工具,覆盖软件工程的五个原子操作:
| 原子操作 | 代表工具 | 能做什么 |
|---|---|---|
| 读 | Read、Glob、Grep | 读文件、搜索内容、匹配路径 |
| 写 | Write、Edit、NotebookEdit | 创建/修改文件 |
| 执行 | Bash | 运行任何 Shell 命令 |
| 联网 | WebFetch、WebSearch | 查资料、抓页面 |
| 编排 | Task | 启动子 Agent 并行工作 |
工具设计背后有一个深刻的哲学------少而精。Claude Code 没有内置重构工具、测试工具、部署工具,它只给了最基础的原语。重构是 Read + Edit + Bash 的组合涌现;测试是 Bash + Read 的组合涌现;部署还是 Bash。
这就像计算机只需要几条指令就能图灵完备一样。Harness 不需要为每种场景造一个工具,它只需要确保基础工具的组合空间足够大。
Bash 是个例外。Bash 工具是一个图灵完备的逃逸舱------通过它,Claude 可以执行任何 Shell 命令:安装依赖、运行测试、调用 API、操作数据库。这意味着 Claude Code 的能力上限,理论上等于操作系统的能力上限。这也是为什么 Harness 需要权限控制的原因。
8.2.2 Context:模型的记忆加载器
CLAUDE.md、系统提示词、对话历史、工具定义------这些上下文在每一轮循环中被注入模型,决定了模型看到什么、知道什么。
上下文管理的精妙之处是,它不只是被动的信息传递,还包括主动的压缩和重注入策略(详见 8.4 节)。
8.2.3 Memory:模型的长期存储
跨会话的记忆持久化,让模型能"记住"你的偏好、项目规则和历史决策。
- CLAUDE.md:显式记忆,你主动写进去的规则和背景
~/.claude/memory/:隐式记忆,Claude 自动积累的项目知识
没有 Memory,每次对话都从零开始。有了 Memory,Claude 知道你的项目用什么框架、代码风格是什么、有哪些约定不能违反。
8.2.4 Hooks:模型的神经反射
事件驱动的自动化机制,在工具执行前后触发自定义逻辑。比如:
- 每次保存文件前自动格式化
- 每次提交前自动运行 lint
- 每次 Bash 命令执行后自动记录日志
Hooks 让 Harness 有了"条件反射"的能力------不需要模型主动决策,某些行为会自动发生。
8.2.5 Permissions:模型的安全围栏
哪些工具可以自由使用,哪些需要人工审批,哪些完全禁止------权限系统是 Harness 的安全底线。
它解决了一个核心矛盾:你希望 Agent 足够自主以提高效率,但又不希望它自主到失控。
8.3 Agentic Loop:Harness 的心脏
如果 Harness 是一台机器,Agentic Loop 就是它的发动机。整个 Claude Code 的运转,归根到底就是一个循环:
① 用户输入任务
│
▼
② 模型推理:该做什么?需要哪个工具?
│
▼
③ 执行工具(读文件/写代码/运行命令)
│
▼
④ 工具结果回注到上下文
│
▼
⑤ 模型继续推理:任务完成了吗?
│
┌───┴───┐
完成 未完成
│ │
▼ └──→ 回到 ②
⑥ 输出最终回复
关键点在于步骤 ② 和步骤 ④ 之间的循环。模型不是一次性给出最终答案的。它可能先读一个文件,看完结果后决定再搜索一下,搜索完又决定编辑某行代码,编辑完再运行测试------每一步都是一次循环。一个复杂任务可能跑几十轮循环。

Agentic Loop 完整流程------从用户输入到任务完成,中间经历"推理→工具执行→结果回注"的多次循环
循环什么时候结束? 满足下面两个条件之一:
- 模型主动停止 :Claude 认为任务完成,生成纯文本回复,不再请求工具调用。API 返回
stop_reason: "end_turn"。 - 达到最大轮次 :Harness 设置了
--max-turns限制,防止无限循环。
这就是为什么有时候 Claude 花了 20 秒还没给你回答------它在认真跑循环,不是卡住了。
8.4 上下文管理:被低估的关键能力
大多数人讨论 Agent 框架时,只关心工具和循环。但 Harness 最精巧的部分,其实是上下文管理。
Claude 的上下文窗口是有限的(200K tokens)。一个真实的编码任务------读 20 个文件、搜索 50 次、执行 30 条命令------产生的对话历史会迅速膨胀到几十万 tokens。如果不管理,要么爆掉上下文窗口,要么模型开始"遗忘"早期信息。
Claude Code 的解决方案是自动压缩。当对话历史接近上下文窗口的 92% 时,Harness 会触发一次压缩操作:
对话历史(180K tokens)
│
▼ 压缩触发(92% 阈值)
┌────────────────────────────────┐
│ 保留:最近的消息(完整) │
│ 压缩:早期消息 → 摘要 │
│ 重注入:CLAUDE.md 内容 │
│ 重注入:系统提示词 │
│ 重注入:工具定义 │
└────────────────────────────────┘
│
▼
压缩后对话历史(~80K tokens)
│
▼
继续工作
注意最后三行------CLAUDE.md、系统提示词、工具定义在每次压缩后都会重新注入。这意味着即使对话历史被截断了,模型仍然知道项目的规则、自己有哪些工具、应该遵循什么约定。
这就是为什么你在 CLAUDE.md 里写的东西那么"持久"------不是因为模型记住了它,而是 Harness 在每次压缩后都重新塞给模型。
理解了这个机制,你就知道 CLAUDE.md 应该写什么:不是写"你好,我叫张三"这类一次性信息,而是写每次压缩后都需要重新提醒模型的项目规则和约定。
8.5 开源还是闭源?一个被误解的事实
很多人以为 Claude Code 是开源的。毕竟它在 GitHub 上有一个仓库(github.com/anthropics/claude-code),截至 2026 年 3 月已有 81K+ stars。
但打开仓库的 LICENSE 文件,你会看到:
© Anthropic PBC. All rights reserved.
Use is subject to Anthropic's Commercial Terms of Service.
Claude Code 不是开源软件,它是专有软件。
GitHub 仓库里有什么?安装脚本、插件模板、GitHub Action、文档、示例配置。核心的 Agentic Loop、工具执行引擎、上下文管理器------这些 Harness 的核心代码------以编译后的 npm 包(@anthropic-ai/claude-code)分发,源码并不可见。
2026 年 1 月,GitHub 上出现了一个 issue(#22002),请求 Anthropic 将 Claude Code CLI 以 Apache 2.0 或 MIT 许可证开源。截至目前,这个 issue 仍然是 Open 状态。
8.6 Claude Agent SDK:可编程的 Harness
虽然 Claude Code CLI 本身不开源,但 Anthropic 在 2025 年发布了 Claude Agent SDK------一套可编程的 Harness 接口。
bash
# TypeScript 版本
npm install @anthropic-ai/claude-agent-sdk
# Python 版本
pip install claude-agent-sdk
Agent SDK 提供了与 Claude Code 完全相同的 Agentic Loop、内置工具、上下文管理、权限系统、Hooks、Sub-Agent 支持和 MCP 集成。区别在于:Claude Code 是面向终端用户的交互式产品,Agent SDK 是面向开发者的编程库。
用 Agent SDK,你可以构建自己的 Harness------一个定制化的 Agent 应用,嵌入到你自己的产品、工作流或 CI/CD 系统中:
python
from claude_agent_sdk import AgentClient
client = AgentClient(api_key="...")
# 创建一个有工具能力的 Agent
result = client.run(
prompt="审查这个 PR 的安全问题",
tools=["Read", "Grep", "Glob", "Bash"],
max_turns=20,
allowed_tools={"Bash": ["npm test", "npm run lint"]} # 只允许特定命令
)
print(result.text)
如果说 Claude Code 是一辆出厂配置的整车,Agent SDK 就是发动机总成------你可以把它装进任何车身里。
8.7 Harness 生态:竞争与张力
Claude Code 的成功证明了一件事:模型 + Harness = 10× 生产力。这个公式吸引了大量第三方工具来构建自己的 Harness。
截至 2026 年 3 月,主要 Harness 产品格局:
| 产品 | 定位 | 特点 |
|---|---|---|
| Claude Code | 官方 CLI | 深度集成 Claude,Harness 最完整 |
| OpenCode(前 SST) | 第三方,多平台 | Client-Server 架构,119K stars,月活 65 万+ |
| Cursor | IDE 集成 | 编辑器原生体验,支持多模型 |
| Windsurf | IDE 集成 | Codeium 出品,强调 Flow 模式 |
| Codex CLI | OpenAI 官方 | 对标 Claude Code,2026 年发布 |
OpenCode 的故事值得一说。它用 Client-Server 架构解决了 Claude Code 的"单表面"局限------TUI、桌面 App、IDE 插件、Slack 机器人共享同一个后端。截至 2026 年 3 月,OpenCode 的 GitHub star 数超过了 Claude Code 本身。
但 2026 年 1 月,Anthropic 采取了一个争议性举措:封堵了第三方工具通过消费者 OAuth Token 调用 Claude API 的通道。这直接影响了 OpenCode、Cursor、Windsurf 等工具的用户------他们之前可以用 Claude Pro 订阅的 Token 在这些第三方工具里使用 Claude,封堵后必须购买独立的 API Key。
这件事揭示了 Harness 生态的核心张力:
- 模型提供商希望控制 Harness 层,因为 Harness 决定了 API 调用量和用户体验
- 第三方 Harness希望模型层是可替换的商品,因为这样它们才能建立独立的价值
这个张力不会消失,它会持续塑造整个 AI 工具生态的格局。
8.8 为什么 2026 年是 Harness 之年
2025 年的关键词是 Agent。2026 年的关键词是 Agent Harness。
为什么?因为行业已经意识到:模型本身正在商品化------Claude、GPT、Gemini、DeepSeek 的能力差距在缩小。但同一个模型在不同 Harness 中的表现差距,远大于不同模型在同一个 Harness 中的差距。
几个佐证数据点:
- Claude Code 在 2025 年 11 月达到 10 亿美元年化收入------这是一个 Harness 产品的收入,不是模型本身的收入
- Anthropic 在 2026 年 3 月收购了 Bun(JavaScript 运行时),明确表示要加强 Claude Code 的基础设施。收购一个运行时来加强一个 Harness------这说明 Anthropic 把 Harness 视为战略级资产
- 开源社区出现了"Agent Harness"作为独立品类,GitHub 上以 "harness" 为关键词的新仓库数量在 2026 年 Q1 翻了三倍
对我们开发者来说,这意味着什么?
理解 Harness 比理解模型更重要。
模型的能力由 Anthropic/OpenAI 决定,你无法改变。但 Harness 的配置------CLAUDE.md 怎么写、工具权限怎么设、Hooks 怎么接、MCP 怎么连------这些全在你手中。你在这门课里学的每一讲,本质上都是在调教 Harness。
8.9 小结
| 核心要点 | 一句话总结 |
|---|---|
| Harness 是什么 | 包裹 LLM 的运行时基础设施,把模型的智力转化为行动力 |
| 五个组件 | Tools(手脚)、Context(记忆加载器)、Memory(长期存储)、Hooks(神经反射)、Permissions(安全围栏) |
| Agentic Loop | 推理 → 工具调用 → 结果回注 → 继续推理,复杂行为从循环中涌现 |
| 上下文压缩 | 92% 阈值触发压缩,CLAUDE.md 在每次压缩后重新注入------这就是它"持久"的原因 |
| 开源误解 | Claude Code 核心代码闭源,GitHub 仓库只有脚本和文档 |
| Agent SDK | 可编程的 Harness 接口,用于构建定制化 Agent 应用 |
| Harness > Model | 同一模型在不同 Harness 中的差距,大于不同模型在同一 Harness 中的差距 |
思考题
-
如果你要为自己的团队构建一个定制化的 Harness(比如专门用于数据分析),你会保留 Claude Code 的哪些内置工具,去掉哪些,新增哪些?为什么?
-
Claude Code 的上下文压缩策略是"摘要早期消息 + 重注入 CLAUDE.md"。你能想到这种策略的局限性吗?在什么场景下会出问题?
-
从商业角度看,Anthropic 选择"开放 Agent SDK、封闭 Claude Code CLI"的策略是否合理?如果你是 Anthropic 的竞争对手,你会怎么应对?
参考资料
以下是 Harness 主题下,质量最高的一手资料:
AI 实验室官方文档
- Anthropic: Effective Harnesses for Long-Running Agents --- 官方定义 Harness 架构,Initializer + Coding Agent 两阶段设计
- Anthropic: Building Effective Agents --- 2024 年 12 月发表的行业奠基性文章,Workflow vs Agent 区分,Harness 概念前身
- Anthropic: Building Agents with the Claude Agent SDK --- Agent SDK 官方文档
- OpenAI: Harness Engineering --- 2026 年 2 月,正式提出"harness engineering"概念,约 1500 个自动化 PR
- OpenAI: Unrolling the Codex Agent Loop --- Codex CLI agent loop 详解
学术论文
- Building Effective AI Coding Agents(arXiv 2603.05344) --- 学术界对 Harness 概念的首次严肃形式化,scaffolding vs harness 的边界定义
行业高影响力文章
- Simon Willison: How Coding Agents Work --- 提出"Coding agent = harness for LLM"的经典定义
- Inngest: Your Agent Needs a Harness, Not a Framework --- 重点看 Harness vs Framework 的区分
- Swyx / Latent Space: Is Harness Engineering Real? --- 行业讨论,核心观点是"竞争优势在 Harness 而非 Model"
- LangChain: Deep Agents(GitHub) --- 开源 Harness 实现,仅调 Harness 就让 Terminal Bench 提升 13.7 分
- Lilian Weng: LLM Powered Autonomous Agents --- 2023 年的奠基综述,虽未用"harness"一词但定义了同一架构
- Parallel.ai: What is an Agent Harness --- 最佳独立解释文,定义 Harness 6 大组件,区分 Harness/Framework/Orchestrator