feat: add daily rate limit for app requests in AppExecutionConfig

This commit is contained in:
Yeuoly 2025-03-19 15:23:37 +08:00
parent 41dff175b3
commit af4c47bfab
2 changed files with 20 additions and 0 deletions

View File

@ -61,6 +61,10 @@ class AppExecutionConfig(BaseSettings):
description="Maximum number of concurrent active requests per app (0 for unlimited)", description="Maximum number of concurrent active requests per app (0 for unlimited)",
default=0, default=0,
) )
APP_DAILY_RATE_LIMIT: NonNegativeInt = Field(
description="Maximum number of requests per app per day",
default=5000,
)
class CodeExecutionSandboxConfig(BaseSettings): class CodeExecutionSandboxConfig(BaseSettings):

View File

@ -11,6 +11,7 @@ from core.app.apps.completion.app_generator import CompletionAppGenerator
from core.app.apps.workflow.app_generator import WorkflowAppGenerator from core.app.apps.workflow.app_generator import WorkflowAppGenerator
from core.app.entities.app_invoke_entities import InvokeFrom from core.app.entities.app_invoke_entities import InvokeFrom
from core.app.features.rate_limiting import RateLimit from core.app.features.rate_limiting import RateLimit
from libs.helper import RateLimiter
from models.model import Account, App, AppMode, EndUser from models.model import Account, App, AppMode, EndUser
from models.workflow import Workflow from models.workflow import Workflow
from services.errors.llm import InvokeRateLimitError from services.errors.llm import InvokeRateLimitError
@ -18,6 +19,8 @@ from services.workflow_service import WorkflowService
class AppGenerateService: class AppGenerateService:
system_rate_limiter = RateLimiter("app_daily_rate_limiter", dify_config.APP_DAILY_RATE_LIMIT, 86400)
@classmethod @classmethod
def generate( def generate(
cls, cls,
@ -36,6 +39,19 @@ class AppGenerateService:
:param streaming: streaming :param streaming: streaming
:return: :return:
""" """
# system level rate limiter
if not dify_config.BILLING_ENABLED:
# check if it's free plan
limit_info = {"subscription": {"plan": "sandbox"}}
# limit_info = BillingService.get_info(app_model.tenant_id)
if limit_info["subscription"]["plan"] == "sandbox":
if cls.system_rate_limiter.is_rate_limited(app_model.tenant_id):
raise InvokeRateLimitError(
f"Rate limit exceeded, please upgrade your plan, or your RPD was {dify_config.APP_DAILY_RATE_LIMIT} requests/day"
)
cls.system_rate_limiter.increment_rate_limit(app_model.tenant_id)
# app level rate limiter
max_active_request = AppGenerateService._get_max_active_requests(app_model) max_active_request = AppGenerateService._get_max_active_requests(app_model)
rate_limit = RateLimit(app_model.id, max_active_request) rate_limit = RateLimit(app_model.id, max_active_request)
request_id = RateLimit.gen_request_key() request_id = RateLimit.gen_request_key()