账单变大了,却看不出钱花在了构建什么上

当 AI 编程工具成本上升时,人们往往会先查看按模型划分的使用金额或按用户排名。但仅靠那张表,很难解释支付改造花了多少钱,或故障响应和被取消的实验投入了多少成本。

标题中的“每月 15 万美元”并非经过验证的 Navigara 客户账单或节省成果。这是一则由 Navigara 联合创始人讲述的轶事:他在担任 CTO 时,CFO 曾问他,“Claude 每月是否创造了近 15 万美元的实际价值?”公司、期间、用户数和账单凭证均未公开,因此它只能被视为展示问题规模的一个问题。

不过,这个问题的方向是有效的。只有展示花的钱不是流向了哪个模型,而是流向了哪个产品目标并产生了什么结果,才能决定该增加还是削减预算,或者改进工作方式。

先完整回收一个月的使用成本

第一个产出不应是庞大的仪表板,而应是一份完整获取 Claude Platform 一个月费用的账本。以下流程仅限于使用组织 Admin API 密钥和 x-api-key 请求头的路径。使用 OAuth 令牌的组织采用不同的认证请求头,因此不能原样使用这些命令。个人账户、Claude Enterprise 和 Claude Platform on AWS 也不能使用相同的 API 端点。

  1. 在官方文档中确认账户类型是否适用。 打开Usage and Cost API 文档,先确认当前组织和凭据是否受支持。
  2. 准备 curl、jq 和 Python 3。 在终端运行以下检查命令。若缺少工具,请使用受管设备认可的软件渠道或适合操作系统的包管理器安装,然后再次确认三条命令都能输出版本信息。
curl --version
jq --version
python3 --version
  1. 将组织的 Admin API 密钥载入当前 shell。 准备由 Claude Console 中的组织管理员签发的 Admin API 密钥,并通过组织批准的密钥管理工具将其注入 ANTHROPIC_ADMIN_KEY 环境变量。不要将密钥值直接写入脚本、账本或共享文档。
  2. 让 UTC 时间范围和存储文件夹符合实际核对范围。 以下值是查询 2026 年 8 月的说明性输入。本文没有在已认证组织中运行命令或复现响应。
  3. 运行脚本,将所有页面保存为唯一文件。 Cost API 的默认上限是 7 个 bucket,最大值为 31。脚本请求 limit=31,并在 has_more=true 时自动传递 next_page。
set -eu
: "${ANTHROPIC_ADMIN_KEY:?Load an Anthropic Admin API key first}"

STARTING_AT='2026-08-01T00:00:00Z'
ENDING_AT='2026-09-01T00:00:00Z'
REPORT_DIR='./claude-cost-2026-08'
mkdir -p "$REPORT_DIR"

page=''
page_number=1
while :; do
  output_file=$(printf '%s/page-%03d.json' "$REPORT_DIR" "$page_number")
  if [ -n "$page" ]; then
    curl --fail-with-body --silent --show-error --get \
      'https://api.anthropic.com/v1/organizations/cost_report' \
      -H "x-api-key: ${ANTHROPIC_ADMIN_KEY}" \
      -H 'anthropic-version: 2023-06-01' \
      --data-urlencode "starting_at=${STARTING_AT}" \
      --data-urlencode "ending_at=${ENDING_AT}" \
      --data-urlencode 'limit=31' \
      --data-urlencode 'group_by[]=workspace_id' \
      --data-urlencode 'group_by[]=description' \
      --data-urlencode "page=${page}" > "$output_file"
  else
    curl --fail-with-body --silent --show-error --get \
      'https://api.anthropic.com/v1/organizations/cost_report' \
      -H "x-api-key: ${ANTHROPIC_ADMIN_KEY}" \
      -H 'anthropic-version: 2023-06-01' \
      --data-urlencode "starting_at=${STARTING_AT}" \
      --data-urlencode "ending_at=${ENDING_AT}" \
      --data-urlencode 'limit=31' \
      --data-urlencode 'group_by[]=workspace_id' \
      --data-urlencode 'group_by[]=description' > "$output_file"
  fi

  jq -e '.data and (.has_more | type == "boolean")' "$output_file" >/dev/null
  has_more=$(jq -r '.has_more' "$output_file")
  [ "$has_more" = 'true' ] || break
  page=$(jq -r '.next_page // empty' "$output_file")
  [ -n "$page" ] || { echo 'has_more=true but next_page is missing' >&2; exit 1; }
  page_number=$((page_number + 1))
