@@ -2,6 +2,7 @@ import { Configuration, OpenAIApi } from 'azure-openai'
2
2
import { getUserConfig , maxResponseTokenLength } from '../../config/index.mjs'
3
3
import { getChatSystemPromptBase , pushRecord , setAbortController } from './shared.mjs'
4
4
import { getConversationPairs } from '../../utils/get-conversation-pairs'
5
+ import fetchAdapter from '@vespaiach/axios-fetch-adapter'
5
6
6
7
/**
7
8
* @param {Runtime.Port } port
@@ -27,7 +28,6 @@ export async function generateAnswersWithAzureOpenaiApi(port, question, session)
27
28
} ) ,
28
29
)
29
30
30
- let answer = ''
31
31
const response = await openAiApi
32
32
. createChatCompletion (
33
33
{
@@ -38,37 +38,50 @@ export async function generateAnswersWithAzureOpenaiApi(port, question, session)
38
38
{
39
39
signal : controller . signal ,
40
40
responseType : 'stream' ,
41
+ adapter : fetchAdapter ,
41
42
} ,
42
43
)
43
44
. catch ( ( err ) => {
44
45
port . onMessage . removeListener ( messageListener )
45
46
throw err
46
47
} )
48
+
49
+ let chunkData = ''
50
+ const step = 1500
51
+ let length = 0
47
52
for await ( const chunk of response . data ) {
48
- const lines = chunk
53
+ chunkData += chunk
54
+ length += 1
55
+ if ( length % step !== 0 && ! chunkData . endsWith ( '[DONE]' ) ) continue
56
+
57
+ const lines = chunkData
49
58
. toString ( 'utf8' )
50
59
. split ( '\n' )
51
60
. filter ( ( line ) => line . trim ( ) . startsWith ( 'data: ' ) )
52
61
62
+ let answer = ''
63
+ let message = ''
64
+ let data
53
65
for ( const line of lines ) {
54
- const message = line . replace ( / ^ d a t a : / , '' )
55
- console . debug ( 'sse message' , message )
56
- if ( message === '[DONE]' ) {
57
- pushRecord ( session , question , answer )
58
- console . debug ( 'conversation history' , { content : session . conversationRecords } )
59
- port . postMessage ( { answer : null , done : true , session : session } )
60
- break
61
- }
62
- let data
66
+ message = line . replace ( / ^ d a t a : / , '' )
63
67
try {
64
68
data = JSON . parse ( message )
65
69
} catch ( error ) {
66
- console . debug ( 'json error' , error )
67
70
continue
68
71
}
69
- answer += data . choices [ 0 ] . text
72
+ if ( 'content' in data . choices [ 0 ] . delta ) answer += data . choices [ 0 ] . delta . content
73
+ }
74
+ if ( data ) {
75
+ console . debug ( 'sse message' , data )
70
76
port . postMessage ( { answer : answer , done : false , session : null } )
71
77
}
78
+ if ( message === '[DONE]' ) {
79
+ console . debug ( 'sse message' , '[DONE]' )
80
+ pushRecord ( session , question , answer )
81
+ console . debug ( 'conversation history' , { content : session . conversationRecords } )
82
+ port . postMessage ( { answer : null , done : true , session : session } )
83
+ break
84
+ }
72
85
}
73
86
74
87
port . onMessage . removeListener ( messageListener )
0 commit comments