Приветствую, Хабр!

На конференции 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:) приложения могут предоставлять динамичные, ориентированные на конфиденциальность пользовательские впечатления.