Claude Code 子代理费用:一次 $0.17 运行的钱花在哪
通过网关完成一次 Claude Code 运行,并按三个代理分别拆解调用费用:三个代理各自的首次调用合计占总账单的 72%。本次总费用为 $0.17,首次调用合计约 $0.1224,其余调用占 28%,约 $0.0476。网关接入配置只需设置两个环境变量。
我们的推荐
实时价格| 模型 | 结论 | 价格 |
|---|---|---|
| Claude Sonnet 5.5 一次 Claude Code 运行包含 11 次调用和两个子代理,冷缓存时费用为 $0.1728,半分钟后为 $0.0812。缓存写入占冷缓存运行费用的 77%。 | 演示中的模型 | 低至 $2/百万 |
目录
Claude Code 会告诉你一次会话花了多少钱,但不会告诉你钱花在会话的哪个环节。团队开始使用后,账单属于哪个仓库、哪个开发者,也无从判断。让 Claude Code 通过网关访问模型就能解决这两个问题,不需要插件或封装程序。网关是 Claude Code 与模型提供商之间的代理,本来就能看到每个请求;Claude Code 也已经在请求中附带了会话 ID 和代理 ID。本文通过 Synthorai 网关运行一个小任务,再查看费用明细:11 个请求共花费 $0.1728,三个代理各自的首次调用占了总费用的 72%。
TL;DR
- 通过网关在 Claude Sonnet 5.5 上运行一次 Claude Code,使用两个子代理,费用为 $0.1728;半分钟后重复运行,费用为 $0.0812。
- 首次运行中,缓存写入占费用的 77%,三个代理各自的首次调用占 72%。
- 两个子代理占会话费用的 39%。
- 两个环境变量就能让 Claude Code 通过网关访问模型,第三个变量用于标明各子代理的类型。
代码位于 github.com/synthorai-io/use-cases 的 coding-agent-spend/ 目录中。需要 Python 3.10 或更高版本,以及 2.1.280 或更高版本的 claude 命令,这是该模型的版本要求。
git clone https://github.com/synthorai-io/use-cases
cd use-cases
cp .env.example .env # put your API key in it
cd coding-agent-spend
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python run.py --hints --label repo=shipping --label _user=dev_1
脚本会复制一个小型示例仓库,再启动 Claude Code;仓库中有一个测试未通过。网关地址和密钥只会设置在该进程的环境中,配置目录也是空的,因此不会读取或修改你现有的 Claude Code 配置。一次运行约需半分钟。脚本通过 --max-budget-usd 将单次运行费用限制为 $0.60;如果一次运行可能让累计费用超过 $2,脚本就不会启动它。

