Retour à l'accueil

Foundation Models dans SwiftUI : IA locale

Le framework Foundation Models permet d'intégrer les modèles de langage locaux d'Apple dans les applications SwiftUI avec génération de réponses en streaming. L'exemple implémente une interface de chat avec inférence sur l'appareil, garantissant la confidentialité et une faible latence. Prise en charge pour iOS 26+ et versions supérieures.

SwiftUI + Foundation Models : IA en temps réel localement
Advertisement 728x90

IA Locale dans SwiftUI : Intégration de Modèles de Fondation avec Diffusion en Continu

Le framework Foundation Models d'Apple permet d'intégrer des modèles linguistiques locaux dans des applications SwiftUI. Ces modèles effectuent la génération de texte, la synthèse et la classification entièrement sur l'appareil, éliminant ainsi le besoin de requêtes cloud. La classe LanguageModelSession facilite les réponses en continu via la méthode streamResponse(to:), essentielle pour des interfaces réactives.

L'implémentation se concentre sur le traitement en temps réel des requêtes utilisateur : saisie de texte, soumission de l'invite et mises à jour dynamiques de la sortie au fur et à mesure que le modèle génère des morceaux de texte.

Structure de l'Interface pour une Interaction de Chat

L'application est construite autour d'un NavigationStack avec un ScrollView pour les réponses de l'IA et un panneau de saisie en bas. Un TextField avec le modificateur glassEffect s'aligne sur iOS 26. Le bouton d'envoi déclenche une tâche asynchrone, empêchant les requêtes en double via l'état inputDisabled.

Google AdInline article slot

Exemple de code complet :

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("Posez-moi une question", 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
            }
        }
    }
}

Mécanisme de Génération en Continu

La méthode streamResponse(to:) renvoie une séquence asynchrone de morceaux de texte. La boucle for try await chunk in streamResponse met à jour la variable @State var output à chaque étape, déclenchant des re-rendus SwiftUI. Cela garantit une expérience utilisateur fluide sans bloquer les opérations de l'interface.

La gestion des erreurs est implémentée via do-catch : si une session échoue, localizedDescription est imprimé et le champ de saisie est réactivé.

Google AdInline article slot

Aspects Clés de l'Intégration

  • Diffusion en continu : Les morceaux sont générés de manière incrémentielle, adaptés aux réponses longues ; nécessite une gestion précise de l'état pour éviter les conditions de concurrence.
  • Confidentialité : Tous les calculs sont effectués sur l'appareil, les données ne quittant jamais l'appareil.
  • Support des Plateformes : iOS 26+, macOS 26+, tvOS 26+, watchOS 26+.

Ce qui est Important

  • LanguageModelSession est la classe principale pour les sessions de LLM locales avec support par lots et en continu.
  • streamResponse(to:) minimise la latence de l'interface grâce à des mises à jour incrémentielles.
  • L'inférence sur l'appareil élimine les délais réseau et les coûts d'API.
  • SwiftUI @State + Task permettent la concurrence sans GCD.
  • glassEffect est un modificateur natif pour le glassmorphisme d'iOS 26.

Optimisation des Performances

Pour les développeurs intermédiaires/seniors : surveillez l'empreinte mémoire de la session—chaque LanguageModelSession charge un modèle en RAM. Envisagez le pooling de sessions ou la réutilisation d'instances. Testez sur des appareils avec Neural Engine (A17+ ou M3+). La diffusion en continu réduit l'utilisation maximale du CPU mais augmente la durée par rapport au mode par lots.

En production, ajoutez un anti-rebond sur la saisie, un contexte d'historique et des solutions de repli pour les appareils peu performants.

— Editorial Team

Google AdInline article slot
Advertisement 728x90

Lire ensuite