Claude Code Harness 深度拆解:从你敲回车到模型回复,中间发生了什么

本文以一台真实的 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"
  }
}

这里有两个关键信息:

  1. 模型路由被重写了 。原生 Claude Code 应该请求 api.anthropic.com,但这台机器通过 ANTHROPIC_BASE_URL 把请求导向了 api.deepseek.com/anthropic,使用 DeepSeek-V4-pro 模型。Harness 对此完全不关心------它只管按配置文件拼 HTTP 请求。
  2. 权限模式是 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_basicbazi_dayunbazi_liunianziwei_basicziwei_daxianqimen_basicqimen_yongshenqimen_zerimeihua_basicliuyao_basicdaliuren_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 请求日志。

相关推荐
用户252736278142 小时前
【踩坑复盘】我在本地跑 RAG 知识库时踩了 5 个大坑,吐血整理避坑指南
人工智能
大模型真好玩2 小时前
LangChain DeepAgents 速通指南(九)—— 生产级智能体框架 DeepAgents Code 源码导读
人工智能·langchain·agent
用户018349301695 小时前
用Zustand管理AI多会话状态
人工智能
武子康7 小时前
调查研究-198 Agent 到底该记住什么?读懂《What Must Generalist Agents Remember?》
人工智能·openai·agent
aqi008 小时前
15天学会AI应用开发(九)利用Chroma持久化向量数据
人工智能·python·大模型·ai编程·ai应用
武子康9 小时前
调查研究-197 FAISS vs Elasticsearch 全面对比:从向量检索、全文搜索到 RAG 选型指南
人工智能·elasticsearch·agent
青禾网络9 小时前
Web 前端如何接入 AI 音效生成:从零到可用的完整方案
人工智能·设计模式
用户252736278149 小时前
【技术实战】用 Spring Boot + Vue3 + LM Studio 在本地跑通 RAG 知识库
人工智能