From cbc3474bbb795dec06ac05b28fc33c4a6ea4a192 Mon Sep 17 00:00:00 2001 From: NeatGuyCoding <15627489+NeatGuyCoding@users.noreply.github.com> Date: Mon, 21 Jul 2025 11:20:05 +0800 Subject: [PATCH 1/4] minor fix: fix dissolve tenant check permission always failed (#22292) --- api/services/account_service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/services/account_service.py b/api/services/account_service.py index feabd43656..c13ae7a4f0 100644 --- a/api/services/account_service.py +++ b/api/services/account_service.py @@ -1070,8 +1070,8 @@ class TenantService: @staticmethod def dissolve_tenant(tenant: Tenant, operator: Account) -> None: """Dissolve tenant""" - if not TenantService.check_member_permission(tenant, operator, operator, "remove"): - raise NoPermissionError("No permission to dissolve tenant.") + TenantService.check_member_permission(tenant, operator, None, "remove") + db.session.query(TenantAccountJoin).filter_by(tenant_id=tenant.id).delete() db.session.delete(tenant) db.session.commit() From d45e48eed7c5ecd2dfcd9c0a756d726a9111bb18 Mon Sep 17 00:00:00 2001 From: quicksand Date: Mon, 21 Jul 2025 11:22:32 +0800 Subject: [PATCH 2/4] fix: knowledge retrieval validation error (#22682) --- api/core/workflow/nodes/knowledge_retrieval/entities.py | 2 +- .../nodes/knowledge_retrieval/knowledge_retrieval_node.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/api/core/workflow/nodes/knowledge_retrieval/entities.py b/api/core/workflow/nodes/knowledge_retrieval/entities.py index e9122b1eec..f1767bdf9e 100644 --- a/api/core/workflow/nodes/knowledge_retrieval/entities.py +++ b/api/core/workflow/nodes/knowledge_retrieval/entities.py @@ -118,7 +118,7 @@ class KnowledgeRetrievalNodeData(BaseNodeData): multiple_retrieval_config: Optional[MultipleRetrievalConfig] = None single_retrieval_config: Optional[SingleRetrievalConfig] = None metadata_filtering_mode: Optional[Literal["disabled", "automatic", "manual"]] = "disabled" - metadata_model_config: ModelConfig + metadata_model_config: Optional[ModelConfig] = None metadata_filtering_conditions: Optional[MetadataFilteringCondition] = None vision: VisionConfig = Field(default_factory=VisionConfig) diff --git a/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py b/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py index 4e9a38f552..5f092dc2f1 100644 --- a/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py +++ b/api/core/workflow/nodes/knowledge_retrieval/knowledge_retrieval_node.py @@ -509,6 +509,8 @@ class KnowledgeRetrievalNode(BaseNode): # get all metadata field metadata_fields = db.session.query(DatasetMetadata).filter(DatasetMetadata.dataset_id.in_(dataset_ids)).all() all_metadata_fields = [metadata_field.name for metadata_field in metadata_fields] + if node_data.metadata_model_config is None: + raise ValueError("metadata_model_config is required") # get metadata model instance and fetch model config model_instance, model_config = self.get_model_config(node_data.metadata_model_config) # fetch prompt messages @@ -701,7 +703,7 @@ class KnowledgeRetrievalNode(BaseNode): ) def _get_prompt_template(self, node_data: KnowledgeRetrievalNodeData, metadata_fields: list, query: str): - model_mode = ModelMode(node_data.metadata_model_config.mode) + model_mode = ModelMode(node_data.metadata_model_config.mode) # type: ignore input_text = query prompt_messages: list[LLMNodeChatModelMessage] = [] From bddeebd4c985ff0a45d47714b77bc518074d2614 Mon Sep 17 00:00:00 2001 From: Xin Zhang Date: Mon, 21 Jul 2025 12:40:47 +0800 Subject: [PATCH 3/4] refactor: remove unused dissolve_tenant static method (#22690) --- api/services/account_service.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/api/services/account_service.py b/api/services/account_service.py index c13ae7a4f0..352efb2f0c 100644 --- a/api/services/account_service.py +++ b/api/services/account_service.py @@ -1067,15 +1067,6 @@ class TenantService: target_member_join.role = new_role db.session.commit() - @staticmethod - def dissolve_tenant(tenant: Tenant, operator: Account) -> None: - """Dissolve tenant""" - TenantService.check_member_permission(tenant, operator, None, "remove") - - db.session.query(TenantAccountJoin).filter_by(tenant_id=tenant.id).delete() - db.session.delete(tenant) - db.session.commit() - @staticmethod def get_custom_config(tenant_id: str) -> dict: tenant = db.get_or_404(Tenant, tenant_id) From 3b23fc5ad8fca32d06d0ad82cd6f3b21fa58c0a0 Mon Sep 17 00:00:00 2001 From: JianhengHou <36116720+JianhengHou@users.noreply.github.com> Date: Sun, 20 Jul 2025 22:55:16 -0700 Subject: [PATCH 4/4] fix: Correct and enhance the doc on CELERY_BROKER_URL in .env.example (#22693) Co-authored-by: Jianheng Hou --- docker/.env.example | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docker/.env.example b/docker/.env.example index ab98a40fef..6149f63165 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -283,11 +283,12 @@ REDIS_CLUSTERS_PASSWORD= # Celery Configuration # ------------------------------ -# Use redis as the broker, and redis db 1 for celery broker. -# Format as follows: `redis://:@:/` +# Use standalone redis as the broker, and redis db 1 for celery broker. (redis_username is usually set by defualt as empty) +# Format as follows: `redis://:@:/`. # Example: redis://:difyai123456@redis:6379/1 -# If use Redis Sentinel, format as follows: `sentinel://:@:/` -# Example: sentinel://localhost:26379/1;sentinel://localhost:26380/1;sentinel://localhost:26381/1 +# If use Redis Sentinel, format as follows: `sentinel://:@:/` +# For high availability, you can configure multiple Sentinel nodes (if provided) separated by semicolons like below example: +# Example: sentinel://:difyai123456@localhost:26379/1;sentinel://:difyai12345@localhost:26379/1;sentinel://:difyai12345@localhost:26379/1 CELERY_BROKER_URL=redis://:difyai123456@redis:6379/1 CELERY_BACKEND=redis BROKER_USE_SSL=false