通过 Neon 的分支即部署特性,将 AI 费用按分支独立记账,解决了同一 gateway 密钥无法区分环境成本的难题,支持提前告警和上限控制。
AI 成本很难看清。在大多数架构中,生产环境、每个预览环境、CI 以及有人在周五跑的压测都使用同一个网关凭证。所有这些都汇入一个无法区分的总数。你无法回答"那个预览环境花了多少钱",无法对特定环境设置上限,等到月度账单来了才知道某个 CI 任务在一个昂贵的模型上陷入了重试循环,而不是在发生时就知道。
原因在于,成本是归因到密钥的,而密钥是共享的。Neon 改变了共享的东西:每个分支都是独立的部署,如果你把使用日志记录到 Postgres,那这个账本也存在于分支上。因此预览或 CI 分支会在自己的账本上记录自己的开销,不会影响生产环境的数字。我通过在 CI 分支上运行调用并观察生产账本保持不变来测试了这一点。仓库链接在最后。
一个共享的网关密钥意味着一个无法区分的账单:无法按环境归因、无法按环境设置上限、无法在预览或 CI 任务花费过多时获得提前预警。
在 Neon 上,每个分支都是独立的部署(独立的函数端点),而你在 Postgres 中记录的使用日志也存在于分支上。分支上的调用会记录到分支的账本上。
我测试了一下:在 ci-run 分支上两次模型调用使该分支的 token 数从 25 增加到 71,而生产环境的账本保持在 25 不动。
写时复制意味着分支在创建时会继承生产环境的账本快照;隔离体现在之后发生的事情上,分支上的新开销永远不会触及生产环境。
启用了 AI 网关的 Neon 项目(us-east-2)
Postgres 中的使用量表(演示程序记录每次调用)和各环境的分支
共享密钥的问题
当生产环境和每个临时环境使用相同凭证进行身份验证时,提供商的仪表板只显示一行。这有实际后果:
无法归因。你无法说出上个月的 token 中有多少来自预览、CI 或真实用户。
无法隔离。运行批量任务的预览环境,或者循环执行的 CI 测试,都会消耗生产环境共享的同一个预算,并可能耗尽所有人共享的速率限制。
无法提前获知。非生产环境烧钱的第一次预警就是账单。
给请求打标签有一点帮助,但那是事后追加的记账,而且仍然共享一个预算和一个速率限制。
Neon 模型:开销跟随分支

在 Neon 上每个分支都是独立的部署,有自己的函数 URL,因为你把使用日志记录到 Postgres 而 Postgres 也会分支,使用量账本也是按分支的。针对分支函数 URL 发起的调用会写入该分支的 usage_log,而那个账本使得成本可以按环境归因:生产环境的账本是另一个分支上的另一张表。这里展示的隔离是 Postgres 中那个按分支的账本,而不是说 Neon 本身按分支对网关凭证进行单独计量。这个区别很重要:你可以依赖的归因是你自己在分支数据库中记录的那个。
使用量视图是对该分支日志的普通查询:
// GET /usage: tokens grouped by model, from THIS branch's log
const rows = await db
.select({
model: usageLog.model,
calls: sql`count(*)::int`,
totalTokens: sql`sum(${usageLog.totalTokens})::int`,
})
.from(usageLog)
.groupBy(usageLog.model);
验证:CI 分支花了钱,生产环境没有动静
我读取了生产环境的使用量,创建了一个 ci-run 环境分支,针对该分支进行了两次模型调用,然后读取了两个账本。

该分支的 gpt-5-nano 总数随着两次调用从 25 增加到 71,而生产环境保持在 25。CI 运行的开销记录在 CI 分支上,没有记录到任何其他地方,删除该分支时它的账本也会一起被删除。
因为存储是写时复制的,新分支会继承分支时刻生产环境的账本(这就是为什么该分支从 25 开始而不是从 0)。隔离体现在增量上:分支创建后在该分支上花费的所有内容都留在该分支上,分支的任何操作都不会改变生产环境的数字。要获得干净的单次运行归因,可以读取该分支的增长量,或者让 CI 分支短命,这样它的账本就只是那一次运行。
归因。每个环境的开销都是对自己账本的查询,所以"这个预览环境花了多少钱"有答案。
隔离。失控的 CI 任务或预览压测只会消耗自己分支的预算,不会影响生产环境的预算或速率限制。
清理。删除分支时其开销记录一并消失;没有单独需要清理的会计资源。
治理。因为每个环境都记录到自己分支的账本上,你可以独立于生产环境来推理和约束非生产环境的用量。
带有按分支使用日志的网关函数在这里:
https://github.com/The-DevOps-Daily/neon-ai-gateway-demo
模型开销之所以看不见,只是因为它归因到一个共享密钥。把使用量账本移到分支上,情况就反转了:每个环境保留自己的记录,预览或 CI 运行消耗的是自己的额度,生产环境的数字不受分支任何操作的影响。你免费获得了按环境归因和隔离,清理就是删除那个本来就要拆除整个预览环境的分支。