fix: pre-hook 幂等防重,litellm 双调用不重复预扣
litellm 对同一请求调用两次 async_pre_call_hook(proxy 级 + deployment 级),第二次重复预扣 inflight 但结算只释放一次, 残留累积。已在日志确认(18:46:07 每个请求 Pre-reserve 打印两次)。 修复:pre-hook 入口检查 data["metadata"] 是否已有 PREBLOCK_RESERVE_META_KEY,有则跳过预扣直接放行(幂等)。 验证:新增场景7(幂等防重),7 场景 ALL PASS。
This commit is contained in:
@@ -1189,6 +1189,16 @@ class DailyLimitHandler(CustomLogger):
|
|||||||
level="DEBUG",
|
level="DEBUG",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 幂等防重:litellm 对同一请求可能调用两次 async_pre_call_hook
|
||||||
|
# (proxy 级 + deployment 级),第二次预扣会重复占 inflight 且
|
||||||
|
# 结算只释放一次 → 残留累积。已有 reserve 标记时跳过预扣直接放行。
|
||||||
|
try:
|
||||||
|
_existing_meta = data.get("metadata") or {}
|
||||||
|
if isinstance(_existing_meta, dict) and PREBLOCK_RESERVE_META_KEY in _existing_meta:
|
||||||
|
return data
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
blocked = _check_request_block(data["model"], reserve=reserve)
|
blocked = _check_request_block(data["model"], reserve=reserve)
|
||||||
if not blocked:
|
if not blocked:
|
||||||
# 放行:Lua 原子闸门已把 reserve 预扣进 inflight 账户。
|
# 放行:Lua 原子闸门已把 reserve 预扣进 inflight 账户。
|
||||||
|
|||||||
Reference in New Issue
Block a user