From c43c72c1a318ca79626573dde1fe2c9b1c2dfa83 Mon Sep 17 00:00:00 2001 From: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Date: Mon, 29 Sep 2025 16:12:26 +0800 Subject: [PATCH] fix: Fix vector_setting not found error (#26380) --- .../install-from-marketplace.tsx | 2 +- .../knowledge-base/components/option-card.tsx | 5 +- .../workflow/nodes/knowledge-base/default.ts | 33 ++++++- .../nodes/knowledge-base/hooks/use-config.ts | 85 +++++++++++++++---- web/i18n/en-US/common.ts | 1 + web/i18n/en-US/workflow.ts | 3 + web/i18n/ja-JP/common.ts | 1 + web/i18n/zh-Hans/common.ts | 1 + web/i18n/zh-Hans/workflow.ts | 3 + 9 files changed, 116 insertions(+), 18 deletions(-) diff --git a/web/app/components/header/account-setting/data-source-page-new/install-from-marketplace.tsx b/web/app/components/header/account-setting/data-source-page-new/install-from-marketplace.tsx index 4c0de924d1..f4f7749f7f 100644 --- a/web/app/components/header/account-setting/data-source-page-new/install-from-marketplace.tsx +++ b/web/app/components/header/account-setting/data-source-page-new/install-from-marketplace.tsx @@ -52,7 +52,7 @@ const InstallFromMarketplace = ({
setCollapse(!collapse)}> - {t('common.modelProvider.installProvider')} + {t('common.modelProvider.installDataSourceProvider')}
{t('common.modelProvider.discoverMore')} diff --git a/web/app/components/workflow/nodes/knowledge-base/components/option-card.tsx b/web/app/components/workflow/nodes/knowledge-base/components/option-card.tsx index c15157fc5c..789e24835f 100644 --- a/web/app/components/workflow/nodes/knowledge-base/components/option-card.tsx +++ b/web/app/components/workflow/nodes/knowledge-base/components/option-card.tsx @@ -86,7 +86,10 @@ const OptionCard = memo(({ readonly && 'cursor-not-allowed', wrapperClassName && (typeof wrapperClassName === 'function' ? wrapperClassName(isActive) : wrapperClassName), )} - onClick={() => !readonly && enableSelect && id && onClick?.(id)} + onClick={(e) => { + e.stopPropagation() + !readonly && enableSelect && id && onClick?.(id) + }} >
= { chunk_structure, indexing_technique, retrieval_model, + embedding_model, + embedding_model_provider, + index_chunk_variable_selector, } = payload + const { + search_method, + reranking_enable, + reranking_model, + } = retrieval_model || {} + if (!chunk_structure) { return { isValid: false, @@ -36,6 +46,13 @@ const nodeDefault: NodeDefault = { } } + if (index_chunk_variable_selector.length === 0) { + return { + isValid: false, + errorMessage: t('workflow.nodes.knowledgeBase.chunksVariableIsRequired'), + } + } + if (!indexing_technique) { return { isValid: false, @@ -43,13 +60,27 @@ const nodeDefault: NodeDefault = { } } - if (!retrieval_model || !retrieval_model.search_method) { + if (indexing_technique === IndexingType.QUALIFIED && (!embedding_model || !embedding_model_provider)) { + return { + isValid: false, + errorMessage: t('workflow.nodes.knowledgeBase.embeddingModelIsRequired'), + } + } + + if (!retrieval_model || !search_method) { return { isValid: false, errorMessage: t('workflow.nodes.knowledgeBase.retrievalSettingIsRequired'), } } + if (reranking_enable && (!reranking_model || !reranking_model.reranking_provider_name || !reranking_model.reranking_model_name)) { + return { + isValid: false, + errorMessage: t('workflow.nodes.knowledgeBase.rerankingModelIsRequired'), + } + } + return { isValid: true, errorMessage: '', diff --git a/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts b/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts index 365722feba..8b22704c5a 100644 --- a/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts +++ b/web/app/components/workflow/nodes/knowledge-base/hooks/use-config.ts @@ -9,13 +9,17 @@ import { ChunkStructureEnum, IndexMethodEnum, RetrievalSearchMethodEnum, + WeightedScoreEnum, } from '../types' import type { - HybridSearchModeEnum, KnowledgeBaseNodeType, RerankingModel, } from '../types' +import { + HybridSearchModeEnum, +} from '../types' import { isHighQualitySearchMethod } from '../utils' +import { DEFAULT_WEIGHTED_SCORE, RerankingModeEnum } from '@/models/datasets' export const useConfig = (id: string) => { const store = useStoreApi() @@ -35,6 +39,25 @@ export const useConfig = (id: string) => { }) }, [id, handleNodeDataUpdateWithSyncDraft]) + const getDefaultWeights = useCallback(({ + embeddingModel, + embeddingModelProvider, + }: { + embeddingModel: string + embeddingModelProvider: string + }) => { + return { + vector_setting: { + vector_weight: DEFAULT_WEIGHTED_SCORE.other.semantic, + embedding_provider_name: embeddingModelProvider || '', + embedding_model_name: embeddingModel, + }, + keyword_setting: { + keyword_weight: DEFAULT_WEIGHTED_SCORE.other.keyword, + }, + } + }, []) + const handleChunkStructureChange = useCallback((chunkStructure: ChunkStructureEnum) => { const nodeData = getNodeData() const { @@ -80,39 +103,72 @@ export const useConfig = (id: string) => { embeddingModelProvider: string }) => { const nodeData = getNodeData() - handleNodeDataUpdate({ + const defaultWeights = getDefaultWeights({ + embeddingModel, + embeddingModelProvider, + }) + const changeData = { embedding_model: embeddingModel, embedding_model_provider: embeddingModelProvider, retrieval_model: { ...nodeData?.data.retrieval_model, - vector_setting: { - ...nodeData?.data.retrieval_model.vector_setting, - embedding_provider_name: embeddingModelProvider, - embedding_model_name: embeddingModel, - }, }, - }) - }, [getNodeData, handleNodeDataUpdate]) + } + if (changeData.retrieval_model.weights) { + changeData.retrieval_model = { + ...changeData.retrieval_model, + weights: { + ...changeData.retrieval_model.weights, + vector_setting: { + ...changeData.retrieval_model.weights.vector_setting, + embedding_provider_name: embeddingModelProvider, + embedding_model_name: embeddingModel, + }, + }, + } + } + else { + changeData.retrieval_model = { + ...changeData.retrieval_model, + weights: defaultWeights, + } + } + handleNodeDataUpdate(changeData) + }, [getNodeData, getDefaultWeights, handleNodeDataUpdate]) const handleRetrievalSearchMethodChange = useCallback((searchMethod: RetrievalSearchMethodEnum) => { const nodeData = getNodeData() - handleNodeDataUpdate({ + const changeData = { retrieval_model: { ...nodeData?.data.retrieval_model, search_method: searchMethod, + reranking_mode: nodeData?.data.retrieval_model.reranking_mode || RerankingModeEnum.RerankingModel, }, - }) + } + if (searchMethod === RetrievalSearchMethodEnum.hybrid) { + changeData.retrieval_model = { + ...changeData.retrieval_model, + reranking_enable: changeData.retrieval_model.reranking_mode === RerankingModeEnum.RerankingModel, + } + } + handleNodeDataUpdate(changeData) }, [getNodeData, handleNodeDataUpdate]) const handleHybridSearchModeChange = useCallback((hybridSearchMode: HybridSearchModeEnum) => { const nodeData = getNodeData() + const defaultWeights = getDefaultWeights({ + embeddingModel: nodeData?.data.embedding_model || '', + embeddingModelProvider: nodeData?.data.embedding_model_provider || '', + }) handleNodeDataUpdate({ retrieval_model: { ...nodeData?.data.retrieval_model, reranking_mode: hybridSearchMode, + reranking_enable: hybridSearchMode === HybridSearchModeEnum.RerankingModel, + weights: nodeData?.data.retrieval_model.weights || defaultWeights, }, }) - }, [getNodeData, handleNodeDataUpdate]) + }, [getNodeData, getDefaultWeights, handleNodeDataUpdate]) const handleRerankingModelEnabledChange = useCallback((rerankingModelEnabled: boolean) => { const nodeData = getNodeData() @@ -130,11 +186,10 @@ export const useConfig = (id: string) => { retrieval_model: { ...nodeData?.data.retrieval_model, weights: { - weight_type: 'weighted_score', + weight_type: WeightedScoreEnum.Customized, vector_setting: { + ...nodeData?.data.retrieval_model.weights?.vector_setting, vector_weight: weightedScore.value[0], - embedding_provider_name: '', - embedding_model_name: '', }, keyword_setting: { keyword_weight: weightedScore.value[1], diff --git a/web/i18n/en-US/common.ts b/web/i18n/en-US/common.ts index ef6bf73ab5..b9d315388f 100644 --- a/web/i18n/en-US/common.ts +++ b/web/i18n/en-US/common.ts @@ -493,6 +493,7 @@ const translation = { toBeConfigured: 'To be configured', configureTip: 'Set up api-key or add model to use', installProvider: 'Install model providers', + installDataSourceProvider: 'Install data source providers', discoverMore: 'Discover more in ', emptyProviderTitle: 'Model provider not set up', emptyProviderTip: 'Please install a model provider first.', diff --git a/web/i18n/en-US/workflow.ts b/web/i18n/en-US/workflow.ts index 6b6a25e7af..3f1654b2e7 100644 --- a/web/i18n/en-US/workflow.ts +++ b/web/i18n/en-US/workflow.ts @@ -955,7 +955,10 @@ const translation = { aboutRetrieval: 'about retrieval method.', chunkIsRequired: 'Chunk structure is required', indexMethodIsRequired: 'Index method is required', + chunksVariableIsRequired: 'Chunks variable is required', + embeddingModelIsRequired: 'Embedding model is required', retrievalSettingIsRequired: 'Retrieval setting is required', + rerankingModelIsRequired: 'Reranking model is required', }, }, tracing: { diff --git a/web/i18n/ja-JP/common.ts b/web/i18n/ja-JP/common.ts index 7052b6f4ab..5526ac0441 100644 --- a/web/i18n/ja-JP/common.ts +++ b/web/i18n/ja-JP/common.ts @@ -484,6 +484,7 @@ const translation = { emptyProviderTitle: 'モデルプロバイダーが設定されていません', discoverMore: 'もっと発見する', installProvider: 'モデルプロバイダーをインストールする', + installDataSourceProvider: 'データソースプロバイダーをインストールする', configureTip: 'API キーを設定するか、使用するモデルを追加してください', toBeConfigured: '設定中', emptyProviderTip: '最初にモデルプロバイダーをインストールしてください。', diff --git a/web/i18n/zh-Hans/common.ts b/web/i18n/zh-Hans/common.ts index bcefb09e3e..0ecdb20d5e 100644 --- a/web/i18n/zh-Hans/common.ts +++ b/web/i18n/zh-Hans/common.ts @@ -487,6 +487,7 @@ const translation = { toBeConfigured: '待配置', configureTip: '请配置 API 密钥,添加模型。', installProvider: '安装模型供应商', + installDataSourceProvider: '安装数据源供应商', discoverMore: '发现更多就在', emptyProviderTitle: '尚未安装模型供应商', emptyProviderTip: '请安装模型供应商。', diff --git a/web/i18n/zh-Hans/workflow.ts b/web/i18n/zh-Hans/workflow.ts index 0bf078c085..77b7fe3597 100644 --- a/web/i18n/zh-Hans/workflow.ts +++ b/web/i18n/zh-Hans/workflow.ts @@ -955,7 +955,10 @@ const translation = { aboutRetrieval: '关于知识检索。', chunkIsRequired: '分段结构是必需的', indexMethodIsRequired: '索引方法是必需的', + chunksVariableIsRequired: 'Chunks 变量是必需的', + embeddingModelIsRequired: 'Embedding 模型是必需的', retrievalSettingIsRequired: '检索设置是必需的', + rerankingModelIsRequired: 'Reranking 模型是必需的', }, }, tracing: {