From e4cfabeb7ea9a72ec48779471192d7222ac3849d Mon Sep 17 00:00:00 2001 From: lww155 <756794909@qq.com> Date: Wed, 4 Feb 2026 09:54:21 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/test/css/test_page.css | 4 +- main/xiaozhi-server/test/js/app.js | 78 ++++++++++++------- .../test/js/core/network/websocket.js | 18 +++-- 3 files changed, 60 insertions(+), 40 deletions(-) diff --git a/main/xiaozhi-server/test/css/test_page.css b/main/xiaozhi-server/test/css/test_page.css index caa93187..d4ad8bad 100644 --- a/main/xiaozhi-server/test/css/test_page.css +++ b/main/xiaozhi-server/test/css/test_page.css @@ -832,12 +832,12 @@ body { } .model-select:hover { - background: #4f545c; + border-color: #5865f2; } .model-select:focus { outline: none; - border-color: #40444b; + border-color: #5865f2; } .model-select option { diff --git a/main/xiaozhi-server/test/js/app.js b/main/xiaozhi-server/test/js/app.js index 2fe309db..6984fce9 100644 --- a/main/xiaozhi-server/test/js/app.js +++ b/main/xiaozhi-server/test/js/app.js @@ -240,40 +240,58 @@ class App { log(`拍照成功,图像数据长度: ${photoData.length}`, 'success'); try { - const visionApiUrl = window.visionApiUrl || 'http://localhost:8003/mcp/vision/explain'; - log(`正在发送图片到视觉分析接口: ${visionApiUrl}`, 'info'); + const xz_tester_vision = localStorage.getItem('xz_tester_vision'); + if (xz_tester_vision) { + let visionInfo = null; - const deviceId = document.getElementById('deviceMac')?.value || ''; - const clientId = document.getElementById('clientId')?.value || 'web_test_client'; - - const formData = new FormData(); - formData.append('question', question); - formData.append('image', dataURItoBlob(photoData), 'photo.jpg'); - - const response = await fetch(visionApiUrl, { - method: 'POST', - body: formData, - headers: { - 'Device-Id': deviceId, - 'Client-Id': clientId + try { + visionInfo = JSON.parse(xz_tester_vision); + } catch (err) { + throw new Error(`视觉配置解析失败`); } - }); - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); + const { url, token } = visionInfo || {}; + if (!url || !token) { + throw new Error('视觉分析失败:配置缺少接口地址(url)或令牌(token)'); + } + + log(`正在发送图片到视觉分析接口: ${url}`, 'info'); + + const deviceId = document.getElementById('deviceMac')?.value || ''; + const clientId = document.getElementById('clientId')?.value || 'web_test_client'; + + const formData = new FormData(); + formData.append('question', question); + formData.append('image', dataURItoBlob(photoData), 'photo.jpg'); + + const response = await fetch(url, { + method: 'POST', + body: formData, + headers: { + 'Device-Id': deviceId, + 'Client-Id': clientId, + 'Authorization': `Bearer ${token}` + } + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const analysisResult = await response.json(); + log(`视觉分析完成: ${JSON.stringify(analysisResult).substring(0, 200)}...`, 'success'); + + resolve({ + success: true, + message: question, + photo_data: photoData, + photo_width: canvas.width, + photo_height: canvas.height, + vision_analysis: analysisResult + }); + } else { + log('未配置视觉分析服务', 'warning'); } - - const analysisResult = await response.json(); - log(`视觉分析完成: ${JSON.stringify(analysisResult).substring(0, 200)}...`, 'success'); - - resolve({ - success: true, - message: question, - photo_data: photoData, - photo_width: canvas.width, - photo_height: canvas.height, - vision_analysis: analysisResult - }); } catch (error) { log(`视觉分析失败: ${error.message}`, 'error'); resolve({ diff --git a/main/xiaozhi-server/test/js/core/network/websocket.js b/main/xiaozhi-server/test/js/core/network/websocket.js index 90fc7fee..84ee438d 100644 --- a/main/xiaozhi-server/test/js/core/network/websocket.js +++ b/main/xiaozhi-server/test/js/core/network/websocket.js @@ -306,15 +306,17 @@ export class WebSocketHandler { } else if (payload.method === 'initialize') { log(`收到工具初始化请求: ${JSON.stringify(payload.params)}`, 'info'); // 保存视觉分析接口地址 - if (payload.params?.capabilities?.vision?.url) { - window.visionApiUrl = payload.params.capabilities.vision.url; - log(`视觉分析接口地址: ${window.visionApiUrl}`, 'success'); - // 更新输入框显示 - const visionUrlInput = document.getElementById('visionUrl'); - if (visionUrlInput) { - visionUrlInput.value = window.visionApiUrl; - } + const visionUrl = document.getElementById('visionUrl'); + const visionConfig = payload?.params?.capabilities?.vision; + if (visionConfig && typeof visionConfig === 'object' && visionConfig.url && visionConfig.token) { + const visionConfigStr = JSON.stringify(visionConfig); + localStorage.setItem('xz_tester_vision', visionConfigStr); + if (visionUrl) visionUrl.value = visionConfig.url; + } else { + localStorage.removeItem('xz_tester_vision'); + if (visionUrl) visionUrl.value = ''; } + const replyMessage = JSON.stringify({ "session_id": message.session_id || "", "type": "mcp",