From ebaacb5631afb27daab66646db83d11703328069 Mon Sep 17 00:00:00 2001 From: thzxx Date: Sat, 4 Apr 2026 23:24:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=B5=8C=E5=85=A5=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E6=94=B9=E7=94=A8=20/api/show=20capabilities?= =?UTF-8?q?=20=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/components/kb-modal.js | 43 ++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/js/components/kb-modal.js b/js/components/kb-modal.js index 7f4a146..b3f48f8 100644 --- a/js/components/kb-modal.js +++ b/js/components/kb-modal.js @@ -291,7 +291,7 @@ async function handleDocUpload(e) { } /** - * 填充嵌入模型下拉(仅显示嵌入模型) + * 填充嵌入模型下拉(通过 /api/show 检测 embedding 能力) */ async function populateEmbedModels() { const select = document.querySelector('#selectEmbedModel'); @@ -301,23 +301,34 @@ async function populateEmbedModels() { try { const data = await api.listModels(); select.innerHTML = ''; - if (data.models) { - const embedKeywords = ['embed', 'nomic', 'mxbai', 'bge', 'e5', 'snowflake', 'arctic']; - const embedModels = data.models.filter(m => - embedKeywords.some(kw => m.name.toLowerCase().includes(kw)) - ); + if (!data.models || data.models.length === 0) { + select.innerHTML = ''; + return; + } - embedModels.forEach(m => { - const opt = document.createElement('option'); - opt.value = m.name; - const size = m.size ? ` (${formatSize(m.size)})` : ''; - opt.textContent = m.name + size; - select.appendChild(opt); - }); + // 并发检测每个模型的 capabilities + const checks = await Promise.allSettled( + data.models.map(async (m) => { + const info = await api.showModel(m.name); + const caps = info.capabilities || []; + return { name: m.name, size: m.size, isEmbed: caps.includes('embedding') }; + }) + ); - if (embedModels.length === 0) { - select.innerHTML = ''; - } + const embedModels = checks + .filter(r => r.status === 'fulfilled' && r.value.isEmbed) + .map(r => r.value); + + embedModels.forEach(m => { + const opt = document.createElement('option'); + opt.value = m.name; + const size = m.size ? ` (${formatSize(m.size)})` : ''; + opt.textContent = m.name + size; + select.appendChild(opt); + }); + + if (embedModels.length === 0) { + select.innerHTML = ''; } } catch (err) { console.warn('[KB] 加载模型列表失败:', err);