@@ -148,24 +148,19 @@ extension Agent {
148148 client: client, toolDefinitions: toolDefinitions, configuration: configuration
149149 )
150150 var budgetPhase = try makeBudgetPhase ( )
151+ var historyWasRewrittenLocally = false
151152
152153 for iteration in 1 ... configuration. maxIterations {
153154 try Task . checkCancellation ( )
154155
155- await compactor. compactOrTruncateIfNeeded (
156- & messages, lastTotalTokens: lastTotalTokens, totalUsage: & totalUsage
157- )
158- let response = try await client. generate (
159- messages: messages,
160- tools: toolDefinitions,
161- responseFormat: nil ,
156+ let response = try await executeRunIteration (
157+ messages: & messages,
158+ totalUsage: & totalUsage,
159+ lastTotalTokens: & lastTotalTokens,
160+ compactor: & compactor,
161+ historyWasRewrittenLocally: & historyWasRewrittenLocally,
162162 requestContext: options. requestContext
163163 )
164- messages. append ( . assistant( response) )
165- if let usage = response. tokenUsage {
166- totalUsage += usage
167- lastTotalTokens = usage. total
168- }
169164 let budgetUsage = try requireBudgetUsage ( response. tokenUsage, budgetPhase: budgetPhase)
170165
171166 if let finishCall = response. toolCalls. first ( where: { $0. name == " finish " } ) {
@@ -189,7 +184,13 @@ extension Agent {
189184 let pruneCalls = response. toolCalls. filter { $0. name == " prune_context " }
190185 let regularCalls = response. toolCalls. filter { $0. name != " finish " && $0. name != " prune_context " }
191186
192- executePruneCalls ( pruneCalls, messages: & messages)
187+ let pruneRewroteHistory = executePruneCalls (
188+ pruneCalls,
189+ messages: & messages
190+ )
191+ if pruneRewroteHistory {
192+ historyWasRewrittenLocally = true
193+ }
193194 try await executeAndAppendResults (
194195 regularCalls, context: context, messages: & messages,
195196 approvalHandler: options. approvalHandler, allowlist: & sessionAllowlist
@@ -281,10 +282,14 @@ extension Agent {
281282 for iterationNumber in 1 ... configuration. maxIterations {
282283 try Task . checkCancellation ( )
283284
284- let compacted = await compactor. compactOrTruncateIfNeeded (
285+ let compactionOutcome = await compactor. compactOrTruncateIfNeeded (
285286 & messages, lastTotalTokens: lastTotalTokens, totalUsage: & totalUsage
286287 )
287- emitCompactionEventIfNeeded ( compacted, lastTotalTokens: lastTotalTokens, continuation: continuation)
288+ emitCompactionEventIfNeeded (
289+ compactionOutcome. emitsCompactionEvent,
290+ lastTotalTokens: lastTotalTokens,
291+ continuation: continuation
292+ )
288293 let iteration = try await processor. process (
289294 messages: messages, totalUsage: & totalUsage, continuation: continuation,
290295 requestContext: options. requestContext
@@ -376,28 +381,6 @@ extension Agent {
376381 )
377382 }
378383
379- func parseFinishResult(
380- _ call: ToolCall ,
381- tokenUsage: TokenUsage ,
382- iterations: Int ,
383- history: [ ChatMessage ]
384- ) throws -> AgentResult {
385- let data = call. argumentsData
386- let decoded : FinishArguments
387- do {
388- decoded = try JSONDecoder ( ) . decode ( FinishArguments . self, from: data)
389- } catch {
390- throw AgentError . finishDecodingFailed ( message: String ( describing: error) )
391- }
392- return AgentResult (
393- finishReason: FinishReason ( decoded. reason ?? " completed " ) ,
394- content: decoded. content,
395- totalTokenUsage: tokenUsage,
396- iterations: iterations,
397- history: history
398- )
399- }
400-
401384 private func makeFinishedEvent(
402385 tokenUsage: TokenUsage ,
403386 content: String ? ,
@@ -412,21 +395,6 @@ extension Agent {
412395 ) )
413396 }
414397
415- private func makeTerminalResult(
416- reason: FinishReason ,
417- tokenUsage: TokenUsage ,
418- iterations: Int ,
419- history: [ ChatMessage ]
420- ) -> AgentResult {
421- AgentResult (
422- finishReason: reason,
423- content: nil ,
424- totalTokenUsage: tokenUsage,
425- iterations: iterations,
426- history: history
427- )
428- }
429-
430398 private func emitCompactionEventIfNeeded(
431399 _ compacted: Bool ,
432400 lastTotalTokens: Int ? ,
0 commit comments