chore:微信小程序可以正常对话了

This commit is contained in:
2026-01-21 17:33:11 +08:00
parent 43ac988fc9
commit c63a7de1c4

View File

@@ -60,103 +60,105 @@ export default {
/** /**
* 流式消息入口(自动适配平台) * 流式消息入口(自动适配平台)
*/ */
async sendStreamMessage(message, onChunk, onComplete) { async sendStreamMessage(message, onChunk, onComplete) {
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const socketTask = wx.connectSocket({ const socketTask = wx.connectSocket({
url: 'wss://dev.aigc-quickapp.com/ws/aikefu', url: 'wss://dev.aigc-quickapp.com/ws/aikefu',
header: { header: {}
} });
});
let content = ''; let content = '';
let conversationId = ''; let conversationId = '';
let isAuthenticated = false; let isAuthenticated = false;
// 连接成功 socketTask.onOpen(() => {
socketTask.onOpen(() => { console.log('WebSocket 连接成功,开始认证...');
console.log('WebSocket 连接成功,开始认证...'); socketTask.send({
// 第一步:发送 auth 认证 data: JSON.stringify({
socketTask.send({ action: 'auth',
data: JSON.stringify({ uniacid: store.state.uniacid || '1',
action: 'auth', token: store.state.token || 'test_token',
uniacid: store.state.uniacid || '1', user_id: store.state.memberInfo?.id || 'anonymous'
token: store.state.token || 'test_token', })
user_id: store.state.memberInfo?.id || 'anonymous' });
}) });
});
});
// 接收消息 socketTask.onMessage((res) => {
socketTask.onMessage((res) => { try {
try { const data = JSON.parse(res.data);
const data = JSON.parse(res.data); console.log('收到 WebSocket 消息:', data);
console.log('收到 WebSocket 消息:', data);
// 处理认证响应 if (data.type === 'auth_success') {
if (data.type === 'auth_success') { console.log('认证成功,发送聊天消息...');
console.log('认证成功,发送聊天消息...'); isAuthenticated = true;
isAuthenticated = true; socketTask.send({
socketTask.send({ data: JSON.stringify({
data: JSON.stringify({ action: 'chat',
action: 'chat', uniacid: store.state.uniacid || '1',
uniacid: store.state.uniacid || '1', query: message,
query: message, user_id: store.state.memberInfo?.id || 'anonymous',
user_id: store.state.memberInfo?.id || 'anonymous', conversation_id: this.getConversationId() || ''
conversation_id: this.getConversationId() || '' })
}) });
}); } else if (data.type === 'auth_failed') {
} else if (data.type === 'auth_failed') { const errorMsg = '认证失败,请重新登录';
const errorMsg = '认证失败,请重新登录'; console.error(errorMsg, data);
console.error(errorMsg, data); reject(new Error(errorMsg));
reject(new Error(errorMsg)); if (onComplete) onComplete({ error: errorMsg });
if (onComplete) onComplete({ error: errorMsg }); socketTask.close();
socketTask.close(); }
}
// 处理聊天流式响应
else if (data.action === 'chat_response') {
if (data.type === 'chunk') {
const text = data.content || '';
content += text;
if (onChunk) onChunk(text);
} else if (data.type === 'end') {
conversationId = data.conversation_id || '';
if (conversationId) {
this.setConversationId(conversationId);
}
if (onComplete) {
onComplete({ content, conversation_id: conversationId });
}
resolve({ content, conversation_id: conversationId });
socketTask.close();
}
}
} catch (e) {
console.error('WebSocket 消息解析失败:', e, '原始数据:', res.data);
}
});
// 连接错误 // 处理流式消息块
socketTask.onError((err) => { else if (data.type === 'message' || data.event === 'message') {
const errorMsg = 'WebSocket 连接失败'; const text = data.answer || data.content || data.text || '';
console.error(errorMsg, err); content += text;
reject(new Error(errorMsg)); if (onChunk) onChunk(text);
if (onComplete) onComplete({ error: errorMsg }); }
});
// 连接关闭 // 处理流结束
socketTask.onClose(() => { else if (data.event === 'message_end' || data.type === 'message_end') {
console.log('WebSocket 连接已关闭'); conversationId = data.conversation_id || '';
}); if (conversationId) {
const timeout = setTimeout(() => { this.setConversationId(conversationId);
if (!isAuthenticated || content === '') { }
console.warn('WebSocket 超时,强制关闭'); if (onComplete) {
socketTask.close(); onComplete({ content, conversation_id: conversationId });
reject(new Error('AI服务响应超时')); }
if (onComplete) onComplete({ error: 'AI服务响应超时' }); resolve({ content, conversation_id: conversationId });
} socketTask.close();
}, 10000); }
});
// 可选:处理 done
else if (data.type === 'done') {
console.log('对话完成:', data);
}
} catch (e) {
console.error('WebSocket 消息解析失败:', e, '原始数据:', res.data);
}
});
socketTask.onError((err) => {
const errorMsg = 'WebSocket 连接失败';
console.error(errorMsg, err);
reject(new Error(errorMsg));
if (onComplete) onComplete({ error: errorMsg });
});
socketTask.onClose(() => {
console.log('WebSocket 连接已关闭');
});
const timeout = setTimeout(() => {
if (!isAuthenticated || content === '') {
console.warn('WebSocket 超时,强制关闭');
socketTask.close();
reject(new Error('AI服务响应超时'));
if (onComplete) onComplete({ error: 'AI服务响应超时' });
}
}, 10000);
});
// #endif // #endif
}, },
/** /**