本文数据来自 2026 年 10 月 10 日的运行,使用 Claude Code 2.1.296 和 Claude Sonnet 5.5。
如何让 Claude Code 通过网关访问模型?
设置两个环境变量即可。Claude Code 使用 Anthropic 的 Messages API,网关在自己的地址上提供相同的 API:
export ANTHROPIC_BASE_URL="https://synthorai.io" # no /v1: Claude Code adds /v1/messages itself
export ANTHROPIC_API_KEY="<your gateway key>"
其他配置不变。具体说明见 Claude Code 集成文档。设置后,每个会话的每次模型调用都会进入网关请求日志,并在控制台中分组显示。
不做其他配置,网关能看到什么?
网关能看到会话、会话中的 trace、客户端和各个子代理。Claude Code 的每个请求都带有自己的会话 ID,因此一次 claude 运行在控制台中对应一个会话,会话页面会将客户端显示为“Claude Code 2.1.296”。请求在控制台中还会显示 trace ID,所以会话页面也会列出所属的 trace:本次运行有两个,分别包含 6 次和 5 次调用。“Agents in this session”表格已经按代理拆分了调用,主对话和各个子代理各占一行。
子代理是 Claude Code 为完成任务中的一部分工作而启动的另一个代理,有独立的指令和上下文。示例任务要求使用两个子代理:内置的 Explore 子代理负责找到规则所在的位置,自定义的 test-runner 子代理负责运行测试。
默认情况下,子代理以 a05e467acd14b25e6 这样的 ID 显示。你能看出有两个子代理,却分不清各自负责什么。再加一个变量即可解决:
export CLAUDE_CODE_GATEWAY_HINT_HEADERS=1
| 默认配置 | 设置提示变量后 | |
|---|---|---|
| 会话、trace、客户端和费用 | 有 | 有 |
| 按 ID 单独列出子代理 | 有 | 有 |
子代理类型(Explore、custom) | 无 | 有 |
| 每次调用的类别,以及调用前运行的工具 | 无 | 有 |
启用后,表格会按类型标识各个子代理。在 Logs 中打开一次调用,可以看到调用类别(subagent:Explore),以及“Tools before this call”列表,其中列出各工具的名称和运行耗时,例如 Read 7 ms。网关保存的是代理类型,而不是你给它起的名字,因此 test-runner 会显示为 custom。工具名称和运行耗时会被保存,工具读取或写入的内容不会。
这 $0.17 花在哪了?
费用分摊到三个代理上,大部分花在各自的首次调用。
| 代理 | 调用次数 | 输入 token | 缓存命中率 | 费用 |
|---|---|---|---|---|
| 主对话 | 6 | 159k | 78.9% | $0.1053 |
| Explore 子代理 | 3 | 47.5k | 64.7% | $0.0575 |
custom 子代理(test-runner) | 2 | 5,323 | 48.1% | $0.0101 |
| 会话 | 11 | 212k | 74.9% | $0.1728 |
两个子代理共花费 $0.0676,占会话费用的 39%,但它们负责的只是任务中最小的两项工作:在只有三个源文件的库中找到一条规则,以及运行五个测试。修复本身只改了一个字符,将 > 改为 >=。
原因可以从 Claude Code 在运行结束时打印的 token 数量中看出来:
claude-sonnet-5-5 20 in 158612 cache read 53058 cache write 2425 out $0.1728
按该模型每百万 token 的价格计算(输入 $2、输出 $10、缓存读取 $0.10、缓存写入 $2.50),这四项的费用如下:
| token 类型 | token 数量 | 费用 | 占比 |
|---|---|---|---|
| 缓存写入 | 53,058 | $0.1326 | 77% |
| 输出 | 2,425 | $0.0243 | 14% |
| 缓存读取 | 158,612 | $0.0159 | 9% |
| 未缓存的输入 | 20 | $0.0000 | 0% |
缓存写入占账单的 77%。首次发送某个 prompt 前缀时会写入缓存,费用是输入价格的 1.25 倍;后续请求读取该缓存,在这个模型上的价格只有输入价格的二十分之一。编码代理的 prompt 包含系统提示词和所有工具的定义,所以在你输入任何内容之前,它就已经很长了。这也使得代理的首次调用最贵。
每个代理都有自己的初始 prompt,因此都要支付首次调用的费用:
| 首次调用所属代理 | 输入 token | 缓存命中率 | 费用 |
|---|---|---|---|
| 主对话 | 30.0k | 0% | $0.0772 |
| Explore 子代理 | 14.9k | 0% | $0.0391 |
| custom 子代理 | 2,562 | 0% | $0.0077 |
这三次调用共花费 $0.1240,占整次运行的 72%。之后的调用都很便宜:Explore 子代理的第二次和第三次调用有 94% 的输入来自缓存,费用分别为 $0.0052 和 $0.0132。
如果子代理能让主对话的上下文少装入大量读取内容,它的冷启动费用就值得支付。这也是 Explore 在真实代码库中的用途。如果一项工作只需要一两次调用,在主对话中完成就能省去一次缓存写入。这里使用的只是一个小仓库,调整工作方式之前,先看看你自己会话中的费用分布。
第二次运行要花多少钱?
如果启动时缓存还有效,费用大约只有一半。我们在半分钟后再次运行了相同任务。第二次同样发起了 11 次调用,但缓存读取占输入的比例从首次的 74.9% 升至 93.1%,费用从 $0.1728 降至 $0.0812。三个代理的首次调用分别有 82%、81% 和 71% 的输入来自缓存,因为它们的初始 prompt 已经在上一次运行中写入缓存。
Anthropic 缓存条目的默认有效期为五分钟,每次读取都会续期。开发者持续在同一个仓库中工作时,大部分调用按缓存已预热的费用计费。每小时执行一次的定时任务,则每次都要支付冷缓存费用。
Claude Code 自己显示的费用和账单一致吗?
在 2.1.296 上,两边精确到小数点后四位都一致:冷缓存为 $0.1728,热缓存为 $0.0812。是否一致取决于版本。Claude Code 使用自己的价格表计算费用。2.1.278 在 10 月 8 日仍能运行这个模型,但它使用的输入和输出价格分别为每百万 token $5 和 $25,实际账单则按 $2 和 $10 计费,因此显示的费用约为实际扣费的 2.7 倍。每次两边的 token 数量都完全一致。
这会影响一个设置:--max-budget-usd 在 Claude Code 自己计算的费用达到上限时停止运行。旧版本中,一次运行在 Claude Code 计数达到 $0.60 时被停止,实际账单只有这个数的约三分之一。升级后,对照会话页面核验一次费用。真正要依赖的费用上限,应设置在实际计费的位置,也就是 API key 的支出限额。
如何按开发者或仓库拆分费用?
给每个请求加上标签即可。Claude Code 已经支持通过环境变量发送自定义请求头:
export ANTHROPIC_CUSTOM_HEADERS='X-Synthorai-Metadata: {"repo":"shipping","_user":"dev_1"}'
X-Synthorai-Metadata 是网关用于接收标签的请求头。它接受一个扁平 JSON 对象,最多包含 10 个短字符串,其中 _user 用于标识请求是为谁发起的。示例中的 --label 参数设置的正是这个请求头,上面的会话页面也以标签形式显示了这两个值。
在各开发者的 shell 配置文件中设置个人标签,在项目加载环境变量的位置设置仓库标签,就能使用两个视图:
- 在 Traces 的搜索框输入
metadata.repo = shipping,即可列出该仓库的会话。 - 在 Analytics 的 Breakdown 标签页中,Cost by metadata 卡片按指定键的各个值汇总请求数和费用。选择
repo可查看各仓库的账单,选择_user可查看各开发者的账单。
共用一个 key 也能做到这些。给每个开发者分配独立 key,同样能拆分账单,还能单独设置支出限额,代价是需要管理更多 key。
如何跨会话查看代理费用?
使用 Analytics 的 Breakdown 标签页中的 Cost by agent 卡片。会话页面只拆分单个会话,这张卡片则按代理类型汇总所选时间范围内的所有会话:

