跳转到内容

配方:预算与 FinOps guardrail

FinOps 预算和支出分析属于 Business 功能。Community 保留每个会话的成本跟踪和数据导出。0.1 之前保存的预算仍可读取和删除,并在 FinOps 模块启用时继续执行;Community 无法创建或修改预算。评估和沙箱仍属于 Community。

目标: “这个团队的 agent 在每月 $500 处停止花钱” —— 声明一次、实时强制执行,并在 逼近过程中带有告警阈值。

预算强制执行是在默认二进制中即可生效的几种执行(actuation)之一:一个处于上限的强制 预算会拒绝该支出,无需任何额外预配(modules 目录将其 标记为 v1 | v1)。

终端窗口
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 拒绝新增支出

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。

终端窗口
# 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 展示各限额的消耗情况,并附按当前速率的预测。

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,而不是另立一个平行池。