@@ -142,6 +142,35 @@ export async function processDeepSeekResponse(
142142 return { chunkResponse, finishReason } ;
143143}
144144
145+ function fixMessages ( messages : OpenAI . ChatCompletionMessageParam [ ] ) : OpenAI . ChatCompletionMessageParam [ ] {
146+ const result = [ ...messages ] ; // Create a copy to avoid mutating the original
147+ let i = 0 ;
148+
149+ // Traverse the array, but check length dynamically since we may insert elements
150+ while ( i < result . length - 1 ) {
151+ const current = result [ i ] ;
152+ const next = result [ i + 1 ] ;
153+
154+ // Check if current and next have the same role
155+ if ( current . role === next . role ) {
156+ // Insert the opposite role with content "ok"
157+ const newMessage : OpenAI . ChatCompletionMessageParam = {
158+ role : current . role === 'user' ? 'assistant' : 'user' ,
159+ content : 'ok'
160+ } ;
161+ // Insert at index i + 1
162+ result . splice ( i + 1 , 0 , newMessage ) ;
163+ // Move to the next pair, since we just inserted
164+ i += 2 ;
165+ } else {
166+ // Move to the next message if no insertion is needed
167+ i += 1 ;
168+ }
169+ }
170+
171+ return result ;
172+ }
173+
145174/**
146175 * 调用 DeepSeek API,支持 Function Calling
147176 * @param userContent 用户输入内容,可以是字符串或消息数组
@@ -194,39 +223,39 @@ export async function callDeepSeekApi(
194223 let maxToken = 1024 * 8 ;
195224 let temperature = 0 ;
196225
197- let systemPromot : OpenAI . ChatCompletionMessageParam = { role : "system" , content : systemContent } ;
198-
199- if ( / r 1 | r e a s o n e r / i. test ( modelName ) ) {
226+ const isR1Mode = / r 1 | r e a s o n e r / i. test ( modelName ) ;
227+ if ( isR1Mode ) {
200228 temperature = 0.6 ;
201- systemPromot = { role : "user" , content : systemContent } ;
202229 }
203230
204- // 构造消息体
231+ // 构造消息体,先将所有内容放入 messages_body
205232 let messages_body : OpenAI . ChatCompletionMessageParam [ ] = [ ] ;
206- if ( Array . isArray ( userContent ) ) {
207- if ( systemPromot . role === 'user' ) {
208- userContent [ 0 ] . content = systemPromot . content + "\n\n" + userContent [ 0 ] . content ;
209- }
210- else {
211- messages_body . push ( systemPromot ) ;
212- }
213233
214- const role = ( userContent [ 0 ] . role === 'user' ) ? 'user' : 'assistant' ;
215- messages_body . push ( { role, content : userContent [ 0 ] . content } ) ;
234+ // 将 userContent 转换为数组并加入 messages_body
235+ const userContentArray = typeof userContent === 'string'
236+ ? [ { role : 'user' , content : userContent } ]
237+ : userContent ;
238+ for ( const msg of userContentArray ) {
239+ const role = msg . role === 'user' ? 'user' : 'assistant' ;
240+ messages_body . push ( { role, content : msg . content } ) ;
241+ }
216242
217- // 如果 userContent 是数组,按交替方式生成消息
218- for ( let i = 1 ; i < userContent . length ; i ++ ) {
219- const role = ( userContent [ i ] . role === 'user' ) ? 'user' : 'assistant' ;
220- messages_body . push ( { role, content : userContent [ i ] . content } ) ;
243+ if ( messages_body . length > 0 ) {
244+ if ( messages_body [ 0 ] . role === 'user' ) {
245+ messages_body [ 0 ] . content = ( messages_body [ 0 ] . content as string ) . replace ( / < s y s t e m > .* ?< \/ s y s t e m > / gs, '' ) ; // 替换 <system> 标签为空串
246+ } else {
247+ messages_body . shift ( ) ; // 移除头部系统消息
221248 }
222- }
223- else {
224- if ( systemPromot . role === 'user' ) { userContent = systemPromot . content + "\n\n" + userContent ; }
225- else { messages_body . push ( systemPromot ) ; }
249+ }
226250
227- // 如果是单个字符串,默认是 'user' 角色
228- messages_body . push ( { role : 'user' , content : userContent } ) ;
251+ if ( isR1Mode ) {
252+ messages_body [ 0 ] . content = `<system> ${ systemContent } </system>` + messages_body [ 0 ] . content ;
229253 }
254+ else {
255+ messages_body . unshift ( { role : 'system' , content : `<system>${ systemContent } </system>` } ) ;
256+ }
257+
258+ messages_body = fixMessages ( messages_body ) ;
230259
231260 vscode . window . showInformationMessage ( '开始上传DeepSeek API' ) ;
232261
0 commit comments