From 41fce75aeffae6d13dc699f39348977771fa9b02 Mon Sep 17 00:00:00 2001 From: Phillip Robertson Date: Wed, 8 Apr 2026 14:00:03 -0400 Subject: [PATCH 1/2] Add appendTranscriptEntry to LanguageModelSession to allow manual KV-safe transcript updates --- Sources/AnyLanguageModel/LanguageModelSession.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Sources/AnyLanguageModel/LanguageModelSession.swift b/Sources/AnyLanguageModel/LanguageModelSession.swift index ba38550..c24406c 100644 --- a/Sources/AnyLanguageModel/LanguageModelSession.swift +++ b/Sources/AnyLanguageModel/LanguageModelSession.swift @@ -278,6 +278,18 @@ public final class LanguageModelSession: @unchecked Sendable { } } +// MARK: - Transcript Manipulation + +extension LanguageModelSession { + /// Allows manual injection of Transcript entries to resume dropped sessions + /// without busting the MLX ObjectIdentifier KV-cache. + public func appendTranscriptEntry(_ entry: Transcript.Entry) { + withMutation(keyPath: \.transcript) { + state.withLock { $0.transcript.append(entry) } + } + } +} + // MARK: - String Response Convenience Methods extension LanguageModelSession { From 4eaec2b8f3395e49845c0fddd3800c261e478f70 Mon Sep 17 00:00:00 2001 From: Phillip Robertson Date: Wed, 8 Apr 2026 14:13:42 -0400 Subject: [PATCH 2/2] Yield session gracefully after natively executing tools --- Sources/AnyLanguageModel/Models/MLXLanguageModel.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Sources/AnyLanguageModel/Models/MLXLanguageModel.swift b/Sources/AnyLanguageModel/Models/MLXLanguageModel.swift index 0ef37ef..33eb62d 100644 --- a/Sources/AnyLanguageModel/Models/MLXLanguageModel.swift +++ b/Sources/AnyLanguageModel/Models/MLXLanguageModel.swift @@ -1010,8 +1010,12 @@ import Foundation chat.append(.tool(toolResultJSON)) } - // Continue loop to generate with tool results - continue + // Return response with appended tool outputs rather than looping to regenerate + return LanguageModelSession.Response( + content: assistantText as! Content, + rawContent: GeneratedContent(assistantText), + transcriptEntries: ArraySlice(allEntries) + ) } } }