fix: azure openai api

This commit is contained in:
josc146
2023-04-06 17:02:29 +08:00
parent fef510888b
commit 487f6a5520
3 changed files with 36 additions and 13 deletions
+26 -13
View File
@@ -2,6 +2,7 @@ import { Configuration, OpenAIApi } from 'azure-openai'
import { getUserConfig, maxResponseTokenLength } from '../../config/index.mjs'
import { getChatSystemPromptBase, pushRecord, setAbortController } from './shared.mjs'
import { getConversationPairs } from '../../utils/get-conversation-pairs'
import fetchAdapter from '@vespaiach/axios-fetch-adapter'
/**
* @param {Runtime.Port} port
@@ -27,7 +28,6 @@ export async function generateAnswersWithAzureOpenaiApi(port, question, session)
}),
)
let answer = ''
const response = await openAiApi
.createChatCompletion(
{
@@ -38,37 +38,50 @@ export async function generateAnswersWithAzureOpenaiApi(port, question, session)
{
signal: controller.signal,
responseType: 'stream',
adapter: fetchAdapter,
},
)
.catch((err) => {
port.onMessage.removeListener(messageListener)
throw err
})
let chunkData = ''
const step = 1500
let length = 0
for await (const chunk of response.data) {
const lines = chunk
chunkData += chunk
length += 1
if (length % step !== 0 && !chunkData.endsWith('[DONE]')) continue
const lines = chunkData
.toString('utf8')
.split('\n')
.filter((line) => line.trim().startsWith('data: '))
let answer = ''
let message = ''
let data
for (const line of lines) {
const message = line.replace(/^data: /, '')
console.debug('sse message', message)
if (message === '[DONE]') {
pushRecord(session, question, answer)
console.debug('conversation history', { content: session.conversationRecords })
port.postMessage({ answer: null, done: true, session: session })
break
}
let data
message = line.replace(/^data: /, '')
try {
data = JSON.parse(message)
} catch (error) {
console.debug('json error', error)
continue
}
answer += data.choices[0].text
if ('content' in data.choices[0].delta) answer += data.choices[0].delta.content
}
if (data) {
console.debug('sse message', data)
port.postMessage({ answer: answer, done: false, session: null })
}
if (message === '[DONE]') {
console.debug('sse message', '[DONE]')
pushRecord(session, question, answer)
console.debug('conversation history', { content: session.conversationRecords })
port.postMessage({ answer: null, done: true, session: session })
break
}
}
port.onMessage.removeListener(messageListener)