diff --git a/Sources/AnyLanguageModel/Models/SystemLanguageModel.swift b/Sources/AnyLanguageModel/Models/SystemLanguageModel.swift index ff2e8f25..10cf4b30 100644 --- a/Sources/AnyLanguageModel/Models/SystemLanguageModel.swift +++ b/Sources/AnyLanguageModel/Models/SystemLanguageModel.swift @@ -78,7 +78,7 @@ let fmSession = FoundationModels.LanguageModelSession( model: systemModel, tools: session.tools.toFoundationModels(), - transcript: session.transcript.toFoundationModels( + transcript: fmTranscriptDroppingDuplicatePrompt(session.transcript, prompt: prompt).toFoundationModels( instructions: session.instructions, toolDefinitions: session.tools .filter(\.includesSchemaInInstructions) @@ -159,7 +159,7 @@ let fmSession = FoundationModels.LanguageModelSession( model: systemModel, tools: session.tools.toFoundationModels(), - transcript: session.transcript.toFoundationModels( + transcript: fmTranscriptDroppingDuplicatePrompt(session.transcript, prompt: prompt).toFoundationModels( instructions: session.instructions, toolDefinitions: session.tools .filter(\.includesSchemaInInstructions) @@ -367,6 +367,21 @@ // MARK: - Helpers + @available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, visionOS 26.0, *) + func fmTranscriptDroppingDuplicatePrompt(_ transcript: Transcript, prompt: Prompt) -> Transcript { + guard let lastEntry = transcript.last, case .prompt(let lastPrompt) = lastEntry else { + return transcript + } + let lastText = lastPrompt.segments.compactMap { segment -> String? in + if case .text(let textSegment) = segment { return textSegment.content } + return nil + }.joined() + guard lastText == prompt.description else { + return transcript + } + return Transcript(entries: transcript.dropLast()) + } + @available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, visionOS 26.0, *) extension Prompt { fileprivate func toFoundationModels() -> FoundationModels.Prompt {