fix: 支持了微软稀有的消息拆分cursor

This commit is contained in:
ikechan8370 2023-03-29 20:43:34 +08:00
parent 3bdfb15b0d
commit 1c1c2562ae

View file

@ -445,17 +445,17 @@ export default class SydneyAIClient {
} }
let apology = false let apology = false
const messagePromise = new Promise((resolve, reject) => { const messagePromise = new Promise((resolve, reject) => {
let replySoFar = '' let replySoFar = ['']
let adaptiveCardsSoFar = null let adaptiveCardsSoFar = null
let suggestedResponsesSoFar = null let suggestedResponsesSoFar = null
let stopTokenFound = false let stopTokenFound = false
const messageTimeout = setTimeout(() => { const messageTimeout = setTimeout(() => {
this.cleanupWebSocketConnection(ws) this.cleanupWebSocketConnection(ws)
if (replySoFar) { if (replySoFar[0]) {
let message = { let message = {
adaptiveCards: adaptiveCardsSoFar, adaptiveCards: adaptiveCardsSoFar,
text: replySoFar text: replySoFar.join('')
} }
resolve({ resolve({
message message
@ -465,7 +465,7 @@ export default class SydneyAIClient {
} }
}, timeout) }, timeout)
const firstTimeout = setTimeout(() => { const firstTimeout = setTimeout(() => {
if (!replySoFar) { if (!replySoFar[0]) {
this.cleanupWebSocketConnection(ws) this.cleanupWebSocketConnection(ws)
reject(new Error('等待必应服务器响应超时。请尝试调整超时时间配置或减少设定量以避免此问题。')) reject(new Error('等待必应服务器响应超时。请尝试调整超时时间配置或减少设定量以避免此问题。'))
} }
@ -476,10 +476,10 @@ export default class SydneyAIClient {
clearTimeout(messageTimeout) clearTimeout(messageTimeout)
clearTimeout(firstTimeout) clearTimeout(firstTimeout)
this.cleanupWebSocketConnection(ws) this.cleanupWebSocketConnection(ws)
if (replySoFar) { if (replySoFar[0]) {
let message = { let message = {
adaptiveCards: adaptiveCardsSoFar, adaptiveCards: adaptiveCardsSoFar,
text: replySoFar text: replySoFar.join('')
} }
resolve({ resolve({
message message
@ -488,6 +488,7 @@ export default class SydneyAIClient {
reject('Request aborted') reject('Request aborted')
} }
}) })
let cursor = 0
// let apology = false // let apology = false
ws.on('message', (data) => { ws.on('message', (data) => {
const objects = data.toString().split('') const objects = data.toString().split('')
@ -523,11 +524,11 @@ export default class SydneyAIClient {
? messages[messages.length - 1] ? messages[messages.length - 1]
: { : {
adaptiveCards: adaptiveCardsSoFar, adaptiveCards: adaptiveCardsSoFar,
text: replySoFar text: replySoFar.join('')
} }
if (messages[0].contentOrigin === 'Apology') { if (messages[0].contentOrigin === 'Apology') {
console.log('Apology found') console.log('Apology found')
if (!replySoFar) { if (!replySoFar[0]) {
apology = true apology = true
} }
stopTokenFound = true stopTokenFound = true
@ -537,7 +538,7 @@ export default class SydneyAIClient {
// adaptiveCardsSoFar || (message.adaptiveCards[0].body[0].text = replySoFar) // adaptiveCardsSoFar || (message.adaptiveCards[0].body[0].text = replySoFar)
console.log({ replySoFar, message }) console.log({ replySoFar, message })
message.adaptiveCards = adaptiveCardsSoFar message.adaptiveCards = adaptiveCardsSoFar
message.text = replySoFar || message.spokenText message.text = replySoFar.join('') || message.spokenText
message.suggestedResponses = suggestedResponsesSoFar message.suggestedResponses = suggestedResponsesSoFar
// 遇到Apology不发送默认建议回复 // 遇到Apology不发送默认建议回复
// message.suggestedResponses = suggestedResponsesSoFar || message.suggestedResponses // message.suggestedResponses = suggestedResponsesSoFar || message.suggestedResponses
@ -551,19 +552,26 @@ export default class SydneyAIClient {
suggestedResponsesSoFar = message.suggestedResponses suggestedResponsesSoFar = message.suggestedResponses
} }
const updatedText = messages[0].text const updatedText = messages[0].text
if (!updatedText || updatedText === replySoFar) { if (!updatedText || updatedText === replySoFar[cursor]) {
return return
} }
// get the difference between the current text and the previous text // get the difference between the current text and the previous text
const difference = updatedText.substring(replySoFar.length) if (replySoFar[cursor] && updatedText.startsWith(replySoFar[cursor])) {
onProgress(difference) if (updatedText.trim().endsWith(stopToken)) {
if (updatedText.trim().endsWith(stopToken)) { // apology = true
// apology = true // remove stop token from updated text
// remove stop token from updated text replySoFar[cursor] = updatedText.replace(stopToken, '').trim()
replySoFar = updatedText.replace(stopToken, '').trim() return
return }
replySoFar[cursor] = updatedText
} else if (replySoFar[cursor]) {
cursor += 1
replySoFar.push(updatedText)
} else {
replySoFar[cursor] = replySoFar[cursor] + updatedText
} }
replySoFar = updatedText
// onProgress(difference)
return return
} }
case 2: { case 2: {
@ -577,14 +585,15 @@ export default class SydneyAIClient {
reject(`${event.item.result.value}: ${event.item.result.message}`) reject(`${event.item.result.value}: ${event.item.result.message}`)
return return
} }
const messages = event.item?.messages || [] let messages = event.item?.messages || []
// messages = messages.filter(m => m.author === 'bot')
const message = messages.length const message = messages.length
? messages[messages.length - 1] ? messages[messages.length - 1]
: { : {
adaptiveCards: adaptiveCardsSoFar, adaptiveCards: adaptiveCardsSoFar,
text: replySoFar text: replySoFar.join('')
} }
message.text = messages.filter(m => m.author === 'bot').map(m => m.text).join('')
if (!message) { if (!message) {
reject('No message was generated.') reject('No message was generated.')
return return
@ -603,7 +612,7 @@ export default class SydneyAIClient {
return return
} }
if (message.contentOrigin === 'Apology') { if (message.contentOrigin === 'Apology') {
if (!replySoFar) { if (!replySoFar[0]) {
apology = true apology = true
} }
console.log('Apology found') console.log('Apology found')
@ -613,7 +622,7 @@ export default class SydneyAIClient {
this.cleanupWebSocketConnection(ws) this.cleanupWebSocketConnection(ws)
// message.adaptiveCards[0].body[0].text = replySoFar || message.spokenText // message.adaptiveCards[0].body[0].text = replySoFar || message.spokenText
message.adaptiveCards = adaptiveCardsSoFar message.adaptiveCards = adaptiveCardsSoFar
message.text = replySoFar || message.spokenText message.text = replySoFar.join('') || message.spokenText
message.suggestedResponses = suggestedResponsesSoFar message.suggestedResponses = suggestedResponsesSoFar
// 遇到Apology不发送默认建议回复 // 遇到Apology不发送默认建议回复
// message.suggestedResponses = suggestedResponsesSoFar || message.suggestedResponses // message.suggestedResponses = suggestedResponsesSoFar || message.suggestedResponses
@ -629,8 +638,8 @@ export default class SydneyAIClient {
console.debug(event.item.result.error) console.debug(event.item.result.error)
console.debug(event.item.result.exception) console.debug(event.item.result.exception)
} }
if (replySoFar) { if (replySoFar[0]) {
message.text = replySoFar message.text = replySoFar.join('')
resolve({ resolve({
message, message,
conversationExpiryTime: event?.item?.conversationExpiryTime conversationExpiryTime: event?.item?.conversationExpiryTime
@ -644,7 +653,7 @@ export default class SydneyAIClient {
if (stopTokenFound || event.item.messages[0].topicChangerText) { if (stopTokenFound || event.item.messages[0].topicChangerText) {
// message.adaptiveCards[0].body[0].text = replySoFar // message.adaptiveCards[0].body[0].text = replySoFar
message.adaptiveCards = adaptiveCardsSoFar message.adaptiveCards = adaptiveCardsSoFar
message.text = replySoFar message.text = replySoFar.join('')
} }
resolve({ resolve({
message, message,