From 20ef1abe7d731aaa19c0fe3b1623eff9ab2fc8cf Mon Sep 17 00:00:00 2001
From: hubian <908234780@qq.com>
Date: Tue, 14 Apr 2026 11:30:38 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20Agent=E4=B8=8D=E6=94=AF=E6=8C=81?=
=?UTF-8?q?=E8=A7=86=E8=A7=89=E8=83=BD=E5=8A=9B=E6=97=B6=E4=B8=8A=E4=BC=A0?=
=?UTF-8?q?=E5=9B=BE=E7=89=87=E6=8F=90=E7=A4=BA=E7=94=A8=E6=88=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
templates/index.html | 51 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
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();
+ }
}
// 发送消息