done

python3 - "$REPORT_DIR" <<'PY'
from decimal import Decimal
from pathlib import Path
import json, sys

files = sorted(Path(sys.argv[1]).glob('page-*.json'))
amount_cents = Decimal('0')
buckets = []
for path in files:
    payload = json.loads(path.read_text())
    for bucket in payload['data']:
        buckets.append((bucket['starting_at'], bucket['ending_at']))
        for result in bucket['results']:
            if result['currency'] != 'USD':
                raise SystemExit(f"Unexpected currency: {result['currency']}")
            amount_cents += Decimal(result['amount'])
print(f'pages={len(files)}')
print(f'buckets={len(buckets)}')
if buckets:
    print(f'range={min(x[0] for x in buckets)}..{max(x[1] for x in buckets)}')
print(f'amount_cents={amount_cents}')
print(f'amount_usd={amount_cents / Decimal("100")}')
PY

成功标准是请求无错误完成,最后一个响应的 has_more 为 false,且输出的 bucket 范围覆盖预期 UTC 时间段。每一页都应分别保留,例如 page-001.json,并且应输出 amount_cents 和 amount_usd。如出现认证错误、无效 JSON、缺少 next_page 或意外的货币,请不要进入成本分摊阶段。

Cost API 的 amount 并不是美元,而是以 USD 分为单位的 decimal string,并且可能出现小数分。因此,脚本使用 Python 的 Decimal 而非二进制浮点数求和,随后除以 100。如果分的合计为 18420,使用成本就是 USD 184.20。Priority Tier 费用不包含在此 API 中,必须保留为单独的费用行。

卡片付款额和使用成本属于不同账本

对于预付费 Claude 账户,不要把当月 Cost API 合计与当月卡片付款额直接核对。 大多数 Claude Console 组织会先购买 usage credits,并可在余额低于设定阈值时自动充值。8 月的卡片付款可能是购买未来使用的积分,而不是 8 月产生的成本。

账户方式首先与 Cost API 比较的值付款记录处理方式
预付积分相同 UTC 时间段的 Console Usage/Cost 记录将手动和自动充值作为积分购买单独记录
月度后付费合同同一期间的使用费用明细或发票将税费、折扣、积分和调整额拆分为单独行

对于预付费账户,请使用期初积分余额 + 期间购买额 ± 调整额 − 期间使用额 = 期末积分余额来确认资金流。先将 Cost API 使用额与同一期间的 Console Usage/Cost 记录比较,并将卡片付款、手动充值和自动充值作为购买行处理。如仍存在差异,应检查 UTC 时间段边界、Priority Tier 等 API 排除项、积分到期、折扣、税费和其他调整。

成本回收完成的信号不是卡片付款额恰好与 API 合计相等,而是所有页面都已保存、分已正确转换、使用成本可与同一期间的 Console 记录合理对应,并且积分购买与使用显示在不同的行中。

区分原始成本和按 PR 分摊的金额

核对供应商费用后,请用以下列创建账本。

原始成本行 ID · 期间 · 供应商 · 产品 · 原始金额 · 分摊金额 · 工作区 · 仓库 · PR · 议题 · 倡议 · 关联依据 · 归属状态 · 发布状态 · 质量结果

Claude Platform Cost API 可按天查询费用,并可按 workspace_id 和 description 分组,但不提供 PR、议题或路线图标识符。 供应商 API 是账单核对的起点,而不是完整的路线图成本表。

来源数据能够确认的内容需额外关联的记录
供应商成本按产品和工作区划分的使用成本编程工具会话或仓库
仓库·PR实际代码变更分支或 PR 正文中的议题键
议题·史诗工作目的和负责范围倡议·路线图
路线图项按目标分摊的成本发布·返工·故障结果

如果有审批记录表明某个工作区仅用于支付改造,就可以在倡议层级直接归属该成本。但这不意味着可以把全部月度工作区成本写成某一个 PR 的直接成本。要形成按 PR 的成本,需要同时记录会话成本和会话 ID,或者需要额外的预先约定的分摊标准。

Navigara 也提出了一种产品概念:按工作类型和是否与路线图对齐来分类 AI 支出,并将其关联到倡议、史诗、工单和代码变更。 不过,公开页面没有充分说明如何将单个供应商成本事件连接到会话和 PR,也没有说明如何处理混合多个议题的会话冲突。屏幕中的支出金额和节省比例也不应被解读为经过独立验证的客户成果。

