From 82bc35a501c90ec578f01200c404d3a5cf682205 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Sun, 7 Dec 2025 17:17:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(embedding):=20=E6=96=B0=E5=A2=9E=20Embeddi?= =?UTF-8?q?ngModelSelector=20=E7=BB=84=E4=BB=B6=E5=B9=B6=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E5=8E=9F=E6=9C=89=E9=80=89=E6=8B=A9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将嵌入模型选择逻辑提取为独立组件,提供模型状态显示功能 在 DataBaseView 和 SettingView 中使用新组件替代原有实现 --- web/src/components/EmbeddingModelSelector.vue | 138 ++++++++++++++++++ web/src/views/DataBaseView.vue | 14 +- web/src/views/SettingView.vue | 91 +----------- 3 files changed, 149 insertions(+), 94 deletions(-) create mode 100644 web/src/components/EmbeddingModelSelector.vue diff --git a/web/src/components/EmbeddingModelSelector.vue b/web/src/components/EmbeddingModelSelector.vue new file mode 100644 index 00000000..b5a1d7bd --- /dev/null +++ b/web/src/components/EmbeddingModelSelector.vue @@ -0,0 +1,138 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/DataBaseView.vue b/web/src/views/DataBaseView.vue index 0c38fd6a..c1765ad3 100644 --- a/web/src/views/DataBaseView.vue +++ b/web/src/views/DataBaseView.vue @@ -50,7 +50,12 @@

嵌入模型

- +
@@ -237,6 +242,7 @@ import { LockOutlined, InfoCircleOutlined, QuestionCircleOutlined, PlusOutlined import { databaseApi, typeApi } from '@/apis/knowledge_api'; import HeaderComponent from '@/components/HeaderComponent.vue'; import ModelSelectorComponent from '@/components/ModelSelectorComponent.vue'; +import EmbeddingModelSelector from '@/components/EmbeddingModelSelector.vue'; import dayjs, { parseToShanghai } from '@/utils/time'; const route = useRoute() @@ -250,12 +256,6 @@ const state = reactive({ openNewDatabaseModel: false, }) -const embedModelOptions = computed(() => { - return Object.keys(configStore.config?.embed_model_names || {}).map(key => ({ - label: `${key} (${configStore.config?.embed_model_names[key]?.dimension})`, - value: key, - })) -}) // 语言选项(值使用英文,以保证后端/LightRAG 兼容;标签为中英文方便理解) const languageOptions = [ diff --git a/web/src/views/SettingView.vue b/web/src/views/SettingView.vue index bee9f0b4..db4a80a6 100644 --- a/web/src/views/SettingView.vue +++ b/web/src/views/SettingView.vue @@ -39,35 +39,11 @@ 检查状态 -->
- - -
- - {{ name }} - - - {{ getModelStatusIcon(name) }} - -
-
-
+ style="width: 320px" + />
{{ items?.reranker.des }} @@ -184,8 +160,8 @@ import { import HeaderComponent from '@/components/HeaderComponent.vue'; import ModelProvidersComponent from '@/components/ModelProvidersComponent.vue'; import UserManagementComponent from '@/components/UserManagementComponent.vue'; -import { embeddingApi } from '@/apis/knowledge_api' import ModelSelectorComponent from '@/components/ModelSelectorComponent.vue'; +import EmbeddingModelSelector from '@/components/EmbeddingModelSelector.vue'; const configStore = useConfigStore() const userStore = useUserStore() @@ -194,12 +170,6 @@ const state = reactive({ loading: false, section: 'base', windowWidth: window?.innerWidth || 0, - modelStatuses: {}, // 存储embedding模型状态 - checkingStatus: false // 是否正在检查状态 -}) - -const embedModelChoices = computed(() => { - return Object.keys(configStore?.config?.embed_model_names || {}) || [] }) const rerankerChoices = computed(() => { @@ -252,65 +222,12 @@ onMounted(() => { updateWindowWidth() window.addEventListener('resize', updateWindowWidth) state.section = userStore.isSuperAdmin ? 'base' : 'user' - - checkAllModelStatus() }) onUnmounted(() => { window.removeEventListener('resize', updateWindowWidth) }) - - -// 检查所有embedding模型状态 -const checkAllModelStatus = async () => { - try { - state.checkingStatus = true - const response = await embeddingApi.getAllModelsStatus() - if (response.status.models) { - state.modelStatuses = response.status.models - } - } catch (error) { - console.error('检查所有模型状态失败:', error) - message.error('获取模型状态失败') - } finally { - state.checkingStatus = false - } -} - -// 获取模型状态图标 -const getModelStatusIcon = (modelId) => { - const status = state.modelStatuses[modelId] - if (!status) return '○' - if (status.status === 'available') return '✓' - if (status.status === 'unavailable') return '✗' - if (status.status === 'error') return '⚠' - return '○' -} - -// 获取模型状态颜色 -const getModelStatusColor = (modelId) => { - const status = state.modelStatuses[modelId] - if (!status) return 'var(--gray-500)' - if (status.status === 'available') return 'var(--color-success-500)' - if (status.status === 'unavailable') return 'var(--color-error-500)' - if (status.status === 'error') return 'var(--color-warning-500)' - return 'var(--gray-500)' -} -// 获取模型状态提示文本 -const getModelStatusTooltip = (modelId) => { - const status = state.modelStatuses[modelId] - if (!status) return '状态未知' - - let statusText = '' - if (status.status === 'available') statusText = '可用' - else if (status.status === 'unavailable') statusText = '不可用' - else if (status.status === 'error') statusText = '错误' - - const message = status.message || '无详细信息' - return `${statusText}: ${message}` -} - const openLink = (url) => { window.open(url, '_blank') }