From b4b9974064c34b8234d4fa2bd2ea3686b7006e86 Mon Sep 17 00:00:00 2001 From: wwq Date: Mon, 20 Apr 2026 18:45:17 +0800 Subject: [PATCH] refactor(api_key): change rate limit handling to auto-cap at tenant limit - Replace exception throwing with automatic capping when rate limit exceeds tenant plan limit, improving user experience. --- api/app/services/api_key_service.py | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/api/app/services/api_key_service.py b/api/app/services/api_key_service.py index 53aad5ce..5143ac3e 100644 --- a/api/app/services/api_key_service.py +++ b/api/app/services/api_key_service.py @@ -19,7 +19,6 @@ from app.core.exceptions import ( ) from app.core.error_codes import BizCode from app.core.logging_config import get_business_logger -from app.i18n.exceptions import I18nException logger = get_business_logger() @@ -52,7 +51,7 @@ class ApiKeyService: if existing: raise BusinessException(f"API Key 名称 {data.name} 已存在", BizCode.API_KEY_DUPLICATE_NAME) - # 校验 rate_limit 不能超过租户套餐的 api_ops_rate_limit + # 若 rate_limit 超过租户套餐的 api_ops_rate_limit,自动截断到套餐上限 from app.models.workspace_model import Workspace from app.core.quota_manager import get_api_ops_rate_limit @@ -60,13 +59,7 @@ class ApiKeyService: if workspace: tenant_api_ops_limit = get_api_ops_rate_limit(db, workspace.tenant_id) if tenant_api_ops_limit and data.rate_limit > tenant_api_ops_limit: - raise I18nException( - error_key="errors.api.api_key_rate_limit_exceeded", - status_code=400, - error_code="API_KEY_RATE_LIMIT_EXCEEDED", - rate_limit=data.rate_limit, - limit=tenant_api_ops_limit, - ) + data.rate_limit = tenant_api_ops_limit # 生成 API Key api_key = generate_api_key(data.type) @@ -169,7 +162,7 @@ class ApiKeyService: if existing: raise BusinessException(f"API Key 名称 {data.name} 已存在", BizCode.API_KEY_DUPLICATE_NAME) - # 校验 rate_limit 不能超过租户套餐的 api_ops_rate_limit + # 若 rate_limit 超过租户套餐的 api_ops_rate_limit,自动截断到套餐上限 if data.rate_limit is not None: from app.models.workspace_model import Workspace from app.core.quota_manager import get_api_ops_rate_limit @@ -178,13 +171,7 @@ class ApiKeyService: if workspace: tenant_api_ops_limit = get_api_ops_rate_limit(db, workspace.tenant_id) if tenant_api_ops_limit and data.rate_limit > tenant_api_ops_limit: - raise I18nException( - error_key="errors.api.api_key_rate_limit_exceeded", - status_code=400, - error_code="API_KEY_RATE_LIMIT_EXCEEDED", - rate_limit=data.rate_limit, - limit=tenant_api_ops_limit, - ) + data.rate_limit = tenant_api_ops_limit update_data = data.model_dump(exclude_unset=True) ApiKeyRepository.update(db, api_key_id, update_data)