mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-26 09:03:54 +08:00
update: 优化代码
This commit is contained in:
@@ -832,12 +832,12 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.model-select:hover {
|
.model-select:hover {
|
||||||
background: #4f545c;
|
border-color: #5865f2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.model-select:focus {
|
.model-select:focus {
|
||||||
outline: none;
|
outline: none;
|
||||||
border-color: #40444b;
|
border-color: #5865f2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.model-select option {
|
.model-select option {
|
||||||
|
|||||||
@@ -240,40 +240,58 @@ class App {
|
|||||||
log(`拍照成功,图像数据长度: ${photoData.length}`, 'success');
|
log(`拍照成功,图像数据长度: ${photoData.length}`, 'success');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const visionApiUrl = window.visionApiUrl || 'http://localhost:8003/mcp/vision/explain';
|
const xz_tester_vision = localStorage.getItem('xz_tester_vision');
|
||||||
log(`正在发送图片到视觉分析接口: ${visionApiUrl}`, 'info');
|
if (xz_tester_vision) {
|
||||||
|
let visionInfo = null;
|
||||||
|
|
||||||
const deviceId = document.getElementById('deviceMac')?.value || '';
|
try {
|
||||||
const clientId = document.getElementById('clientId')?.value || 'web_test_client';
|
visionInfo = JSON.parse(xz_tester_vision);
|
||||||
|
} catch (err) {
|
||||||
const formData = new FormData();
|
throw new Error(`视觉配置解析失败`);
|
||||||
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
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
if (!response.ok) {
|
const { url, token } = visionInfo || {};
|
||||||
throw new Error(`HTTP error! status: ${response.status}`);
|
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) {
|
} catch (error) {
|
||||||
log(`视觉分析失败: ${error.message}`, 'error');
|
log(`视觉分析失败: ${error.message}`, 'error');
|
||||||
resolve({
|
resolve({
|
||||||
|
|||||||
@@ -306,15 +306,17 @@ export class WebSocketHandler {
|
|||||||
} else if (payload.method === 'initialize') {
|
} else if (payload.method === 'initialize') {
|
||||||
log(`收到工具初始化请求: ${JSON.stringify(payload.params)}`, 'info');
|
log(`收到工具初始化请求: ${JSON.stringify(payload.params)}`, 'info');
|
||||||
// 保存视觉分析接口地址
|
// 保存视觉分析接口地址
|
||||||
if (payload.params?.capabilities?.vision?.url) {
|
const visionUrl = document.getElementById('visionUrl');
|
||||||
window.visionApiUrl = payload.params.capabilities.vision.url;
|
const visionConfig = payload?.params?.capabilities?.vision;
|
||||||
log(`视觉分析接口地址: ${window.visionApiUrl}`, 'success');
|
if (visionConfig && typeof visionConfig === 'object' && visionConfig.url && visionConfig.token) {
|
||||||
// 更新输入框显示
|
const visionConfigStr = JSON.stringify(visionConfig);
|
||||||
const visionUrlInput = document.getElementById('visionUrl');
|
localStorage.setItem('xz_tester_vision', visionConfigStr);
|
||||||
if (visionUrlInput) {
|
if (visionUrl) visionUrl.value = visionConfig.url;
|
||||||
visionUrlInput.value = window.visionApiUrl;
|
} else {
|
||||||
}
|
localStorage.removeItem('xz_tester_vision');
|
||||||
|
if (visionUrl) visionUrl.value = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
const replyMessage = JSON.stringify({
|
const replyMessage = JSON.stringify({
|
||||||
"session_id": message.session_id || "",
|
"session_id": message.session_id || "",
|
||||||
"type": "mcp",
|
"type": "mcp",
|
||||||
|
|||||||
Reference in New Issue
Block a user