diff --git a/api/.env.example b/api/.env.example index fbf0b12f40..50607f5b35 100644 --- a/api/.env.example +++ b/api/.env.example @@ -540,6 +540,7 @@ WORKFLOW_LOG_CLEANUP_BATCH_SIZE=100 # App configuration APP_MAX_EXECUTION_TIME=1200 +APP_DEFAULT_ACTIVE_REQUESTS=0 APP_MAX_ACTIVE_REQUESTS=0 # Celery beat configuration diff --git a/api/configs/feature/__init__.py b/api/configs/feature/__init__.py index 7cce3847b4..9c0c48c955 100644 --- a/api/configs/feature/__init__.py +++ b/api/configs/feature/__init__.py @@ -73,6 +73,10 @@ class AppExecutionConfig(BaseSettings): description="Maximum allowed execution time for the application in seconds", default=1200, ) + APP_DEFAULT_ACTIVE_REQUESTS: NonNegativeInt = Field( + description="Default number of concurrent active requests per app (0 for unlimited)", + default=0, + ) APP_MAX_ACTIVE_REQUESTS: NonNegativeInt = Field( description="Maximum number of concurrent active requests per app (0 for unlimited)", default=0, diff --git a/api/services/app_generate_service.py b/api/services/app_generate_service.py index bb1ea742d0..dc85929b98 100644 --- a/api/services/app_generate_service.py +++ b/api/services/app_generate_service.py @@ -135,7 +135,7 @@ class AppGenerateService: Returns: The maximum number of active requests allowed """ - app_limit = app.max_active_requests or 0 + app_limit = app.max_active_requests or dify_config.APP_DEFAULT_ACTIVE_REQUESTS config_limit = dify_config.APP_MAX_ACTIVE_REQUESTS # Filter out infinite (0) values and return the minimum, or 0 if both are infinite diff --git a/api/services/rag_pipeline/pipeline_generate_service.py b/api/services/rag_pipeline/pipeline_generate_service.py index e6cee64df6..f397b28283 100644 --- a/api/services/rag_pipeline/pipeline_generate_service.py +++ b/api/services/rag_pipeline/pipeline_generate_service.py @@ -53,10 +53,11 @@ class PipelineGenerateService: @staticmethod def _get_max_active_requests(app_model: App) -> int: - max_active_requests = app_model.max_active_requests - if max_active_requests is None: - max_active_requests = int(dify_config.APP_MAX_ACTIVE_REQUESTS) - return max_active_requests + app_limit = app_model.max_active_requests or dify_config.APP_DEFAULT_ACTIVE_REQUESTS + config_limit = dify_config.APP_MAX_ACTIVE_REQUESTS + # Filter out infinite (0) values and return the minimum, or 0 if both are infinite + limits = [limit for limit in [app_limit, config_limit] if limit > 0] + return min(limits) if limits else 0 @classmethod def generate_single_iteration( diff --git a/api/tests/integration_tests/.env.example b/api/tests/integration_tests/.env.example index 46d13079db..e508ceef66 100644 --- a/api/tests/integration_tests/.env.example +++ b/api/tests/integration_tests/.env.example @@ -175,6 +175,7 @@ MAX_VARIABLE_SIZE=204800 # App configuration APP_MAX_EXECUTION_TIME=1200 +APP_DEFAULT_ACTIVE_REQUESTS=0 APP_MAX_ACTIVE_REQUESTS=0 # Celery beat configuration diff --git a/api/tests/test_containers_integration_tests/services/test_app_generate_service.py b/api/tests/test_containers_integration_tests/services/test_app_generate_service.py index 0f9ed94017..476f58585d 100644 --- a/api/tests/test_containers_integration_tests/services/test_app_generate_service.py +++ b/api/tests/test_containers_integration_tests/services/test_app_generate_service.py @@ -82,6 +82,7 @@ class TestAppGenerateService: # Setup dify_config mock returns mock_dify_config.BILLING_ENABLED = False mock_dify_config.APP_MAX_ACTIVE_REQUESTS = 100 + mock_dify_config.APP_DEFAULT_ACTIVE_REQUESTS = 100 mock_dify_config.APP_DAILY_RATE_LIMIT = 1000 mock_global_dify_config.BILLING_ENABLED = False diff --git a/docker/.env.example b/docker/.env.example index 0bfdc6b495..c9981baaba 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -133,6 +133,8 @@ ACCESS_TOKEN_EXPIRE_MINUTES=60 # Refresh token expiration time in days REFRESH_TOKEN_EXPIRE_DAYS=30 +# The default number of active requests for the application, where 0 means unlimited, should be a non-negative integer. +APP_DEFAULT_ACTIVE_REQUESTS=0 # The maximum number of active requests for the application, where 0 means unlimited, should be a non-negative integer. APP_MAX_ACTIVE_REQUESTS=0 APP_MAX_EXECUTION_TIME=1200 diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 0302612045..17f33bbf72 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -34,6 +34,7 @@ x-shared-env: &shared-api-worker-env FILES_ACCESS_TIMEOUT: ${FILES_ACCESS_TIMEOUT:-300} ACCESS_TOKEN_EXPIRE_MINUTES: ${ACCESS_TOKEN_EXPIRE_MINUTES:-60} REFRESH_TOKEN_EXPIRE_DAYS: ${REFRESH_TOKEN_EXPIRE_DAYS:-30} + APP_DEFAULT_ACTIVE_REQUESTS: ${APP_DEFAULT_ACTIVE_REQUESTS:-0} APP_MAX_ACTIVE_REQUESTS: ${APP_MAX_ACTIVE_REQUESTS:-0} APP_MAX_EXECUTION_TIME: ${APP_MAX_EXECUTION_TIME:-1200} DIFY_BIND_ADDRESS: ${DIFY_BIND_ADDRESS:-0.0.0.0}