fix: 限额改 v4 冻结快照,余额红线防扣费

v2 的 stable_limit = usage + balance - BUFFER 依赖余额 API 随消耗实时递减,
实测滞后(08-12 快照 1,558,307 在 usage 涨 45 万期间不动)导致池膨胀、限额
虚高,放行到扣费区(当日超余额 13.8 万已扣费)。
扣费口径(用户确认):是否扣费只取决于当下免费额度,超出即扣费,采集量只
决定明日发放。v4:stable_limit = balance - BUFFER 冻结快照,本地 usage 实时
撞线即拦,等价于本地实时扣减余额;effective = min(2M 配额, stable_limit)。
新增 docs/volc-quota-notes.md 额度机制速查;merge-auto-consume.md 补 §4.5。
This commit is contained in:
vibe-code
2026-08-12 06:58:03 +00:00
parent c6c122426a
commit dd349b64cf
9 changed files with 249 additions and 12 deletions
+12 -10
View File
@@ -1473,17 +1473,19 @@ def active_monitor_loop():
dynamic_key = f"limit:dynamic:volcengine:remaining:{target}"
# ==========================================
# 📏 v2 简化限额:stable_limit = usage + balance − BUFFER
# 📏 v4 冻结快照:stable_limit = max(0, balance − BUFFER)
# ==========================================
# 旧 Peak-Buffer(峰值首锁/门控重锁/DROP,~90 行状态机)为存量
# 资源包场景设计;日返还模型下 balance 每天真实跳涨,锁峰值会把
# 真实发放当异常压住,且比例 margin 在 usage 逼近 balance 时
# 数学失效(允许再烧量 > 剩余余额 → 烧穿扣费)。
# usage + balance = 当日初始可用池,消耗中恒定;返还/过期自然增减。
# BUFFER 覆盖余额统计滞后(实测 20 万内不动)。见 merge-auto-consume.md §4。
# v2 的 usage + balance − BUFFER 假设「消耗中池恒定」(usage ↑ /
# balance ↓ 同步),但余额 API 实测滞后(2026-08-12 观察:快照
# 1,558,307 在 usage 1.24M→1.70M 期间不动,滞后上限未知),
# balance 不随消耗实时递减 → 池随 usage 膨胀、限额虚高,
# 「余额耗尽 → 限额 0」防线失效 → 放行到扣费区(当日超余额 13.8 万)。
# v4:以最近同步快照的余额为「当日免费池上限」,本地 usage 实时
# 累计撞线即拦(等价于本地实时扣减余额),不随 usage 膨胀;
# 扣费判定 = 消耗 > 当下免费额度即扣费(与采集量/返还无关)。
# BUFFER 覆盖快照滞后窗口内的消耗。见 docs/volc-quota-notes.md §7.3。
total_pool = current_usage + balance
stable_limit = int(max(0, total_pool - BUFFER))
stable_limit = int(max(0, balance - BUFFER))
stable_limit_key = (
f"limit:dynamic:volcengine:stable_limit:{target}"
@@ -1500,7 +1502,7 @@ def active_monitor_loop():
static_limit, stable_limit
)
print(
f"DEBUG: {target} Pool={int(total_pool):,} | Usage={int(current_usage):,} | {format_limit_debug_fields(static_limit=static_limit, stable_limit=stable_limit, effective_limit=effective_limit)}",
f"DEBUG: {target} Bal={int(balance):,} | Usage={int(current_usage):,} | {format_limit_debug_fields(static_limit=static_limit, stable_limit=stable_limit, effective_limit=effective_limit)}",
flush=True,
)