@@ -35,24 +35,37 @@ export async function callAiModel({ apiUrl, apiKey, model, messages, temperature
35
35
return newMessage ;
36
36
}
37
37
const newMessage = { role : 'assistant' as const , content : '' , reasoning_content : '' , timestamp : new Date ( ) . toISOString ( ) } ;
38
- const reader = response . body ?. getReader ( ) ;
39
- if ( ! reader ) return newMessage ;
38
+ if ( ! response . body ) return newMessage ;
39
+ const reader = response . body . getReader ( ) ;
40
40
const decoder = new TextDecoder ( ) ;
41
+ let buffer = '' ;
41
42
while ( true ) {
42
43
const { done, value } = await reader . read ( ) ;
43
44
if ( done ) break ;
44
- const chunk = decoder . decode ( value ) ;
45
- const lines = chunk . split ( '\n' ) . filter ( l => l . trim ( ) ) ;
46
- for ( const line of lines ) {
47
- if ( line === 'data: [DONE]' ) continue ;
45
+ if ( ! value ) continue ;
46
+ buffer += decoder . decode ( value , { stream : true } ) ;
47
+ let idx ;
48
+ while ( ( idx = buffer . indexOf ( '\n' ) ) >= 0 ) {
49
+ const line = buffer . slice ( 0 , idx ) . trim ( ) ;
50
+ buffer = buffer . slice ( idx + 1 ) ;
51
+ if ( ! line . startsWith ( 'data:' ) ) continue ;
52
+ const data = line . slice ( 5 ) . trim ( ) ;
53
+ if ( data === '[DONE]' ) break ;
48
54
try {
49
- const jsonStr = line . replace ( 'data: ' , '' ) ;
50
- if ( ! jsonStr . trim ( ) ) continue ;
51
- const data = JSON . parse ( jsonStr ) ;
52
- if ( data . choices ?. [ 0 ] ?. delta ?. reasoning_content !== undefined ) newMessage . reasoning_content += data . choices [ 0 ] . delta . reasoning_content || '' ;
53
- if ( data . choices ?. [ 0 ] ?. delta ?. content !== undefined ) newMessage . content += data . choices [ 0 ] . delta . content || '' ;
54
- if ( onChunk ) onChunk ( newMessage ) ;
55
- } catch { }
55
+ const json = JSON . parse ( data ) ;
56
+ const delta = json ?. choices ?. [ 0 ] ?. delta ;
57
+ if ( delta ?. reasoning_content ) {
58
+ newMessage . reasoning_content += delta . reasoning_content ;
59
+ }
60
+ if ( delta ?. content ) {
61
+ newMessage . content += delta . content ;
62
+ }
63
+ if ( onChunk ) {
64
+ onChunk ( { ...newMessage } ) ;
65
+ }
66
+ } catch ( e ) {
67
+ console . error ( 'Error parsing SSE chunk' , e ) ;
68
+ }
56
69
}
57
70
}
58
71
return newMessage ;
@@ -96,24 +109,37 @@ export async function callBackendAi({ model, messages, signal, onChunk, stream =
96
109
return newMessage ;
97
110
}
98
111
const newMessage = { role : 'assistant' as const , content : '' , reasoning_content : '' , timestamp : new Date ( ) . toISOString ( ) } ;
99
- const reader = response . body ?. getReader ( ) ;
100
- if ( ! reader ) return newMessage ;
112
+ if ( ! response . body ) return newMessage ;
113
+ const reader = response . body . getReader ( ) ;
101
114
const decoder = new TextDecoder ( ) ;
115
+ let buffer = '' ;
102
116
while ( true ) {
103
117
const { done, value } = await reader . read ( ) ;
104
118
if ( done ) break ;
105
- const chunk = decoder . decode ( value ) ;
106
- const lines = chunk . split ( '\n' ) . filter ( l => l . trim ( ) ) ;
107
- for ( const line of lines ) {
108
- if ( line === 'data: [DONE]' ) continue ;
119
+ if ( ! value ) continue ;
120
+ buffer += decoder . decode ( value , { stream : true } ) ;
121
+ let idx ;
122
+ while ( ( idx = buffer . indexOf ( '\n' ) ) >= 0 ) {
123
+ const line = buffer . slice ( 0 , idx ) . trim ( ) ;
124
+ buffer = buffer . slice ( idx + 1 ) ;
125
+ if ( ! line . startsWith ( 'data:' ) ) continue ;
126
+ const data = line . slice ( 5 ) . trim ( ) ;
127
+ if ( data === '[DONE]' ) break ;
109
128
try {
110
- const jsonStr = line . replace ( 'data: ' , '' ) ;
111
- if ( ! jsonStr . trim ( ) ) continue ;
112
- const data = JSON . parse ( jsonStr ) ;
113
- if ( data . choices ?. [ 0 ] ?. delta ?. reasoning_content !== undefined ) newMessage . reasoning_content += data . choices [ 0 ] . delta . reasoning_content || '' ;
114
- if ( data . choices ?. [ 0 ] ?. delta ?. content !== undefined ) newMessage . content += data . choices [ 0 ] . delta . content || '' ;
115
- if ( onChunk ) onChunk ( newMessage ) ;
116
- } catch { }
129
+ const json = JSON . parse ( data ) ;
130
+ const delta = json ?. choices ?. [ 0 ] ?. delta ;
131
+ if ( delta ?. reasoning_content ) {
132
+ newMessage . reasoning_content += delta . reasoning_content ;
133
+ }
134
+ if ( delta ?. content ) {
135
+ newMessage . content += delta . content ;
136
+ }
137
+ if ( onChunk ) {
138
+ onChunk ( { ...newMessage } ) ;
139
+ }
140
+ } catch ( e ) {
141
+ console . error ( 'Error parsing SSE chunk' , e ) ;
142
+ }
117
143
}
118
144
}
119
145
return newMessage ;
0 commit comments