Приветствую, Хабр!
На конференции WWDC 2025 компания Apple представила фреймворк Foundation Models — набор инструментов, позволяющий разработчикам интегрировать локальные ИИ-модели Apple в свои приложения. По заявлению Apple, эти модели работают полностью на устройстве, не требуют подключения к облаку, не влекут затрат на инференс и ставят во главу угла конфиденциальность пользователей. В этой статье показано, как реализовать фреймворк Foundation Models в приложении на SwiftUI для обработки пользовательских запросов и отображения ответов, сгенерированных ИИ, в реальном времени.
Обзор фреймворка Foundation Models
Фреймворк Foundation Models предоставляет доступ к большой языковой модели Apple, работающей на устройстве и оптимизированной для таких задач, как генерация текста, суммаризация и классификация. Ключевой особенностью является возможность потоковой передачи ответов, что позволяет отображать вывод по мере его генерации моделью. Класс LanguageModelSessionобеспечивает взаимодействие с моделью, поддерживая как пакетные, так и потоковые ответы. Метод streamResponse(to:), используемый в данном примере, постепенно передаёт текстовые фрагменты, обеспечивая динамическое обновление пользовательского интерфейса.
Реализация интерфейса «запрос — ответ»
В следующем примере создаётся приложение на SwiftUI, в котором пользователь может ввести вопрос и получить потоковый ответ от локальной ИИ-модели. Интерфейс включает текстовое поле для ввода, кнопку отправки запроса и прокручиваемую область для отображения ответа. Модификатор glassEffect применяется к текстовому полю для визуального соответствия дизайн-языку iOS 26. Подробнее об этом эффекте можно прочитать
import SwiftUI import FoundationModels struct ContentView: View { @State private var input: String = "" @State private var output: String = "" @State private var inputDisabled: Bool = false var body: some View { NavigationStack { ScrollView { Text(output) } } .safeAreaBar(edge: .bottom) { inputAccessoryView } } private var inputAccessoryView: some View { HStack { TextField("Спросите меня о чём угодно", text: $input) .padding() .glassEffect() Button { sendPrompt() } label: { Image(systemName: "paperplane") .frame(width: 25, height: 25) .rotationEffect(.degrees(40)) } .buttonStyle(.borderedProminent) .controlSize(.mini) .disabled(inputDisabled) .padding(8) } } private func sendPrompt() { Task { guard input.isEmpty == false else { return } do { let session = LanguageModelSession() inputDisabled = true let streamResponse = session.streamResponse(to: input) for try await chunk in streamResponse { self.output = chunk } inputDisabled = false } catch { print(error.localizedDescription) inputDisabled = false } } } }
В этом коде структура ContentView определяет пользовательский интерфейс с ScrollView для отображения ответа ИИ и нижней панелью, содержащей TextField и кнопку отправки. Функция sendPrompt создаёт экземпляр LanguageModelSession и использует метод streamResponse(to:) для обработки пользовательского ввода. По мере генерации текста моделью каждый фрагмент обновляет переменную состояния output, обеспечивая обновление интерфейса в реальном времени. Состояние inputDisabled предотвращает множественные отправки во время обработки.
Особенности реализации
При интеграции фреймворка Foundation Models учитывайте следующее:
Поведение потоковой передачи: Метод
streamResponse(to:)передаёт текст постепенно, что подходит для приложений реального времени, но требует тщательного управления состоянием для обеспечения плавного обновления интерфейса.Соблюдение конфиденциальности: Поскольку модель работает на устройстве, пользовательские данные не передаются на внешние серверы.
Совместимость с платформами: Фреймворк доступен на iOS 26, macOS 26, tvOS 26 и watchOS 26.
Заключение
Фреймворк Foundation Models позволяет разработчикам внедрять возможности локального ИИ в приложения на SwiftUI, поддерживая такие функции, как генерация текста в реальном времени с минимальными настройками. Благодаря использованию streamResponse(to:) приложения могут предоставлять динамичные, ориентированные на конфиденциальность пользовательские впечатления.
