@@ -591,8 +591,11 @@ export async function executeOpenAIRequest(
591591 const contentType = m ?. content === null ? 'null' : typeof m ?. content ;
592592 const hasToolCalls = Array . isArray ( m ?. tool_calls ) ? m . tool_calls . length : 0 ;
593593 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 } ` ) ;
594+ const tcIds = Array . isArray ( m ?. tool_calls ) ? m . tool_calls . map ( ( tc : any ) => `${ tc ?. function ?. name } :${ tc ?. id } ` ) . join ( ', ' ) : '' ;
595+ const toolCallId = m ?. tool_call_id || '' ;
596+ log ( `[GLM-DEBUG] msg[${ mi } ] role=${ m ?. role } keys=[${ keys } ] content=${ contentType } (${ String ( m ?. content ) . substring ( 0 , 80 ) } ) tool_calls=${ hasToolCalls } [${ tcIds } ] tool_call_id=${ toolCallId } reasoning=${ hasReasoning } ` ) ;
595597 }
598+ log ( `[GLM-DEBUG] Full request body (first 2000 chars): ${ apiBody . substring ( 0 , 2000 ) } ` ) ;
596599 }
597600
598601 const url = new URL ( resolvedEndpoint ) ;
@@ -1069,6 +1072,39 @@ export async function forwardToOpenAIStream(augmentReq: any, res: any) {
10691072 }
10701073
10711074 // ✅ 所有工具都被拦截了 → 把结果送回 AI 继续生成
1075+ // GLM: 折叠为纯文本格式(不支持 tool calling 多轮回放)
1076+ if ( state . currentConfig . provider === 'glm' ) {
1077+ const toolSummary = [ ...interceptedTools . map ( ( { tc, toolNode } ) => {
1078+ const content = ( toolNode . tool_result_node . content || '' ) . substring ( 0 , 2000 ) ;
1079+ return `[Result of ${ tc . name } ]: ${ content } ` ;
1080+ } ) , ...await Promise . all ( codebaseSearchCalls . map ( async ( cs : any ) => {
1081+ const searchResult = await executeRAGSearch ( cs . query ) ;
1082+ return `[Result of codebase_search("${ cs . query } ")]: ${ searchResult . substring ( 0 , 2000 ) } ` ;
1083+ } ) ) ] . join ( '\n\n' ) ;
1084+
1085+ const textPart = result . text ? splitReasoningContentFromText ( result . text ) . content || '' : '' ;
1086+ const callsSummary = [ ...otherToolCalls , ...codebaseSearchCalls . map ( ( cs : any ) => ( {
1087+ name : 'codebase_search' , arguments : JSON . stringify ( { query : cs . query } )
1088+ } ) ) ] . map ( ( tc : any ) => `[Called ${ tc . name } (${ ( typeof tc . arguments === 'string' ? tc . arguments : JSON . stringify ( tc . arguments || { } ) ) . substring ( 0 , 200 ) } )]` ) . join ( '\n' ) ;
1089+
1090+ currentMessages . push ( { role : 'assistant' , content : ( textPart + '\n' + callsSummary ) . trim ( ) } ) ;
1091+ currentMessages . push ( { role : 'user' , content : toolSummary } ) ;
1092+
1093+ // 流式显示
1094+ for ( const { tc, toolNode } of interceptedTools ) {
1095+ try {
1096+ const resultObj = JSON . parse ( toolNode . tool_result_node . content ) ;
1097+ const diffText = renderDiffText ( resultObj , tc . name ) ;
1098+ res . write ( JSON . stringify ( { text : diffText , nodes : [ ] , stop_reason : 0 } ) + '\n' ) ;
1099+ } catch {
1100+ res . write ( JSON . stringify ( { text : `\n✅ ${ tc . name } executed\n` , nodes : [ ] , stop_reason : 0 } ) + '\n' ) ;
1101+ }
1102+ }
1103+
1104+ log ( `[LOOP] GLM: folded ${ interceptedTools . length } tools + ${ codebaseSearchCalls . length } searches into text messages` ) ;
1105+ continue ;
1106+ }
1107+
10721108 // 1. 构建 assistant message(包含 tool_calls)
10731109 const allToolCalls = [ ...otherToolCalls , ...codebaseSearchCalls . map ( ( cs : any ) => ( {
10741110 id : cs . id , name : 'codebase_search' , arguments : JSON . stringify ( { query : cs . query } )
@@ -1084,7 +1120,7 @@ export async function forwardToOpenAIStream(augmentReq: any, res: any) {
10841120 const assistantReplay = splitReasoningContentFromText ( result . text ) ;
10851121 const assistantReplayMessage : any = {
10861122 role : 'assistant' ,
1087- content : assistantReplay . content || '' ,
1123+ content : assistantReplay . content || null ,
10881124 tool_calls : assistantToolCallsMsg
10891125 } ;
10901126 // reasoning_content 只有部分 provider 支持回传(DeepSeek/Kimi)
0 commit comments