Использование фреймворка Foundation Models для локального ИИ в SwiftUI
Приветствую, Хабр!
На конференции 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:) приложения могут предоставлять динамичные, ориентированные на конфиденциальность пользовательские впечатления.