不要混合已确认的成本和估算的成本

有用的成本表不是看起来精细的表,而是能显示哪些部分已验证、从哪里开始是估算的表。

  • 直接归属:有明确依据的成本,例如专用于特定倡议的工作区,或与成本一同记录的会话 ID
  • 估算归属:按用户、仓库、时间段、变更文件等划分,但没有直接成本标识符的成本
  • 共同成本:如共享席位和公共基础设施等,难以直接放入某一倡议的成本
  • 未分类:既没有关联依据,也没有约定分摊标准的成本

以下数字均为展示计算方法的说明性输入示例,并非实际客户成本或业绩。若原始成本为 USD 184.20,并且专用工作区记录将其关联到支付改造,可将 PR 留空并记录为“倡议层级直接归属”。

如果按约定的变更文件比例,将该金额拆分为 PR #842 的 USD 110.52 和 #857 的 USD 73.68,这两行就是“估算分摊”。保留相同的原始成本行 ID,并检查两个分摊金额之和不超过 USD 184.20。如果没有依据,将 PR 列留空并保留为倡议层级成本会更准确。

不要立即将未关联路线图的成本判定为浪费。 安全补丁、故障响应、重构和探索性实验可能是必要的,却不在计划功能清单中。Navigara 也提出了区分路线图对齐工作与合理非路线图工作的概念。 未关联项不是应删除的对象,而是用于确认目的的待审查队列。

在成本的分母中加入发布和质量

如果只用 PR 数或提交数计算成本生产率,可能会把活动量增加误认为价值增加。Navigara 同样提出 PR 本身并不是价值单位的问题,但不应将产品给出的自有分数视为经过独立验证的标准指标。

DORA 说明,应选择符合测量目的的框架,并同时解读系统日志和自我报告数据能够显示的范围及其局限性。 因此,路线图成本表最好在金额旁并列放置结果、质量和归属可信度。

成本
直接成本·分摊成本·未分类金额
结果
是否发布·相对计划的时间点
质量
返工·故障·审查时间
可信度
直接·估算·共同成本·未分类

添加 GitHub Copilot 数据时也要记录范围。GitHub 提供组织、企业、仓库和用户层级的使用指标与 PR 活动,但席位信息需从单独的 API 获取。组织数据可能按成员身份而非实际工作位置归属,因此同一用户的活动可能出现在多个组织中,也不应直接比较不同的 Copilot API 资源。

相比“支付改造花费 2 万美元”,“倡议层级直接归属 1.4 万美元、共同成本分摊 4000 美元、按 PR 估算 2000 美元、比计划提前两周部署、返工 3 项”的报告更有用。这些数字同样只是说明性示例。关键不是先关闭最昂贵的模型,而是找出未分类率和返工同时较高的工作流程。

  1. 核对供应商使用成本。 确认所有页面、时间范围和分的换算,并与同一 UTC 时间段的 Console Usage/Cost 记录比较。
  2. 区分购买和使用。 将预付积分购买与使用成本放在不同的行中,并连接期初、期末余额与购买、调整、使用的流动。
  3. 为每一笔成本添加归属状态。 标记为直接归属、估算、共同成本或未分类之一,并保留关联依据。
  4. 检查分摊金额是否超额。 确认具有相同原始成本行 ID 的子行合计不超过原始金额。
  5. 同时查看发布和质量。 不要仅因成本变化与发布日期、返工或故障同步变化,就断定这是 AI 的因果影响。

没有必要强行将所有成本下钻到 PR 层级。只关联到能够验证的范围,其余部分如实保留为估算和未分类。这样,令人担忧的月度总额才能变成指出应改进哪些工作流程的成本数据。

如果想进一步深入

Usage and Cost API - Claude Platform Docs — 可确认支持的组织和认证方式、成本单位及排除范围。 platform.claude.com

Get Cost Report - Claude API Reference — 可确认请求参数和限制,以及 has_more 和 next_page 的响应结构。 platform.claude.com

How do I pay for my Claude API usage? — 说明预付 usage credits、自动充值与月度后付费合同之间的差异。 support.claude.com

DORA | Choosing measurement frameworks to fit your organizational goals — 可了解解读成本、交付和质量数据时应同时考虑哪些局限。 dora.dev