← Garden of Thoughts

Sherry 和 Claude 理清三套独立的计费体系

June 6, 2026 python claude-api billing claude-code prompt-caching vs-code

一个脚本、三张账单,外加一堂缓存课

这次会话从一个简单的问题开始——我的 Claude token 额度还够用吗?——最终演变成一次对 Claude 计费方式的全面梳理,顺手还修了一个 Python 脚本的结构问题。

脚本是做什么的

这个项目是一个家族历史研究工具:一个 Python 脚本,把扫描好的中文 PDF 文件逐页转换为 Markdown,调用的是 Claude 的视觉 API。每一页先渲染成 PNG 图片,经过 base64 编码后,连同中文 OCR 提示词一起发送给 Claude,响应结果以结构化 Markdown 的形式逐页返回。

我们逐一审查了核心 API 调用 client.messages.create 中的每个参数:modelmax_tokenscache_control,以及同时携带图片和指令文本的多模态 messages 数组。

修复提示词缓存

脚本原本在 API 调用的顶层设置了 cache_control={"type": "ephemeral"}——这是一个自动缓存的快捷方式,会锁定请求中最后一个可缓存的内容块。问题在于:图片排在内容数组的最后。由于每一页图片的字节数据都不同,它的内容直接成了缓存键的一部分,导致每一页都命中不了缓存。

修复方案分两步:

  1. 把指令文本块移到图片块前面
  2. 直接在文本块上添加 "cache_control": {"type": "ephemeral"}

这样一来,缓存键只覆盖固定不变的文本提示词,而每页变化的图片位于缓存断点之后,不再影响缓存命中。

有一点需要坦诚说明:claude-sonnet-4-6 要求缓存断点之前至少有 2048 个 token,才会真正写入缓存。目前这段提示词大约只有 150 个 token,实际上不会触发缓存。但这次修复在结构上是正确的,等提示词内容扩充之后自然会生效。

三套计费体系

从 token 额度这个问题出发,我们整理出了一张更清晰的 Claude 计费地图。Claude 有三套独立的计费体系,彼此之间互不共享额度:

Anthropic API 计费 — 按 token、按调用量收费。Python 脚本里每一次 client.messages.create() 都走这条通道,与任何订阅计划完全无关,费用计入你的 API 账户。

Claude Pro 订阅 — 每月 20 美元固定月费。覆盖 claude.ai 网页版聊天,以及用 claude.ai 账号登录时在 VS Code 中使用 Claude Code。有每月消息条数上限,并非无限制使用。

VS Code 中的 Claude Code — 这是最容易被忽视的一套。根据配置方式的不同,它要么消耗你的 Pro 订阅额度,要么按 token 计费到与 Python 脚本相同的 API 账户。编辑器自动带入提示词的每一段代码片段,都会计入你所在的那个计费桶。

我们通过发送一条测试消息,确认 VS Code 插件已正常登录并正常工作。那个上下文标签 </> pdf_to_markdown.py#40-... 表明编辑器已自动把选中的代码作为上下文带入了请求。


延伸阅读


由 Claude Code 协助编辑与润色。