Explore × 2 和 custom × 2 对应上面的冷缓存和热缓存运行,按代理类型汇总了两个会话。Share 列表示该行占所选时间范围内全部费用的比例,这个范围内还包含其他会话。不设置提示变量时,子代理不会上报类型,会统一计入名为“Sub-agent”的一行。你自己的程序如果像 追踪 LLM 代理 中的示例那样自行设置 X-Agent-Id,就会以发送的名称单独显示一行。
查看团队一周的会话数据,就能知道子代理在账单中占比高不高,以及费用主要来自哪种类型。
这套配置不能提供什么?
它不能提供 span ID、自定义代理名称、隔离运行的快捷方式,也不能展示实际工作内容。
- 没有 span ID。Claude Code 2.1.296 的请求带有会话 ID 和 trace ID,但没有 span ID,因此调用的 span 字段显示为“not sent”。可用于分析的单位是会话、会话中的 trace 和代理。
- 没有自定义代理名称。所有自定义子代理都显示为
custom。如果运行了多种自定义代理,需要区分它们,会话页面上的代理 ID 是唯一可用的标识。 - 没有隔离运行的快捷方式。
--bare看起来可以让 Claude Code 不加载你自己的插件和设置,但它也会禁用子代理,整个会话只剩一个代理,无从拆分。示例改用空的CLAUDE_CONFIG_DIR来隔离运行。 - 看不到实际工作内容。网关记录模型调用、工具名称和运行耗时,不记录文件内容、diff 或命令输出。
常见问题
一次 Claude Code 会话要花多少钱?
费用取决于模型、仓库大小、参与的代理数量,以及缓存是否已预热。本文通过 Claude Sonnet 5.5 运行了 11 个请求,使用两个子代理修复一个字符的 bug。冷缓存时费用为 $0.1728,半分钟后重复运行则为 $0.0812。
如何追踪团队的 Claude Code 费用?
通过 ANTHROPIC_BASE_URL 将所有开发者的 Claude Code 指向网关,再通过 ANTHROPIC_CUSTOM_HEADERS 添加开发者和仓库标签。网关就能按会话、标签值和代理类型汇总费用,无需在 Claude Code 中安装任何东西。
Claude Code 子代理会增加费用吗?
每个子代理都有自己的初始 prompt,也要单独支付缓存写入费用。在使用 Claude Sonnet 5.5 的示例中,Explore 子代理的首次调用花费 $0.0391,后两次分别为 $0.0052 和 $0.0132。两个子代理合计占会话费用的 39%。这笔费用换来的是独立上下文,适合大范围探索,不适合一次调用就能完成的工作。
Claude Code 打印的费用准确吗?
每个版本都核验一次。Claude Code 2.1.296 打印的 $0.1728 与实际账单一致。Claude Code 2.1.278 对 Claude Sonnet 5.5 使用的价格是每百万 token $5 和 $25,账单实际按 $2 和 $10 计费,因此打印的费用约为账单的 2.7 倍。两个版本的 token 数量都与账单一致。
CLAUDE_CODE_GATEWAY_HINT_HEADERS 有什么作用?
它让 Claude Code 在每个请求中多发送三类信息:代理类型、调用类别,以及调用前运行的工具名称和耗时。不设置它,网关仍能看到会话和各个子代理,但只能通过 ID 区分子代理。
延伸阅读
- 追踪 LLM 代理:为你自己编写的代理使用同样的控制台视图。
- LLM 代理为什么这么贵?:复现并解决缓存未命中、上下文增长和重试循环问题。
- LLM 代理为什么这么慢?和调试 LLM 代理:用同样的视图分析延迟和故障。
- 让 Claude 分析你的 LLM 日志:通过网关的 MCP server 回答这类会话相关的问题。
- 为代理提供日志工具:用你自己的程序读取同样的日志,并查看模型 token 的费用。
- Claude Code 集成:两个环境变量和模型名称。
- 请求头参考:网关会读取 Claude Code 和其他代理的哪些请求头。