import Dispatch import Foundation import FoundationModels @available(macOS 26.0, *) @Generable private struct CleanedTranscript: Sendable { let cleanedText: String } // MARK: - Swift implementation for Apple LLM integration // This file is compiled via Cargo build script for Apple Silicon targets private typealias ResponsePointer = UnsafeMutablePointer private func duplicateCString(_ text: String) -> UnsafeMutablePointer? { return text.withCString { basePointer in guard let duplicated = strdup(basePointer) else { return nil } return duplicated } } private func truncatedText(_ text: String, limit: Int) -> String { guard limit > 0 else { return text } let words = text.split( maxSplits: .max, omittingEmptySubsequences: true, whereSeparator: { $0.isWhitespace || $0.isNewline } ) if words.count <= limit { return text } return words.prefix(limit).joined(separator: " ") } @_cdecl("is_apple_intelligence_available") public func isAppleIntelligenceAvailable() -> Int32 { guard #available(macOS 26.0, *) else { return 0 } let model = SystemLanguageModel.default switch model.availability { case .available: return 1 case .unavailable: return 0 } } @_cdecl("process_text_with_apple_llm") public func processTextWithAppleLLM( _ prompt: UnsafePointer, maxTokens: Int32 ) -> UnsafeMutablePointer { let swiftPrompt = String(cString: prompt) let responsePtr = ResponsePointer.allocate(capacity: 1) responsePtr.initialize(to: AppleLLMResponse(response: nil, success: 0, error_message: nil)) guard #available(macOS 26.0, *) else { responsePtr.pointee.error_message = duplicateCString( "Apple Intelligence requires macOS 26 or newer." ) return responsePtr } let model = SystemLanguageModel.default guard model.availability == .available else { responsePtr.pointee.error_message = duplicateCString( "Apple Intelligence is not currently available on this device." ) return responsePtr } let tokenLimit = max(0, Int(maxTokens)) let semaphore = DispatchSemaphore(value: 0) // Thread-safe container to pass results from async task back to calling thread final class ResultBox: @unchecked Sendable { var response: String? var error: String? } let box = ResultBox() Task.detached(priority: .userInitiated) { defer { semaphore.signal() } do { let session = LanguageModelSession(model: model) var output: String do { let structured = try await session.respond( to: swiftPrompt, generating: CleanedTranscript.self ) output = structured.content.cleanedText } catch { let fallbackGeneration = try await session.respond(to: swiftPrompt) output = fallbackGeneration.content } if tokenLimit > 0 { output = truncatedText(output, limit: tokenLimit) } box.response = output } catch { box.error = error.localizedDescription } } semaphore.wait() // Write to responsePtr on the calling thread after task completes if let response = box.response { responsePtr.pointee.response = duplicateCString(response) responsePtr.pointee.success = 1 } else { responsePtr.pointee.error_message = duplicateCString(box.error ?? "Unknown error") } return responsePtr } @_cdecl("free_apple_llm_response") public func freeAppleLLMResponse(_ response: UnsafeMutablePointer?) { guard let response = response else { return } if let responseStr = response.pointee.response { free(UnsafeMutablePointer(mutating: responseStr)) } if let errorStr = response.pointee.error_message { free(UnsafeMutablePointer(mutating: errorStr)) } response.deallocate() }