chore:AI客服正常流式聊天

This commit is contained in:
2025-12-11 17:35:34 +08:00
parent 3898518ad0
commit af23505a74

View File

@@ -308,6 +308,7 @@ export default {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Accept': 'text/event-stream',
}, },
body: JSON.stringify({ body: JSON.stringify({
uniacid: store.state.uniacid || '1', uniacid: store.state.uniacid || '1',
@@ -321,27 +322,60 @@ export default {
const reader = response.body.getReader() const reader = response.body.getReader()
const decoder = new TextDecoder() const decoder = new TextDecoder()
let content = '' let content = ''
let buffer = ''
// 处理流式数据
function processStreamData(buffer, callback) {
const lines = buffer.split('\n');
buffer = lines.pop() || ''; // 最后一行可能不完整
lines.forEach(line => {
line = line.trim();
if (!line) return;
// 解析 SSE 格式
if (line.startsWith('data:')) {
const dataPart = line.slice(5).trim();
if (dataPart) {
try {
const data = JSON.parse(dataPart);
if (data.event === 'message') {
callback(data.answer || '');
}
if (data.conversation_id) {
conversationId = data.conversation_id;
}
if (data.event === 'message_end') {
// 对话完成
console.log('对话完成');
}
} catch (error) {
console.error('解析流式数据失败:', error);
}
}
}
});
return buffer;
}
while (true) { while (true) {
const { done, value } = await reader.read() const { done, value } = await reader.read()
if (done) break if (done) break
const chunk = decoder.decode(value) buffer += decoder.decode(value, { stream: true });
const lines = chunk.split('\n')
for (const line of lines) { // 处理接收到的数据
if (line.startsWith('data: ')) { buffer = processStreamData(buffer, (newData) => {
try { if (newData) {
const data = JSON.parse(line.slice(6)) // 更新 AI 消息
if (data.event === 'text_message' && data.text) { content += newData;
content += data.text if (onChunk) onChunk(newData);
if (onChunk) onChunk(data.text) }
} });
} catch (e) {
// 忽略解析错误
}
}
}
} }
if (onComplete) onComplete(content) if (onComplete) onComplete(content)