fix(rate_limit): differentiate between tenant plan and API Key QPS limit errors

- Add logic to detect tenant plan QPS limits and return a specific error message when triggered.
- Simplify boolean check in model activation quota validation.
This commit is contained in:
wwq
2026-04-20 18:25:39 +08:00
parent 3227c25b07
commit d59990d326
3 changed files with 10 additions and 3 deletions

View File

@@ -108,6 +108,8 @@ def require_api_key(
# 根据错误消息判断限流类型
if "Daily" in error_msg:
code = BizCode.API_KEY_DAILY_LIMIT_EXCEEDED
elif "Tenant" in error_msg:
code = BizCode.API_KEY_QPS_LIMIT_EXCEEDED # 租户套餐速率超限,同属 QPS 类
elif "QPS" in error_msg:
code = BizCode.API_KEY_QPS_LIMIT_EXCEEDED
else:

View File

@@ -488,7 +488,7 @@ def check_model_activation_quota(func: Callable) -> Callable:
logger.warning("模型激活配额检查失败:缺少 model_id 或 model_data 参数")
return await func(*args, **kwargs)
if model_data.is_active is True:
if model_data.is_active:
try:
from app.services.model_service import ModelConfigService
@@ -522,7 +522,7 @@ def check_model_activation_quota(func: Callable) -> Callable:
logger.warning("模型激活配额检查失败:缺少 model_id 或 model_data 参数")
return func(*args, **kwargs)
if model_data.is_active is True:
if model_data.is_active:
try:
from app.services.model_service import ModelConfigService

View File

@@ -386,7 +386,12 @@ class RateLimiterService:
# 用最终有效限额做 QPS 检查
qps_ok, qps_info = await self.check_qps(api_key.id, effective_limit)
if not qps_ok:
return False, "QPS limit exceeded", {
# 判断是套餐限额触发还是 api_key 自身限额触发
if tenant_limit and effective_limit == tenant_limit and api_key.rate_limit > tenant_limit:
error_msg = "Tenant QPS limit exceeded"
else:
error_msg = "QPS limit exceeded"
return False, error_msg, {
"X-RateLimit-Limit-QPS": str(qps_info["limit"]),
"X-RateLimit-Remaining-QPS": str(qps_info["remaining"]),
"X-RateLimit-Reset": str(qps_info["reset"])