diff --git a/api/services/dataset_service.py b/api/services/dataset_service.py index d2093e9035..4738beff50 100644 --- a/api/services/dataset_service.py +++ b/api/services/dataset_service.py @@ -8,9 +8,11 @@ from typing import Any, Optional from flask_login import current_user # type: ignore from sqlalchemy import func +from sqlalchemy.orm import Session from werkzeug.exceptions import NotFound from configs import dify_config +from core.entities import DEFAULT_PLUGIN_ID from core.errors.error import LLMBadRequestError, ProviderTokenNotInitError from core.model_manager import ModelManager from core.model_runtime.entities.model_entities import ModelType @@ -267,7 +269,15 @@ class DatasetService: external_knowledge_api_id = data.get("external_knowledge_api_id", None) if not external_knowledge_api_id: raise ValueError("External knowledge api id is required.") - external_knowledge_binding = ExternalKnowledgeBindings.query.filter_by(dataset_id=dataset_id).first() + + with Session(db.engine) as session: + external_knowledge_binding = ( + session.query(ExternalKnowledgeBindings).filter_by(dataset_id=dataset_id).first() + ) + + if not external_knowledge_binding: + raise ValueError("External knowledge binding not found.") + if ( external_knowledge_binding.external_knowledge_id != external_knowledge_id or external_knowledge_binding.external_knowledge_api_id != external_knowledge_api_id @@ -315,8 +325,19 @@ class DatasetService: except ProviderTokenNotInitError as ex: raise ValueError(ex.description) else: + # add default plugin id to both setting sets, to make sure the plugin model provider is consistent + plugin_model_provider = dataset.embedding_model_provider + if "/" not in plugin_model_provider: + plugin_model_provider = f"{DEFAULT_PLUGIN_ID}/{plugin_model_provider}/{plugin_model_provider}" + + new_plugin_model_provider = data["embedding_model_provider"] + if "/" not in new_plugin_model_provider: + new_plugin_model_provider = ( + f"{DEFAULT_PLUGIN_ID}/{new_plugin_model_provider}/{new_plugin_model_provider}" + ) + if ( - data["embedding_model_provider"] != dataset.embedding_model_provider + new_plugin_model_provider != plugin_model_provider or data["embedding_model"] != dataset.embedding_model ): action = "update"