diff --git a/api/configs/feature/__init__.py b/api/configs/feature/__init__.py index a13a5997a7..46ded0244f 100644 --- a/api/configs/feature/__init__.py +++ b/api/configs/feature/__init__.py @@ -61,6 +61,10 @@ class AppExecutionConfig(BaseSettings): description="Maximum number of concurrent active requests per app (0 for unlimited)", default=0, ) + APP_DAILY_RATE_LIMIT: NonNegativeInt = Field( + description="Maximum number of requests per app per day", + default=5000, + ) class CodeExecutionSandboxConfig(BaseSettings): diff --git a/api/services/app_generate_service.py b/api/services/app_generate_service.py index cbea47f0b4..47fb75b49f 100644 --- a/api/services/app_generate_service.py +++ b/api/services/app_generate_service.py @@ -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.entities.app_invoke_entities import InvokeFrom from core.app.features.rate_limiting import RateLimit +from libs.helper import RateLimiter from models.model import Account, App, AppMode, EndUser from models.workflow import Workflow from services.errors.llm import InvokeRateLimitError @@ -18,6 +19,8 @@ from services.workflow_service import WorkflowService class AppGenerateService: + system_rate_limiter = RateLimiter("app_daily_rate_limiter", dify_config.APP_DAILY_RATE_LIMIT, 86400) + @classmethod def generate( cls, @@ -36,6 +39,19 @@ class AppGenerateService: :param streaming: streaming :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) rate_limit = RateLimit(app_model.id, max_active_request) request_id = RateLimit.gen_request_key()