@@ -582,6 +582,19 @@ export async function executeOpenAIRequest(
582582 }
583583
584584 const apiBody = JSON . stringify ( requestBody ) ;
585+
586+ // DEBUG: dump messages 结构(仅 GLM 时输出)
587+ if ( state . currentConfig . provider === 'glm' ) {
588+ for ( let mi = 0 ; mi < messages . length ; mi ++ ) {
589+ const m = messages [ mi ] ;
590+ const keys = Object . keys ( m || { } ) . join ( ',' ) ;
591+ const contentType = m ?. content === null ? 'null' : typeof m ?. content ;
592+ const hasToolCalls = Array . isArray ( m ?. tool_calls ) ? m . tool_calls . length : 0 ;
593+ const hasReasoning = m ?. reasoning_content ? 'yes' : 'no' ;
594+ log ( `[GLM-DEBUG] msg[${ mi } ] role=${ m ?. role } keys=[${ keys } ] content=${ contentType } (${ String ( m ?. content ) . substring ( 0 , 50 ) } ) tool_calls=${ hasToolCalls } reasoning=${ hasReasoning } ` ) ;
595+ }
596+ }
597+
585598 const url = new URL ( resolvedEndpoint ) ;
586599 const headers : any = {
587600 'Content-Type' : 'application/json' ,
@@ -1071,22 +1084,29 @@ export async function forwardToOpenAIStream(augmentReq: any, res: any) {
10711084 const assistantReplay = splitReasoningContentFromText ( result . text ) ;
10721085 const assistantReplayMessage : any = {
10731086 role : 'assistant' ,
1074- content : assistantReplay . content || null ,
1087+ content : assistantReplay . content || '' ,
10751088 tool_calls : assistantToolCallsMsg
10761089 } ;
1077- if ( assistantReplay . reasoningContent ) {
1090+ // reasoning_content 只有部分 provider 支持回传(DeepSeek/Kimi)
1091+ // GLM 不支持,会导致 "messages 参数非法" 400 错误
1092+ const supportsReasoningReplay = [ 'deepseek' , 'kimi' ] . includes ( state . currentConfig . provider ) ;
1093+ if ( assistantReplay . reasoningContent && supportsReasoningReplay ) {
10781094 assistantReplayMessage . reasoning_content = assistantReplay . reasoningContent ;
10791095 }
10801096 currentMessages . push ( assistantReplayMessage ) ;
10811097
10821098 // 2. 添加拦截工具的执行结果作为 tool message
10831099 for ( const { tc, toolNode } of interceptedTools ) {
1084- currentMessages . push ( {
1100+ const toolMsg : any = {
10851101 role : 'tool' ,
10861102 tool_call_id : tc . id ,
1087- name : tc . name ,
10881103 content : toolNode . tool_result_node . content
1089- } ) ;
1104+ } ;
1105+ // GLM 不支持 tool 消息中的 name 字段
1106+ if ( state . currentConfig . provider !== 'glm' ) {
1107+ toolMsg . name = tc . name ;
1108+ }
1109+ currentMessages . push ( toolMsg ) ;
10901110 // 流式显示执行状态和 diff 给用户
10911111 try {
10921112 const resultObj = JSON . parse ( toolNode . tool_result_node . content ) ;
@@ -1103,7 +1123,11 @@ export async function forwardToOpenAIStream(augmentReq: any, res: any) {
11031123 // 3. 同时处理 codebase_search(如果有)
11041124 for ( const cs of codebaseSearchCalls ) {
11051125 const searchResult = await executeRAGSearch ( cs . query ) ;
1106- currentMessages . push ( { role : 'tool' , tool_call_id : cs . id , name : 'codebase_search' , content : searchResult } ) ;
1126+ const csMsg : any = { role : 'tool' , tool_call_id : cs . id , content : searchResult } ;
1127+ if ( state . currentConfig . provider !== 'glm' ) {
1128+ csMsg . name = 'codebase_search' ;
1129+ }
1130+ currentMessages . push ( csMsg ) ;
11071131 res . write ( JSON . stringify ( {
11081132 text : `\n📚 **代码库搜索** ("${ cs . query . substring ( 0 , 30 ) } ...")\n` ,
11091133 nodes : [ ] , stop_reason : 0
@@ -1149,17 +1173,22 @@ export async function forwardToOpenAIStream(augmentReq: any, res: any) {
11491173 const assistantReplay = splitReasoningContentFromText ( result . text ) ;
11501174 const assistantReplayMessage : any = {
11511175 role : 'assistant' ,
1152- content : assistantReplay . content || null ,
1176+ content : assistantReplay . content || '' ,
11531177 tool_calls : toolCallsForMsg
11541178 } ;
1155- if ( assistantReplay . reasoningContent ) {
1179+ const supportsReasoningReplay2 = [ 'deepseek' , 'kimi' ] . includes ( state . currentConfig . provider ) ;
1180+ if ( assistantReplay . reasoningContent && supportsReasoningReplay2 ) {
11561181 assistantReplayMessage . reasoning_content = assistantReplay . reasoningContent ;
11571182 }
11581183 currentMessages . push ( assistantReplayMessage ) ;
11591184
11601185 for ( const cs of codebaseSearchCalls ) {
11611186 const searchResult = await executeRAGSearch ( cs . query ) ;
1162- currentMessages . push ( { role : 'tool' , tool_call_id : cs . id , name : 'codebase_search' , content : searchResult } ) ;
1187+ const csMsg2 : any = { role : 'tool' , tool_call_id : cs . id , content : searchResult } ;
1188+ if ( state . currentConfig . provider !== 'glm' ) {
1189+ csMsg2 . name = 'codebase_search' ;
1190+ }
1191+ currentMessages . push ( csMsg2 ) ;
11631192 res . write ( JSON . stringify ( {
11641193 text : `\n\n🔍 **代码库搜索** (查询: "${ cs . query } ")\n${ searchResult . split ( '\n' ) . slice ( 0 , 5 ) . join ( '\n' ) } ...\n\n` ,
11651194 nodes : [ ] , stop_reason : 0
0 commit comments