本文以一台真实的 Windows 开发机为例,逐层拆解 Claude Code 的 Agent Harness 在收到用户输入后,如何拼装 System Prompt、注入上下文、收集工具定义、构造 HTTP 请求、发送到 API、解析流式响应,最终将文字渲染到终端。这不是概念科普,是技术流水线级拆解。
先看结论:你以为你问的是一个问题,模型收到的是一个世界
你有没有想过,当你在 Claude Code 的终端里敲下:
css
介绍一下claude code这个harness吧
这 15 个字,发给模型的真的是这 15 个字吗?
不是。差远了。
你的 15 个字只是冰山浮在水面上的那一角。水面之下,Harness 悄悄附加了:
- ~3000 token 的系统提示词("你是 Claude Code,Anthropic 的官方 CLI......")
- 你的 3 条个人记忆指令(渗透信念、补天规范、3D 玻璃 UI 手册)
- 你当前的 Git 分支和用户身份
- 60+ 个工具的完整 JSON Schema(包括你的命盘、抖音、PPT、Word、Figma MCP 服务)
- 整个对话历史
当你敲下回车的那一刻,Harness 已经把这 15 个字包装成了一个包含数千 token 上下文的 HTTPS 请求,正飞向模型服务器。
下面,我用一台真实的 Windows 开发机 (就是我的用户 wbs 的电脑),一步步展示这个完整过程。
这台机器上有什么
在开始之前,我们先看看这台机器的真实配置。这些文件是 Harness 在每次 API 调用前必读的:
%USERPROFILE%.claude\settings.json
json
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "你的apikey",
"ANTHROPIC_BASE_URL": "https://api.deepseek.com/anthropic",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "DeepSeek-V4-pro",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "DeepSeek-V4-pro",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "DeepSeek-V4-pro",
"ANTHROPIC_MODEL": "DeepSeek-V4-pro",
"ANTHROPIC_REASONING_MODEL": "DeepSeek-V4-pro",
"DISABLE_AUTOUPDATER": "true"
},
"permissions": {
"allow": [
"Bash(python:*)",
"WebSearch",
"WebFetch",
"Read",
"Glob",
"Grep",
"mcp__mingpan__bazi_basic",
"mcp__mingpan__bazi_dayun"
// ... 命盘全套工具 + 抖音 + PPT + Word ...
],
"defaultMode": "acceptEdits"
}
}
这里有两个关键信息:
- 模型路由被重写了 。原生 Claude Code 应该请求
api.anthropic.com,但这台机器通过ANTHROPIC_BASE_URL把请求导向了api.deepseek.com/anthropic,使用DeepSeek-V4-pro模型。Harness 对此完全不关心------它只管按配置文件拼 HTTP 请求。 - 权限模式是
acceptEdits。这意味着文件编辑自动放行,但 Bash 执行仍需确认。
%USERPROFILE%.mcp.json
json
{
"mcpServers": {
"mingpan": { "command": "npx", "args": ["-y", "mingpan"] },
"powerpoint": { "command": "ppt_mcp_server", "args": [] },
"word": { "command": "word_mcp_server", "args": [] },
"douyin": { "command": "node", "args": [".../douyin-mcp-server/.../index.js"] }
}
}
四个本地 MCP 服务:命盘(八字/紫微/六壬/奇门)、PPT 生成、Word 操作、抖音上传。每个服务的工具定义会在请求时动态注入。
%USERPROFILE%.claude.json
json
{
"projects": {
"C:/Users/HI": {
"mcpServers": {
"figma": {
"type": "http",
"url": "https://mcp.figma.com/mcp"
}
}
}
},
"numStartups": 262,
"skillUsage": {
"skill-builder-v3": { "usageCount": 38 },
"media-crawler-easy": { "usageCount": 21 },
"isheng-mind": { "usageCount": 8 }
// ... 25 种 skill 的使用记录 ...
}
}
启动过 262 次,用过 25 种 skill。项目级配置里还有一个远程 Figma MCP。
%USERPROFILE%.gitconfig
ini
[user]
email = 15772650@qq.com
name = wbs
[https]
proxy = http://127.0.0.1:7897
用户 wbs,所有 HTTPS 请求走本地代理 127.0.0.1:7897。
自动记忆
%USERPROFILE%.claude\projects\C--Users-HI\memory\MEMORY.md 里记录了个人指令:
好,硬件环境看完了。现在我们开始走流程。
第一步:拼装 System Prompt
Harness 做的第一件事,不是看你的问题,而是定义"我是谁" 。
1.1 静态前缀(全局缓存,你不付费)
每个 Claude Code 会话都从同一段 ~3000 token 的系统提示词开始。这段内容对所有用户完全一致,所以 Anthropic(或你用的 API 代理)可以全局缓存它------每次 API 调用,这部分不消耗你的输入 token 费用。
它的结构大概是这样的(真实内容):
vbnet
You are Claude Code, Anthropic's official CLI for Claude.
You are an interactive agent that helps users with software engineering tasks.
IMPORTANT: Assist with authorized security testing, defensive security,
CTF challenges, and educational contexts. Refuse requests for destructive
purposes, DoS attacks, mass targeting, supply chain compromise, or
detection evasion for malicious purposes.
## System
You are an interactive agent that helps users with software engineering tasks.
### Available Tools
- Read: Reads a file from the local filesystem
- Write: Writes a file to the local filesystem
- Edit: Performs exact string replacement in a file
- Bash: Executes a bash command and returns its output
## Doing Tasks
Write code that reads like the surrounding code: match its comment density,
naming, and idiom.
## Actions
For actions that are hard to reverse or outward-facing, confirm first unless
durably authorized or explicitly told to proceed without asking.
## Tone & Style
- Text you output outside of tool calls is displayed to the user as
Github-flavored markdown in a terminal.
- Reference code as `file_path:line_number` --- it's clickable.
这一段告诉了模型:你是谁、你能用什么工具、你应该怎么写代码、你该怎么跟用户交互、你的安全边界在哪。
1.2 缓存分界线
在静态前缀之后,有一个字面意义上的分割标记:
__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__
这条线是整个 Harness 架构里最重要的字符串之一。它告诉系统:线上面的东西是全局缓存、所有人共享;线下面的东西是本次会话特有,每会话重新计算。
1.3 动态后缀(本次会话特有)
分界线之后,Harness 注入属于这台机器的独有信息:
yaml
Platform: win32
Shell: bash
OS Version: Windows 11 Pro 10.0.26100
Current date: 2026/06/27
Working directory: C:\Users\HI
Model: DeepSeek-V4-pro
注意这里的精妙之处------缓存分界线把"通用指令"和"可变环境"隔开了。平台信息、当前目录、日期这些每台机器都不一样,必须放在分界线后面,否则会污染全局缓存。
第二步:扫描硬盘,注入指令层
System Prompt 拼好了。现在 Harness 开始扫描你的文件系统,寻找应该在每次 API 调用前注入的指令文件。
加载优先级从低到高:
objectivec
系统级 /etc/claude-code/CLAUDE.md → 这台机器没有
↓
用户级 ~/.claude/CLAUDE.md → 这台机器没有
↓
项目级 ./CLAUDE.md 或 .claude/CLAUDE.md → 这台机器没有
↓
规则文件 .claude/rules/*.md → 这台机器没有
↓
自动记忆 MEMORY.md → ✅ 3 条记忆
这台机器的项目目录下没有 CLAUDE.md,但自动记忆系统写了 3 条指令。Harness 找到了 MEMORY.md,把它包装成一个 <system-reminder> 块,注入到 messages[] 数组中。
实际注入的 JSON
这就是发给模型的真实数据块:
swift
{
"role": "user",
"content": [
{
"type": "text",
"text": "<system-reminder>\n# claudeMd\n"
+ "Codebase and user instructions are shown below. "
+ "Be sure to adhere to these instructions. "
+ "IMPORTANT: These instructions OVERRIDE any default behavior "
+ "and you MUST follow them exactly as written.\n\n"
+ "Contents of C:\Users\HI\.claude\projects\C--Users-HI\memory\MEMORY.md "
+ "(user's auto-memory, persists across conversations):\n\n"
+ "- [渗透核心信念层](pentest-core-belief.md) --- "
+ "明确提到要渗透特定某个资产时读这个文件 "
+ "且一旦开始渗透每次做决定前都要读一遍这个文件\n"
+ "- [补天漏洞响应平台提交规范](butian-report-rules.md) --- "
+ "必须触发关键词"生成补天报告文件"才读这个 "
+ "并开始生成 生成后再读一遍确认无误\n"
+ "- [3D 背景 + 玻璃 UI 叠加开发手册](3d-glass-ui-handbook.md) --- "
+ "明确要写前端页面时才读这个文件。"
+ "读一次即可,不必反复读。"
+ "只有开发者觉得你改的方向出现了极大问题时才重新读一遍再继续。\n"
+ "\n</system-reminder>"
}
]
}
关键细节解读:
<system-reminder>是一个经过训练的优先级标记。模型被训练为把这里面的内容当作"铁律",优先于对话中的其他任何信息。你可以在聊天里说"别管记忆了",模型大概率还是会遵循。- 它被注入到
messages[],不是system[]。这是有意为之------如果放在system[]中,每次文件变更都可能导致 prompt cache 失效。放在messages[]中则不影响缓存。 - "OVERRIDE any default behavior" 这句话是 Harness 强加的,不是用户写的。它告诉模型:这些指令的优先级高于系统提示词里的默认规则。
一个值得深思的细节
注意 MEMORY.md 本身不是被注入的正文------它只是一个索引文件 ,列出了三条记忆的文件名和触发条件。当 Harness 发现 MEMORY.md 引用了 pentest-core-belief.md,它不会自动加载那个文件的内容,除非会话中实际触发了条件。这是一个按需加载的懒加载系统。
第三步:注入 Git 状态和当前日期
紧接着,Harness 再注入一个 <system-reminder> 块------这个块包含会话级别的环境快照:
swift
{
"role": "user",
"content": [
{
"type": "text",
"text": "<system-reminder>\n# claudeMd\n"
+ "Git status: master branch\n"
+ "Main branch: main\n"
+ "Git user: wbs\n"
+ "Recent commits: (none)\n"
+ "\n# currentDate\n"
+ "Today's date is 2026/06/27.\n"
+ "\n</system-reminder>"
}
]
}
为什么要把 Git 状态和日期注入?因为这些信息每一分钟都可能变化 ,不能放在 System Prompt 里(那会破坏缓存)。也因为这些信息模型需要知道才能正确工作------比如判断自己是否在 main 分支上、commit 时应该用哪个用户名。
第四步:收集可用工具列表
这是 Harness 最"重"的一步------把模型可以调用的全部工具及其参数 Schema 收集起来,塞进 API 请求的 tools[] 字段。
4.1 内置工具
Claude Code 约 40 个内置工具,每个都有完整的 JSON Schema。比如 Bash:
bash
{
"name": "Bash",
"description": "Executes a bash command and returns its output.\n\n"
+ "This tool runs Git Bash (POSIX sh), not cmd.exe or PowerShell. "
+ "Use Unix shell syntax: `/dev/null` not `NUL`, forward slashes, "
+ "`$VAR` not `%VAR%` or `$env:VAR`.",
"input_schema": {
"type": "object",
"properties": {
"command": {
"type": "string",
"description": "The command to execute"
},
"timeout": {
"type": "number",
"description": "Optional timeout in milliseconds (max 600000)"
},
"description": {
"type": "string",
"description": "Clear, concise description of what this command does"
},
"dangerouslyDisableSandbox": {
"type": "boolean",
"description": "Set this to true to dangerously override sandbox mode"
}
},
"required": ["command"]
}
}
4.2 MCP 工具(你的机器特有)
但真正的"重量级选手"是 MCP 工具。每启动一个 MCP 服务器,它声明的所有工具都会被展开成 JSON Schema 注入。
比如抖音 MCP 服务器提供了一个视频上传工具:
json
{
"name": "mcp__douyin__douyin_upload_video",
"description": "Upload a video to Douyin with specified title and description",
"input_schema": {
"type": "object",
"properties": {
"videoPath": {
"type": "string",
"description": "Path to the video file"
},
"title": {
"type": "string",
"description": "Video title"
},
"description": {
"type": "string",
"description": "Video description"
},
"tags": {
"type": "array",
"items": { "type": "string" },
"description": "Video tags/hashtags"
},
"headless": {
"type": "boolean",
"description": "Run browser in headless mode (default: false)"
},
"autoPublish": {
"type": "boolean",
"description": "Automatically click publish button (default: true)"
}
},
"required": ["videoPath", "title"]
}
}
命盘 MCP 服务器 就更夸张了------它暴露了 17 个工具 :bazi_basic、bazi_dayun、bazi_liunian、ziwei_basic、ziwei_daxian、qimen_basic、qimen_yongshen、qimen_zeri、meihua_basic、liuyao_basic、daliuren_basic......每个都有独立的 JSON Schema,每个参数都有详细的中文描述。
机器上,MCP 工具总数超过 60 个。 所有这些 Schema 都被塞进了每次 API 请求的 tools[] 字段。
这就是为什么 MCP 工具太多会显著影响性能和成本。 每个工具定义都消耗 token。你装了 17 个命盘工具 + 抖音 + PPT + Word + Figma,光工具定义就占了几百甚至上千 token。这些 token 每次 API 调用都要消耗------即使模型根本不会去用"八字排盘"来回答一个 Harness 问题。
第五步:拼装完整的 HTTP 请求
现在,所有组件到齐了。让我们看看最终发给 API 的完整 HTTP 请求体的结构(省略了重复部分,但保留了结构骨架):
swift
POST https://api.deepseek.com/anthropic/v1/messages
Authorization: Bearer 你的apikey
Content-Type: application/json
{
"model": "DeepSeek-V4-pro",
"max_tokens": 16000,
"system": [
{
"type": "text",
"text": "You are Claude Code, Anthropic's official CLI for Claude.\n\n"
+ "You are an interactive agent that helps users with software "
+ "engineering tasks..."
},
{
"type": "text",
"text": "## System\n"
+ "You are an interactive agent that helps users..."
},
{
"type": "text",
"text": "## Doing Tasks\n"
+ "Write code that reads like the surrounding code..."
},
{
"type": "text",
"text": "__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__"
},
{
"type": "text",
"text": "Platform: win32\n"
+ "Shell: bash\n"
+ "OS Version: Windows 11 Pro 10.0.26100\n"
+ "Current date: 2026/06/27\n"
+ "Working directory: C:\Users\HI\n"
+ "Model: DeepSeek-V4-pro"
}
],
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "<system-reminder>\n# claudeMd\n"
+ "[渗透核心信念层] [补天漏洞响应平台提交规范] "
+ "[3D 背景 + 玻璃 UI 叠加开发手册]\n"
+ "</system-reminder>"
}
]
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "<system-reminder>\n# claudeMd\n"
+ "Git status: master branch\n"
+ "Main branch: main\n"
+ "Git user: wbs\n"
+ "Recent commits: (none)\n"
+ "\n# currentDate\n"
+ "Today's date is 2026/06/27.\n"
+ "</system-reminder>"
}
]
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "介绍一下claude code这个harness吧"
}
]
}
],
"tools": [
{ "name": "Read", "input_schema": { ... } },
{ "name": "Bash", "input_schema": { ... } },
{ "name": "Write", "input_schema": { ... } },
{ "name": "Edit", "input_schema": { ... } },
{ "name": "Glob", "input_schema": { ... } },
{ "name": "Grep", "input_schema": { ... } },
{ "name": "WebSearch", "input_schema": { ... } },
{ "name": "WebFetch", "input_schema": { ... } },
{ "name": "Agent", "input_schema": { ... } },
{ "name": "Task", "input_schema": { ... } },
{ "name": "Skill", "input_schema": { ... } },
{ "name": "mcp__douyin__douyin_check_login", "input_schema": { ... } },
{ "name": "mcp__douyin__douyin_upload_video", "input_schema": { ... } },
{ "name": "mcp__douyin__douyin_login", "input_schema": { ... } },
{ "name": "mcp__mingpan__bazi_basic", "input_schema": { ... } },
{ "name": "mcp__mingpan__bazi_dayun", "input_schema": { ... } },
{ "name": "mcp__mingpan__ziwei_basic", "input_schema": { ... } },
{ "name": "mcp__mingpan__qimen_basic", "input_schema": { ... } },
{ "name": "mcp__mingpan__meihua_basic", "input_schema": { ... } },
{ "name": "mcp__mingpan__liuyao_basic", "input_schema": { ... } },
{ "name": "mcp__mingpan__daliuren_basic", "input_schema": { ... } },
{ "name": "mcp__word__create_document", "input_schema": { ... } },
{ "name": "mcp__word__add_paragraph", "input_schema": { ... } },
{ "name": "mcp__figma__get_design_context", "input_schema": { ... } },
{ "name": "mcp__figma__use_figma", "input_schema": { ... } }
// ... 总计 60+ 个工具
]
}
仔细看 messages[] 数组。
css
messages[0] = Harness 自动注入的 MEMORY 指令
messages[1] = Harness 自动注入的 Git 状态和日期
messages[2] = 你的原始问题:"介绍一下claude code这个harness吧"
你的问题只有 15 个字。但它前面塞了两个 <system-reminder> 块和一个完整的 System Prompt。在模型的"视角"里,它收到的不是一条简短消息,而是一整套"世界设定"------你是谁、这是哪台机器、有什么工具可用、有什么铁律必须遵守。你的问题只是在这个设定下最后出现的一小段文本。
第六步:请求在路上
现在这个 JSON 被打包,通过 HTTPS POST 发出。但注意这台机器的特殊配置:
6.1 目的地被重写
settings.json 里设置了 ANTHROPIC_BASE_URL: "https://api.deepseek.com/anthropic"。所以请求没有发往 Anthropic 的服务器,而是发往了 DeepSeek。
6.2 经过本地代理
.gitconfig 里配了 http.proxy = http://127.0.0.1:7897。Harness 发请求时遵循系统代理设置,实际路径是:
bash
你的终端 (C:\Users\HI)
│
│ HTTPS POST
│
▼
127.0.0.1:7897 (本地代理)
│
│ 转发
│
▼
api.deepseek.com/anthropic/v1/messages
6.3 模型收到的"身份"
DeepSeek 的 DeepSeek-V4-pro 模型收到请求,它读到的第一行 System Prompt 是:
rust
You are Claude Code, Anthropic's official CLI for Claude.
它被 Harness 强制赋予了一个它本不具有的身份。 模型自己可能无所谓------它只是一段推理引擎,你让它扮演什么它就扮演什么。但这揭示了 Harness 的核心权力之一:它定义模型的角色边界,模型无权质疑。
第七步:模型返回之后------Harness 的响应处理
模型处理完请求,返回的不是一段文字,而是一个Server-Sent Events(SSE)流,由 Query Engine 解析。
7.1 正常的文字输出
json
{"type": "content_block_start", "index": 0, "content_block": {"type": "text"}}
{"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "Agent"}}
{"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": " Harness"}}
{"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": " 是"}}
{"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": " Claude"}}
{"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": " Code"}}
// ...
Query Engine 收到这些事件后,把 text_delta 逐字渲染到你的终端------就是你现在看到的这些文字。这种流式渲染让你感觉模型在"实时思考"。
7.2 模型想调用工具
当模型决定使用工具时,流式响应会穿插 tool_use 事件:
json
{"type": "content_block_start", "index": 1, "content_block": {"type": "tool_use", "id": "toolu_xxx", "name": "WebSearch"}}
{"type": "content_block_delta", "index": 1, "delta": {"type": "input_json_delta", "partial_json": "{"query":"Claude Code har"}}
此时 Harness 暂停流式渲染,进入 TAOR(Think → Act → Observe → Repeat)循环:
markdown
1. 解析出 tool_use → 模型要调用 WebSearch
2. 权限检查:WebSearch 在 allow 列表里 → 放行
3. 实际执行 HTTP 请求,搜 "Claude Code harness architecture"
4. 搜索结果作为 tool_result 喂回 messages[]
5. 重新调用模型,模型基于搜索结果继续生成回复
6. 如果模型又要调工具 → 回到步骤 1
7. 模型输出纯文本 → 结束循环,渲染到终端
核心循环逻辑只有约 50 行代码:
bash
while model_response contains tool_calls:
execute_tools(tool_calls)
append_results_to_history(results)
model_response = call_model(history)
return model_response
这就是 Harness 的执行引擎。它不做任何决策,所有"下一步做什么"都是模型决定的。Harness 只负责执行工具、喂回结果、继续循环,直到模型不再要求工具。
7.3 权限在其中扮演的角色
假设模型在回复中插入了一个危险的 tool_use:
json
{
"type": "tool_use",
"name": "Bash",
"input": { "command": "rm -rf /" }
}
Harness 拿到这个请求后,不立即执行。它先跑权限管道:
arduino
1. 检查 deny 规则 → 不匹配
2. 检查 allow 规则 → "Bash" 没有全放开,只有 "Bash(python:*)" → 不匹配
3. 回退到 defaultMode → "acceptEdits"
4. Bash 不是 Edit → 需要弹窗询问用户
弹窗出现在你的终端上:
bash
⚠ Bash: rm -rf /
Allow / Deny / Always allow
模型可以"想"删你的文件。但它想归想------Harness 的权限系统是一道模型无法绕过的物理关口(exit code 2 的 PreToolUse Hook 甚至可以阻断任何工具调用)。这是 Harness 最根本的安全保证:模型拥有无限想象力,但只有 Harness 拥有执行力。
完整流水线一图到底
sql
你敲: "介绍一下claude code这个harness吧" (15字)
│
▼
┌──────────────────────────────────────────────────────────┐
│ ① Harness 读 settings.json │
│ 发现: API 走 DeepSeek, 模型 DeepSeek-V4-pro │
│ 发现: 权限模式 acceptEdits │
│ 发现: 自动允许 Read/Glob/Grep/WebSearch/命盘全套 │
└──────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ ② Harness 拼 system[] 提示词 │
│ ┌─ 静态前缀 (~3000 tokens): "You are Claude Code..." │
│ │ (全局缓存, 每次调用不重复付费) │
│ ├─ __SYSTEM_PROMPT_DYNAMIC_BOUNDARY__ │
│ └─ 动态后缀: Win11, bash, C:\Users\HI, 2026/06/27 │
└──────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ ③ Harness 扫硬盘, 找到指令文件 │
│ ├─ CLAUDE.md: 无 (项目/用户/系统 三级都没有) │
│ ├─ MEMORY.md: 3条记忆 → 注入 <system-reminder> 块 │
│ │ ├─ 渗透核心信念层 (触发: 渗透任务启动时) │
│ │ ├─ 补天漏洞报告规范 (触发: "生成补天报告文件") │
│ │ └─ 3D 玻璃 UI 手册 (触发: 写前端页面时) │
│ └─ Git 状态: master, user wbs, 无最近 commit │
│ 全部包装成 <system-reminder> 块注入 messages[] │
└──────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ ④ Harness 收集可用工具 │
│ 内置工具: Read, Write, Edit, Bash, Glob, Grep, │
│ WebSearch, WebFetch, Agent, Task, Skill... │
│ │
│ 你的 MCP 工具 (60+ 个): │
│ ├─ 命盘: bazi_basic/dayun/liunian + ziwei + qimen │
│ │ + meihua + liuyao + daliuren (共17个) │
│ ├─ 抖音: check_login, login, upload_video, get_cookies │
│ ├─ Word: 50+ 工具 (create/open/edit/format/table...) │
│ ├─ PPT: powerpoint 全套 │
│ └─ Figma: 20+ 工具 (design_context, use_figma...) │
│ │
│ 每个工具带完整 JSON Schema → 全部塞入 tools[] │
│ 仅工具定义就消耗数百 token │
└──────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ ⑤ 组装完整 messages[] │
│ messages[0] = <system-reminder> 3条MEMORY指令 │
│ messages[1] = <system-reminder> Git状态 + 日期 │
│ messages[2] = "介绍一下claude code这个harness吧" ← 你! │
│ │
│ 你的问题只有15字, 前面几千字都是Harness自动附加的 │
└──────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ ⑥ HTTPS POST → api.deepseek.com/anthropic/v1/messages │
│ 经代理: 127.0.0.1:7897 │
│ Header: Authorization: Bearer sk-6fbd...b924 │
│ Body: 上面全部 (system + messages + tools) │
└──────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ ⑦ DeepSeek-V4-pro 处理请求 │
│ 它读到的 system prompt: "You are Claude Code..." │
│ 它收到的上下文: 渗透信念 + 补天规范 + 玻璃UI手册 │
│ 它可用的工具: 60+ 个, 从读文件到排八字到发抖音 │
│ 它决定: 调用 WebSearch 搜 "Claude Code harness" │
└──────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ ⑧ Harness 收到 SSE 流 → 执行 TAOR 循环 │
│ ├─ text_delta → 逐字渲染到终端 │
│ ├─ tool_use(WebSearch) → 权限检查 → 放行 → 执行搜索 │
│ │ └─ 搜索结果 → 喂回模型 → 模型继续生成 │
│ ├─ tool_use(WebSearch) → 再次搜索(补充信息) │
│ │ └─ 结果 → 喂回模型 │
│ └─ 模型输出纯文本 → 循环结束 │
└──────────────────────────────────────────────────────────┘
│
▼
你的终端显示出: "Agent Harness 是 Claude Code 的底层运行时框架..."
三个你读完应该记住的关键事实
1. 你的问题是"少数派",不是"主角"
在发给模型的完整请求中,你的原始输入 "介绍一下claude code这个harness吧" 只占约 15 个 token。而 Harness 自动附加的上下文------system prompt、记忆注入、工具定义、对话历史------占了数千 token。你的问题被包裹在一个巨大的"指令外壳"里送到模型面前。这就是为什么 Claude Code 能够比裸 API 调用更"懂你":不是模型变聪明了,而是 Harness 在每次调用前都做了大量上下文预处理。
2. 模型的身份是 Harness 强加给它的
这台机器用的是 DeepSeek-V4-pro 模型。但 DeepSeek 的模型训练时从不知道"Claude Code"是什么。它收到的 system prompt 第一行就是 "You are Claude Code"------这是 Harness 在 HTTP 请求里单方面宣告 的身份。模型只是照着扮演。这件事的反面是:如果你换了 API 提供商,只要 Harness 不变,模型的行为模式就会保持高度一致。 Harness 的一致性来自架构,不是来自模型。
3. 模型决定"做什么",Harness 决定"允不允许"
模型的 tool_use 是请求 ,不是命令 。Harness 在执行前先过权限管道:deny → allow → defaultMode。模型可以"想"删你全盘,Harness 会弹窗。模型甚至不知道它的请求被拒绝了------Harness 只是告诉它"操作未执行"。那道权限关是物理的、不可绕过的。这是整个 Cliffordian 安全模型的核心:模型拥有无限想象力,但只有 Harness 拥有执行力。
理解了这条流水线,你就能理解为什么:
- CLAUDE.md 的内容要精简 --- 它被注入到每一次 API 调用的 messages 里,200 行和 2000 行 CLAUDE.md 的 token 成本差异是真实的
- MCP 工具不能装太多 --- 每个 MCP 服务器的工具定义都塞进 tools\[\],60 个工具和 6 个工具的每次请求 token 消耗完全不同
<system-reminder>优先级为什么高 --- 它不是一句普通的话,是 Anthropic 刻意训练的优先级标记,模型被训练为对它言听计从- 为什么同一模型在不同 Harness 下表现差异巨大 --- 模型只是一个推理引擎。给它什么系统提示词、注入什么上下文、暴露什么工具------这些 Harness 层面的差异,比模型本身的差异更影响最终行为。TerminalBench 的评测验证了这一点:同一模型在不同 Harness 下,性能差异超过不同模型在同一 Harness 下的差异
本文所有示例数据均来自作者的真实开发环境(Windows 11, DeepSeek-V4-pro, 60+ MCP 工具),配置信息已脱敏。
如果你想自己验证本文描述的流水线,可以在 Claude Code 中设置
ANTHROPIC_LOG=debug环境变量查看完整的 API 请求日志。