diff --git a/src/renderer/components/model-bar.ts b/src/renderer/components/model-bar.ts index 69ba749..f467475 100644 --- a/src/renderer/components/model-bar.ts +++ b/src/renderer/components/model-bar.ts @@ -70,6 +70,7 @@ export async function loadModels(): Promise { .forEach(m => { const opt = document.createElement('option'); opt.value = m.name; + opt.dataset.size = String(m.size || 0); const diskSize = formatSize(m.size || 0); opt.textContent = diskSize ? `${m.name} · ${diskSize}` : m.name; modelSelectEl.appendChild(opt); @@ -91,6 +92,21 @@ export async function loadModels(): Promise { } } +/** 根据能力为下拉框选项添加图标标记 */ +function updateOptionIcons(): void { + for (const opt of Array.from(modelSelectEl.options)) { + const caps = modelCapabilityCache.get(opt.value); + if (!caps) continue; + const diskSize = opt.dataset.size ? formatSize(parseInt(opt.dataset.size)) : ''; + const base = diskSize ? `${opt.value} · ${diskSize}` : opt.value; + const icons: string[] = []; + if (caps.think) icons.push('🧠'); + if (caps.vision) icons.push('👁️'); + if (caps.tools) icons.push('🔧'); + opt.textContent = icons.length > 0 ? `${base} ${icons.join('')}` : base; + } +} + async function filterEmbedModels(models: Array<{ name: string }>): Promise { const api = state.get(KEYS.API); if (!api) return; @@ -113,6 +129,8 @@ async function filterEmbedModels(models: Array<{ name: string }>): Promise } catch { /* ignore */ } } + updateOptionIcons(); + if (!modelSelectEl.value && modelSelectEl.options.length > 0) { modelSelectEl.value = modelSelectEl.options[0].value; state.set('_defaultModel', modelSelectEl.value);