429,并阻止他们直到该周期重置或管理员提高上限。使用支出限制为每个开发者、团队或整个组织设置一个共享凭证的上限。
Claude 应用网关通过一个共享的上游凭证转发所有推理,因此你的提供商的账单将所有内容归属于该凭证,而不是单个开发者。没有按开发者的限制,一个失控的代理群可能会花费组织的整个承诺。支出限制是网关在该共享账单之上的按开发者视图和断路器。
设置上限
配置了admin: 块在 gateway.yaml 中后,网关在 /v1/organizations/spend_limits 处提供一个 admin API,并在每个推理请求上实时执行上限。上限本身通过该 API 设置,而不是在 gateway.yaml 中;每个 POST /v1/organizations/spend_limits 请求从 {scope, amount, period} 创建或替换一个上限。该 API 镜像了 Anthropic 的公共 Admin API 支出限制端点的线路形状,因此针对该契约编写的 HTTP 客户端可以通过更改其基础 URL 来针对网关。
此请求为每个开发者设置了一个组织范围的默认值,每月 $500:
contractors 组的每个成员上分层了一个更严格的每天 $100 的上限:
组或组织上限是每个成员继承的按座位默认值,而不是共享池。每个时期,开发者的有效上限按以下顺序解决:按用户覆盖,然后是其组上限中最严格的,然后是组织默认值,然后是无限制。
admin.group_limit_mode: max 将多组平局打破翻转为最不严格的。
向 admin API 进行身份验证
发送以下之一:- 一个
x-api-key标头,匹配admin.write_keys中的一个密钥以获得完全访问权限,或admin.read_keys以获得仅GET访问权限。每个密钥都有一个id,在审计日志中显示为admin-key:<id>,因此为 Terraform、CI 和每个自动化提供自己的密钥。 - 一个网关承载令牌,其
groups声明包括admin.admin_groups中的一个。这是完全访问权限,审计为oidc:<sub>,因此对人类管理员更好。
执行如何工作
在每个/v1/messages 请求上,网关在一个 Postgres 查询中解决开发者的上限和期间至今的支出。如果他们超过任何上限,请求返回 429,error.type: billing_error 和标头 x-should-retry: false。消息是 spend limit reached,后跟你的 admin.blocked_message(如果设置)。
/v1/messages/count_tokens 是豁免的。令牌计数是免费的,因此无论上限状态如何都会运行。
在每个响应之后,使用计量器从响应中读取令牌计数,当它流向客户端时,以 USD 列表价格对其进行定价,并为所有三个时期桶增加 Postgres 计数器。计量器是流上的单个读取器,因此客户端的字节不受影响,计量失败不会破坏响应。
支出限制从 USD 列表价格的令牌计数估计支出;它们是断路器,而不是发票。对于权威计费,请根据你的提供商自己的使用报告进行协调,例如 Anthropic 使用和成本 Admin API、Amazon Bedrock 上的调用日志或 Google Cloud 上的 Cloud Monitoring。
定价使用与 Claude Code CLI 用于自己的成本显示相同的表,具有跨 Anthropic、Amazon Bedrock (us.anthropic.…-v1:0)、Google Cloud 的 Agent Platform (claude-…@date) 和 Microsoft Foundry ID 形式的相同模型 ID 规范化。表无法放置的模型 ID(例如 Microsoft Foundry 部署名称或推理配置文件 ARN)以未知模型默认层 $5/$25 每百万输入/输出令牌的价格定价,而不是零,因此无法识别的 ID 无法通过不计量来绕过上限。网关在启动时和运行时每个 ID 一次警告模型何时通过回退定价。
客户端中止也被计费。上游仅在流的终端帧中报告输出令牌,因此中止的流不会携带它们。计量器从流式内容大小保持保守的下限估计,大约每令牌四个字符,并在终端使用帧缺失时计费。完整流始终计费上游报告的计数。没有这个,一个受限的开发者可以流式输出并在结束前立即中止每个请求,花费而不被计数。
Postgres 可用性
预检查使用两秒超时查询 Postgres。如果存储无法访问或超时,执行默认情况下失败打开:请求继续,网关记录警告。设置enforcement.fail_closed_on_error: true 改为失败关闭,它返回相同的 429 billing_error,消息为 spend limit unavailable。失败打开防止存储中断成为推理中断;失败关闭保证没有无计量支出。
Admin API 参考
下面的端点在/v1/organizations/spend_limits 下提供。
约定镜像 Anthropic 的 Admin API:
- 每个对象上的
type spl_前缀 ID- 金额为 USD 美分的整数字符串;
POST拒绝任何其他currency,返回400 {type: "error", error: {type, message}, request_id}错误信封- 每个管理员响应上的
request-id响应标头,成功或错误,匹配正文的request_id
admin_audit 写入前/后行,归属于 admin-key:<id> 或 oidc:<sub>。
网关仅提供支出限制端点。其他 Admin API 表面,例如 spend_limit_increase_requests 队列,不是网关 Admin API 的一部分。
/effective
GET /v1/organizations/spend_limits/effective 返回 Anthropic 的 SpendSummary 模式:每行是一个主体的一个时期,具有已解决的上限、期间至今的支出和一个 actor 对象。网关特定的差异:
user_id是 OIDCsub。actor.name和actor.email_address是null,直到主体通过网关的第一个推理请求。网关没有用户目录;它从每个用户自己的会话 JWT 记录最后看到的值。- 每行还携带一个
groups数组,主体的最后看到的 IdP 组。这是一个网关扩展,因此管理员 UI 可以显示应用的每个上限层;Anthropic 形状的客户端忽略它。 - 没有
user_ids[]过滤器,它列出有记录支出的主体,因为网关无法枚举所有组织成员。
group_limit_mode 平局打破,因此查看器显示实际应用的上限。
/audit
返回支出限制变更跟踪:谁更改了哪个上限、前/后快照和可选原因,最新优先。has_more 是精确的。此端点遵循本地 Admin API 约定,而不是第一方线路形状。
分页
原始列表按after_id 和 before_id 分页,它们是互斥的 spl_… ID;结果按创建排序,has_more 反映遍历方向。/effective 按传回的不透明 next_page 令牌分页为 ?page=,主体按升序排序,因此在记录支出时页面保持稳定。limit 在两者上都是 1–1000,默认 20。
数据生命周期
网关保持四个支出相关的表;每小时扫描执行保留窗口:identity_retention_days 故意比 spend_retention_months 短:一个已取消配置的身份停止刷新并老化,而其匿名支出计数器保持用于年度报告。
当开发者离开时,通过 DELETE /v1/organizations/spend_limits/{id} 删除任何按用户上限;他们的支出和身份行按上面的保留窗口老化。要立即擦除一个人,用于离职或数据主体访问请求 (DSAR),直接针对网关数据库运行 DELETE FROM principal_emails WHERE principal = '<sub>'。这删除了唯一保存其电子邮件、名称和组的表。spend 和 admin_audit 行仅引用伪匿名 OIDC sub,并按其自己的窗口老化。
相关
admin和enforcement配置:启用 admin API 和调整保留- 部署指南:Postgres 模式和备份指导