@@ -110,7 +110,8 @@ public async Task<IEnumerable<ChatMessage>> ReduceAsync(
110110 ArchiveResult ? archiveResult = null ;
111111
112112 List < ChatMessage > allMessages = [ .. OldWorkingMemoryContent , .. conversationMessages ] ;
113- if ( allMessages . Sum ( x => x . Contents . Count ( ) ) > _resetThreshold )
113+ var messageText = ConvertMessagesToText ( allMessages ) . Replace ( " " , "" ) ;
114+ if ( messageText . Length > 200000 )
114115 {
115116 // 进入裁剪,清空累积的工作记忆
116117 OldWorkingMemoryContent . Clear ( ) ;
@@ -181,6 +182,44 @@ public async Task<IEnumerable<ChatMessage>> ReduceAsync(
181182 return result ;
182183 }
183184
185+ private string ConvertMessagesToText ( IEnumerable < ChatMessage > messages )
186+ {
187+ var sb = new StringBuilder ( ) ;
188+ foreach ( var msg in messages )
189+ {
190+ if ( msg . Role == ChatRole . User )
191+ {
192+ var text = string . Join ( "" , msg . Contents . OfType < TextContent > ( )
193+ . Where ( t => ! string . IsNullOrWhiteSpace ( t . Text ) )
194+ . Select ( t => t . Text . Trim ( ) ) ) ;
195+ if ( ! string . IsNullOrWhiteSpace ( text ) )
196+ sb . Append ( $ "### 用户\n \n { text } \n \n ") ;
197+ continue ;
198+ }
199+
200+ foreach ( var content in msg . Contents )
201+ {
202+ switch ( content )
203+ {
204+ case TextContent text when ! string . IsNullOrWhiteSpace ( text . Text ) :
205+ sb . Append ( $ "### 助手\n \n { text . Text . Trim ( ) } \n \n ") ;
206+ break ;
207+ case FunctionCallContent call :
208+ var args = call . Arguments is not null
209+ ? JsonSerializer . Serialize ( call . Arguments )
210+ : "" ;
211+ sb . Append ( $ "#### 工具调用: { call . Name } \n \n 参数: `{ args } `\n \n ") ;
212+ break ;
213+ case FunctionResultContent result :
214+ var resultText = result . Result ? . ToString ( ) ?? "" ;
215+ sb . Append ( $ "<details>\n <summary>执行结果</summary>\n \n ```\n { resultText } \n ```\n \n </details>\n \n ") ;
216+ break ;
217+ }
218+ }
219+ }
220+ return sb . ToString ( ) ;
221+ }
222+
184223 private async Task SaveHistoryFileAsync (
185224 IReadOnlyList < ChatMessage > messages ,
186225 CancellationToken cancellationToken )
@@ -196,39 +235,7 @@ private async Task SaveHistoryFileAsync(
196235
197236 var sb = new StringBuilder ( ) ;
198237 sb . Append ( $ "# 对话历史 { DateTime . Now : yyyy-MM-dd HH:mm:ss} \n \n ") ;
199-
200- foreach ( var msg in messages )
201- {
202- if ( msg . Role == ChatRole . User )
203- {
204- var text = string . Join ( "" , msg . Contents . OfType < TextContent > ( )
205- . Where ( t => ! string . IsNullOrWhiteSpace ( t . Text ) )
206- . Select ( t => t . Text . Trim ( ) ) ) ;
207- if ( ! string . IsNullOrWhiteSpace ( text ) )
208- sb . Append ( $ "### 用户\n \n { text } \n \n ") ;
209- continue ;
210- }
211-
212- foreach ( var content in msg . Contents )
213- {
214- switch ( content )
215- {
216- case TextContent text when ! string . IsNullOrWhiteSpace ( text . Text ) :
217- sb . Append ( $ "### 助手\n \n { text . Text . Trim ( ) } \n \n ") ;
218- break ;
219- case FunctionCallContent call :
220- var args = call . Arguments is not null
221- ? JsonSerializer . Serialize ( call . Arguments )
222- : "" ;
223- sb . Append ( $ "#### 工具调用: { call . Name } \n \n 参数: `{ args } `\n \n ") ;
224- break ;
225- case FunctionResultContent result :
226- var resultText = result . Result ? . ToString ( ) ?? "" ;
227- sb . Append ( $ "<details>\n <summary>执行结果</summary>\n \n ```\n { resultText } \n ```\n \n </details>\n \n ") ;
228- break ;
229- }
230- }
231- }
238+ sb . Append ( ConvertMessagesToText ( messages ) ) ;
232239
233240 await File . WriteAllTextAsync ( filePath , sb . ToString ( ) , cancellationToken ) ;
234241 AppLogger . Log ( $ "[Archive] 已保存历史文件: { fileName } ({ messages . Count } 条消息)") ;
0 commit comments