From 152a84aff33cbf59a38783f5e46bdac15a9202ae Mon Sep 17 00:00:00 2001 From: wwq Date: Tue, 21 Apr 2026 16:45:14 +0800 Subject: [PATCH 1/4] =?UTF-8?q?refactor(knowledge=5Fservice):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=A8=A1=E5=9E=8B=E7=BB=91=E5=AE=9A=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E7=94=A8ID=E6=9F=A5=E8=AF=A2=E5=B9=B6?= =?UTF-8?q?=E7=AE=80=E5=8C=96=E5=9B=9E=E9=80=80=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将模型绑定逻辑从按名称查询改为按ID查询,提高准确性 简化回退机制,直接查询租户下最新创建的模型 统一处理图像转文本模型的查询方式 --- api/app/services/knowledge_service.py | 45 ++++++++++++++------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/api/app/services/knowledge_service.py b/api/app/services/knowledge_service.py index b1d0d77b..56b630bb 100644 --- a/api/app/services/knowledge_service.py +++ b/api/app/services/knowledge_service.py @@ -7,7 +7,6 @@ from app.models.models_model import ModelConfig from app.schemas.knowledge_schema import KnowledgeCreate, KnowledgeUpdate from app.repositories import knowledge_repository from app.core.logging_config import get_business_logger -from app.repositories.model_repository import ModelConfigRepository from app.models.models_model import ModelType business_logger = get_business_logger() @@ -77,53 +76,55 @@ def create_knowledge( tenant_id = workspace.tenant_id - def _get_model_by_name_or_fallback(model_name: str | None, model_types: list, label: str): - """优先按 workspace 指定的 model name 查,找不到再 fallback 到 tenant 下第一个""" - if model_name: + def _get_model_by_id_or_fallback(model_id: str | None, model_types: list, label: str): + """优先按 workspace 绑定的 model_config id 查,找不到再 fallback 到 tenant 下最新创建的一个""" + if model_id: model = db.query(ModelConfig).filter( + ModelConfig.id == model_id, ModelConfig.tenant_id == tenant_id, - ModelConfig.name == model_name, - ModelConfig.type.in_([t.value for t in model_types]), ModelConfig.is_active == True, ModelConfig.is_composite == False ).first() if model: - business_logger.debug(f"Auto-bind {label} model from workspace default: {model.id} ({model_name})") + business_logger.debug(f"Auto-bind {label} model from workspace default: {model.id}") return model - business_logger.debug(f"Workspace default {label} model '{model_name}' not found, falling back to tenant") - models = ModelConfigRepository.get_by_type(db=db, model_types=model_types, tenant_id=tenant_id, is_active=True) - if models: - business_logger.debug(f"Auto-bind {label} model from tenant fallback: {models[0].id}") - return models[0] - return None + business_logger.debug(f"Workspace default {label} model id '{model_id}' not found, falling back to tenant latest") + model = db.query(ModelConfig).filter( + ModelConfig.tenant_id == tenant_id, + ModelConfig.type.in_([t.value for t in model_types]), + ModelConfig.is_active == True, + ModelConfig.is_composite == False + ).order_by(ModelConfig.created_at.desc()).first() + if model: + business_logger.debug(f"Auto-bind {label} model from tenant fallback (latest): {model.id}") + return model if not knowledge.embedding_id: - model = _get_model_by_name_or_fallback(workspace.embedding, [ModelType.EMBEDDING], "embedding") + model = _get_model_by_id_or_fallback(workspace.embedding, [ModelType.EMBEDDING], "embedding") if model: knowledge.embedding_id = model.id if not knowledge.reranker_id: - model = _get_model_by_name_or_fallback(workspace.rerank, [ModelType.RERANK], "rerank") + model = _get_model_by_id_or_fallback(workspace.rerank, [ModelType.RERANK], "rerank") if model: knowledge.reranker_id = model.id if not knowledge.llm_id: - model = _get_model_by_name_or_fallback(workspace.llm, [ModelType.LLM, ModelType.CHAT], "llm") + model = _get_model_by_id_or_fallback(workspace.llm, [ModelType.LLM, ModelType.CHAT], "llm") if model: knowledge.llm_id = model.id if not knowledge.image2text_id: - image2text_models = db.query(ModelConfig).filter( + model = db.query(ModelConfig).filter( ModelConfig.tenant_id == tenant_id, ModelConfig.type.in_([ModelType.CHAT.value]), ModelConfig.capability.contains(["vision"]), ModelConfig.is_active == True, ModelConfig.is_composite == False - ).order_by(ModelConfig.created_at.desc()).all() - if not image2text_models: - raise Exception("租户下没有可用的视觉模型,创建知识库失败") - knowledge.image2text_id = image2text_models[0].id - business_logger.debug(f"Auto-bind image2text model: {image2text_models[0].id}") + ).order_by(ModelConfig.created_at.desc()).first() + if model: + knowledge.image2text_id = model.id + business_logger.debug(f"Auto-bind image2text model: {model.id}") business_logger.debug(f"Start creating the knowledge base: {knowledge.name}") db_knowledge = knowledge_repository.create_knowledge( From eb98a69a845879721c92d917d6bae65b26ad1516 Mon Sep 17 00:00:00 2001 From: wwq Date: Tue, 21 Apr 2026 16:50:43 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix(=E7=9F=A5=E8=AF=86=E6=9C=8D=E5=8A=A1):?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=E5=88=9B=E5=BB=BA=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93=E6=97=B6=E6=9C=AA=E6=A3=80=E6=9F=A5=E8=A7=86=E8=A7=89?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E5=AD=98=E5=9C=A8=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当租户下没有可用的视觉模型时,抛出明确异常提示 --- api/app/services/knowledge_service.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/api/app/services/knowledge_service.py b/api/app/services/knowledge_service.py index 56b630bb..8937dd1e 100644 --- a/api/app/services/knowledge_service.py +++ b/api/app/services/knowledge_service.py @@ -122,9 +122,10 @@ def create_knowledge( ModelConfig.is_active == True, ModelConfig.is_composite == False ).order_by(ModelConfig.created_at.desc()).first() - if model: - knowledge.image2text_id = model.id - business_logger.debug(f"Auto-bind image2text model: {model.id}") + if not model: + raise Exception("租户下没有可用的视觉模型,创建知识库失败") + knowledge.image2text_id = model.id + business_logger.debug(f"Auto-bind image2text model: {model.id}") business_logger.debug(f"Start creating the knowledge base: {knowledge.name}") db_knowledge = knowledge_repository.create_knowledge( From 402c8aef5d745cdf661df69ed105886bf5913a46 Mon Sep 17 00:00:00 2001 From: wwq Date: Tue, 21 Apr 2026 17:04:42 +0800 Subject: [PATCH 3/4] =?UTF-8?q?refactor(knowledge=5Fservice):=20=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E6=A8=A1=E5=9E=8B=E7=BB=91=E5=AE=9A=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E5=8C=BA=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除_get_model_by_id_or_fallback方法,直接使用工作区配置的模型ID 对于image2text模型,放宽类型限制并移除composite检查 --- api/app/services/knowledge_service.py | 38 +++------------------------ 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/api/app/services/knowledge_service.py b/api/app/services/knowledge_service.py index 8937dd1e..7f141b76 100644 --- a/api/app/services/knowledge_service.py +++ b/api/app/services/knowledge_service.py @@ -76,51 +76,21 @@ def create_knowledge( tenant_id = workspace.tenant_id - def _get_model_by_id_or_fallback(model_id: str | None, model_types: list, label: str): - """优先按 workspace 绑定的 model_config id 查,找不到再 fallback 到 tenant 下最新创建的一个""" - if model_id: - model = db.query(ModelConfig).filter( - ModelConfig.id == model_id, - ModelConfig.tenant_id == tenant_id, - ModelConfig.is_active == True, - ModelConfig.is_composite == False - ).first() - if model: - business_logger.debug(f"Auto-bind {label} model from workspace default: {model.id}") - return model - business_logger.debug(f"Workspace default {label} model id '{model_id}' not found, falling back to tenant latest") - model = db.query(ModelConfig).filter( - ModelConfig.tenant_id == tenant_id, - ModelConfig.type.in_([t.value for t in model_types]), - ModelConfig.is_active == True, - ModelConfig.is_composite == False - ).order_by(ModelConfig.created_at.desc()).first() - if model: - business_logger.debug(f"Auto-bind {label} model from tenant fallback (latest): {model.id}") - return model - if not knowledge.embedding_id: - model = _get_model_by_id_or_fallback(workspace.embedding, [ModelType.EMBEDDING], "embedding") - if model: - knowledge.embedding_id = model.id + knowledge.embedding_id = workspace.embedding if not knowledge.reranker_id: - model = _get_model_by_id_or_fallback(workspace.rerank, [ModelType.RERANK], "rerank") - if model: - knowledge.reranker_id = model.id + knowledge.reranker_id = workspace.rerank if not knowledge.llm_id: - model = _get_model_by_id_or_fallback(workspace.llm, [ModelType.LLM, ModelType.CHAT], "llm") - if model: - knowledge.llm_id = model.id + knowledge.llm_id = workspace.llm if not knowledge.image2text_id: model = db.query(ModelConfig).filter( ModelConfig.tenant_id == tenant_id, - ModelConfig.type.in_([ModelType.CHAT.value]), + ModelConfig.type.in_([ModelType.CHAT.value, ModelType.LLM.value]), ModelConfig.capability.contains(["vision"]), ModelConfig.is_active == True, - ModelConfig.is_composite == False ).order_by(ModelConfig.created_at.desc()).first() if not model: raise Exception("租户下没有可用的视觉模型,创建知识库失败") From cb2a7aa60a6c805ccf2e88b24816bd1f645f5762 Mon Sep 17 00:00:00 2001 From: wwq Date: Tue, 21 Apr 2026 17:18:11 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix(=E7=9F=A5=E8=AF=86=E6=9C=8D=E5=8A=A1):?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E5=B7=A5=E4=BD=9C=E7=A9=BA=E9=97=B4?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E9=85=8D=E7=BD=AE=E7=9A=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在创建知识时检查工作空间是否配置了必要的模型,未配置时抛出异常提示用户 --- api/app/services/knowledge_service.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api/app/services/knowledge_service.py b/api/app/services/knowledge_service.py index 7f141b76..20757307 100644 --- a/api/app/services/knowledge_service.py +++ b/api/app/services/knowledge_service.py @@ -77,12 +77,18 @@ def create_knowledge( tenant_id = workspace.tenant_id if not knowledge.embedding_id: + if not workspace.embedding: + raise Exception("工作空间未配置 Embedding 模型,请先完善工作空间配置后重试") knowledge.embedding_id = workspace.embedding if not knowledge.reranker_id: + if not workspace.rerank: + raise Exception("工作空间未配置 Rerank 模型,请先完善工作空间配置后重试") knowledge.reranker_id = workspace.rerank if not knowledge.llm_id: + if not workspace.llm: + raise Exception("工作空间未配置 LLM 模型,请先完善工作空间配置后重试") knowledge.llm_id = workspace.llm if not knowledge.image2text_id: