配方:预算与 FinOps guardrail
FinOps 预算和支出分析属于 Business 功能。Community 保留每个会话的成本跟踪和数据导出。0.1 之前保存的预算仍可读取和删除,并在 FinOps 模块启用时继续执行;Community 无法创建或修改预算。评估和沙箱仍属于 Community。
目标: “这个团队的 agent 在每月 $500 处停止花钱” —— 声明一次、实时强制执行,并在 逼近过程中带有告警阈值。
预算强制执行是在默认二进制中即可生效的几种执行(actuation)之一:一个处于上限的强制
预算会拒绝该支出,无需任何额外预配(modules 目录将其
标记为 v1 | v1)。
创建一个预算
Section titled “创建一个预算”curl -ks -X POST "$BASE/v1/m/finops/budgets" \ -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" \ -H 'Content-Type: application/json' \ -d '{ "dimension": "team", "key": "payments", "limit_micro_usd": 500000000, "period": "monthly", "thresholds": [0.5, 0.8, 1.0], "action": "block" }'- 金额以 micro-USD 为单位(
limit_micro_usd: 500000000= $500),因此契约中不存在 浮点歧义。 dimension+key界定预算的范围。可界定范围的 dimension 包括global、model、provider、agent、session、team、project、workspace、api_key、actor、service_tier、context_window、inference_geo、gateway以及identity。action是强制执行模式:
action |
到达上限时 |
|---|---|
alert(默认) |
仅 showback —— 触发告警,不拒绝任何东西 |
throttle |
执行 seam 放慢新增支出 |
block |
执行 seam 拒绝新增支出 |
为单个身份设定预算
Section titled “为单个身份设定预算”dimension: "identity" 以一个 firm 名册身份的 external id 为范围 —— 即你的
身份来源所注册的工作负载或 agent 身份:
{ "dimension": "identity", "key": "spiffe://corp/agent/billing-reconciler", "limit_micro_usd": 50000000, "period": "monthly", "action": "throttle" }该身份在成本摄取(cost-ingest)时从样本的 agent 绑定、API key 或 actor 解析得出 —— 因此预算会跨表面跟随该身份,而非跟随某一个 API key。
看它如何运作
Section titled “看它如何运作”# Live consumption vs limit, with run-rate projection:curl -ks "$BASE/v1/m/finops/budgets/$BUDGET_ID/status" \ -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT"
# Threshold crossings (your 50% / 80% / 100% alerts):curl -ks "$BASE/v1/m/finops/alerts" \ -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT"到达上限时,一个强制预算的检查会返回 allowed: false,连同其动作(throttle 或
block)以及触发的预算 —— 该拒绝会道出它的理由。告警也会搭乘通知流,因此一个 Slack 或
PagerDuty 目的地会在 100% 拒绝之前就听到 80%
的越线。
在控制台中,Budgets 展示各限额的消耗情况,并附按当前速率的预测。
给支出一个分母:outcome
Section titled “给支出一个分母:outcome”cost-per-outcome 才是让预算成为一场业务对话的关键。上报 outcome(一张已解决的工单、一个 已合并的 PR、一个已关闭的案件),然后读取价值面板:
curl -ks -X POST "$BASE/v1/m/finops/outcomes" \ -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" \ -d '{"kind":"ticket.resolved","subject_ref":"agent:support-triage","count":1}'
curl -ks "$BASE/v1/m/finops/value" \ -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT"价值摘要包含 cancellation risk —— 没有任何 outcome 的烧钱 —— 它是成功度量的诚实 反面。
- 无法读取账本时拒绝: 如果预算准入无法建立(FinOps 无法读取其账本),推理代理会以
503、原因
budget store unreachable (deny-closed)和x-should-retry: false拒绝该调用, 而不是放行未计量的消费。在引擎自身的门控中,只有会话启动在这种情况下保留可配置的 姿态(OLIVARES_SESSION_BUDGET_AVAILABILITY)。 - 预留容量(
reserved_micro_usd)计入上限,因此预算无法通过预先占用来规避。 cost_type被刻意排除在预算 dimension 之外 —— 估算回退(estimated-fallback)的 条目会搭乘它们所属的那个 dimension,而不是另立一个平行池。