diff --git a/templates/index.html b/templates/index.html index e366ada..cc00f0c 100644 --- a/templates/index.html +++ b/templates/index.html @@ -260,6 +260,7 @@ let currentConversationId = null; let currentAgentId = null; let agents = []; + let providers = []; // 大模型池数据 let quickPhrases = []; let lastSentMessage = null; // 记录最后发送的消息 let lastSentFiles = null; // 记录发送的文件 @@ -272,6 +273,7 @@ let messageVersions = {}; // 存储每个assistant消息的多个版本 { messageId: [{content, thinking}] } document.addEventListener('DOMContentLoaded', () => { + loadProviders(); // 加载大模型池 loadAgents(); loadQuickPhrases(); connectWebSocket(); @@ -279,6 +281,23 @@ setupTextarea(); }); + // 加载大模型池 + async function loadProviders() { + try { + const res = await fetch('/api/v2/providers'); + const data = await res.json(); + providers = data.providers || []; + } catch (e) { console.error('加载Provider失败:', e); } + } + + // 检查当前Agent是否支持视觉 + function checkAgentVisionSupport() { + const agent = agents.find(a => a.id === currentAgentId); + if (!agent) return false; + const provider = providers.find(p => p.id === agent.llm_provider_id); + return provider?.supports_vision || false; + } + // 加载Agent async function loadAgents() { try { @@ -868,6 +887,16 @@ // 如果没有消息且没有文件,不发送 if (!msg && pendingFiles.length === 0) return; + // 检查是否有图片上传 + const hasImages = pendingFiles.some(f => f.type && f.type.startsWith('image/')); + if (hasImages && !checkAgentVisionSupport()) { + const agent = agents.find(a => a.id === currentAgentId); + const agentName = agent?.display_name || agent?.name || '当前Agent'; + alert(`⚠️ ${agentName} 不支持图片识别功能\n\n请选择支持视觉能力的Agent(如 vlm-agent),或者移除图片后再发送。`); + document.getElementById('sendBtn').disabled = false; + return; + } + document.getElementById('sendBtn').disabled = true; input.value = ''; input.style.height = 'auto'; @@ -1014,6 +1043,21 @@ } previewArea.appendChild(previewItem); + + // 如果上传的是图片且当前Agent不支持视觉,显示警告提示 + if (file.type.startsWith('image/') && !checkAgentVisionSupport()) { + const agent = agents.find(a => a.id === currentAgentId); + const agentName = agent?.display_name || agent?.name || '当前Agent'; + const warningDiv = document.createElement('div'); + warningDiv.className = 'vision-warning'; + warningDiv.id = 'vision-warning-tip'; + warningDiv.style.cssText = 'margin-top:8px;padding:8px 12px;background:#fff3cd;border:1px solid #ffc107;border-radius:6px;font-size:13px;color:#856404;'; + warningDiv.innerHTML = ` ${agentName} 不支持图片识别,请选择支持视觉的Agent或移除图片`; + // 避免重复添加 + if (!document.getElementById('vision-warning-tip')) { + previewArea.appendChild(warningDiv); + } + } }; // 根据文件类型选择读取方式 @@ -1035,6 +1079,13 @@ pendingFiles = pendingFiles.filter(f => f.id !== fileId); const preview = document.getElementById(fileId + '-preview'); if (preview) preview.remove(); + + // 如果没有图片了,移除视觉警告提示 + const hasImages = pendingFiles.some(f => f.type && f.type.startsWith('image/')); + if (!hasImages) { + const warning = document.getElementById('vision-warning-tip'); + if (warning) warning.remove(); + } } // 发送消息