diff --git a/api/.env.example b/api/.env.example index 2cc6410cdd..aa7383ef38 100644 --- a/api/.env.example +++ b/api/.env.example @@ -424,6 +424,7 @@ WORKFLOW_MAX_EXECUTION_TIME=1200 WORKFLOW_CALL_MAX_DEPTH=5 WORKFLOW_PARALLEL_DEPTH_LIMIT=3 MAX_VARIABLE_SIZE=204800 +WORKFLOW_FAST_MODE=false # Workflow storage configuration # Options: rdbms, hybrid diff --git a/api/configs/feature/__init__.py b/api/configs/feature/__init__.py index 4890b5f746..da73060ead 100644 --- a/api/configs/feature/__init__.py +++ b/api/configs/feature/__init__.py @@ -513,6 +513,11 @@ class WorkflowConfig(BaseSettings): default=200 * 1024, ) + WORKFLOW_FAST_MODE: bool = Field( + description="Enable fast mode for workflow execution with reduced database operations", + default=False, + ) + class WorkflowNodeExecutionConfig(BaseSettings): """ diff --git a/api/core/app/apps/workflow/app_generator.py b/api/core/app/apps/workflow/app_generator.py index 1d67671974..756959d3c9 100644 --- a/api/core/app/apps/workflow/app_generator.py +++ b/api/core/app/apps/workflow/app_generator.py @@ -18,6 +18,8 @@ from core.app.apps.workflow.app_config_manager import WorkflowAppConfigManager from core.app.apps.workflow.app_queue_manager import WorkflowAppQueueManager from core.app.apps.workflow.app_runner import WorkflowAppRunner from core.app.apps.workflow.generate_response_converter import WorkflowAppGenerateResponseConverter +from core.app.apps.workflow.generate_task_pipeline import WorkflowAppGenerateTaskPipeline +from core.app.apps.workflow.generate_task_pipeline_fast import WorkflowAppGenerateTaskPipelineFast from core.app.entities.app_invoke_entities import InvokeFrom, WorkflowAppGenerateEntity from core.app.entities.task_entities import WorkflowAppBlockingResponse, WorkflowAppStreamResponse from core.model_runtime.errors.invoke import InvokeAuthorizationError @@ -408,14 +410,24 @@ class WorkflowAppGenerator(BaseAppGenerator): :return: """ # init generate task pipeline - generate_task_pipeline = WorkflowAppGenerateTaskPipeline( - application_generate_entity=application_generate_entity, - workflow=workflow, - queue_manager=queue_manager, - user=user, - stream=stream, - workflow_node_execution_repository=workflow_node_execution_repository, - ) + if dify_config.WORKFLOW_FAST_MODE: + # Use the fast mode task pipeline with reduced database operations + generate_task_pipeline = WorkflowAppGenerateTaskPipelineFast( + application_generate_entity=application_generate_entity, + workflow=workflow, + queue_manager=queue_manager, + user=user, + stream=stream, + ) + else: + # Use the standard task pipeline + generate_task_pipeline = WorkflowAppGenerateTaskPipeline( + application_generate_entity=application_generate_entity, + workflow=workflow, + queue_manager=queue_manager, + user=user, + stream=stream, + ) try: return generate_task_pipeline.process() diff --git a/docker/.env.example b/docker/.env.example index f1ea72d8cc..7c4532b0c5 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -769,6 +769,7 @@ WORKFLOW_CALL_MAX_DEPTH=5 MAX_VARIABLE_SIZE=204800 WORKFLOW_PARALLEL_DEPTH_LIMIT=3 WORKFLOW_FILE_UPLOAD_LIMIT=10 +WORKFLOW_FAST_MODE=false # Workflow storage configuration # Options: rdbms, hybrid diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index aee36b3986..57eb63b531 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -342,6 +342,7 @@ x-shared-env: &shared-api-worker-env MAX_VARIABLE_SIZE: ${MAX_VARIABLE_SIZE:-204800} WORKFLOW_PARALLEL_DEPTH_LIMIT: ${WORKFLOW_PARALLEL_DEPTH_LIMIT:-3} WORKFLOW_FILE_UPLOAD_LIMIT: ${WORKFLOW_FILE_UPLOAD_LIMIT:-10} + WORKFLOW_FAST_MODE: ${WORKFLOW_FAST_MODE:-false} WORKFLOW_NODE_EXECUTION_STORAGE: ${WORKFLOW_NODE_EXECUTION_STORAGE:-rdbms} HTTP_REQUEST_NODE_MAX_BINARY_SIZE: ${HTTP_REQUEST_NODE_MAX_BINARY_SIZE:-10485760} HTTP_REQUEST_NODE_MAX_TEXT_SIZE: ${HTTP_REQUEST_NODE_MAX_TEXT_SIZE:-1048576}