Foundation Models : L'IA On-Device d'Apple pour les Développeurs

Avec iOS 26, Apple ouvre enfin les portes de son modèle de langage embarqué aux développeurs tiers. Le Framework Foundation Models permet d'intégrer des capacités d'intelligence artificielle directement dans vos applications, sans serveur distant, sans coût d'inférence, et avec une confidentialité totale des données utilisateur.

Ce guide explore en profondeur cette nouvelle API : de la simple génération de texte jusqu'aux architectures complexes avec Tool Calling, en passant par la génération guidée type-safe qui fait la force de ce framework.

Ce que vous allez apprendre

Cet article couvre l'ensemble du Framework Foundation Models :

    • Configuration et vérification de la disponibilité du modèle
    • Sessions de langage et génération de texte
    • Génération guidée avec les macros @Generable et @Guide
    • Tool Calling pour étendre les capacités du modèle
    • Gestion des erreurs et des guardrails de sécurité
    • Construction d'un assistant conversationnel complet en SwiftUI

Prérequis et compatibilité

Appareils supportés

Le Framework Foundation Models s'appuie sur Apple Intelligence, disponible uniquement sur les appareils équipés d'une Neural Engine suffisamment puissante :

Plateforme Appareils compatibles
iPhone iPhone 15 Pro et ultérieurs
iPad iPad avec puce M1 et ultérieurs
Mac Mac avec Apple Silicon (M1+)
Vision Pro Tous les modèles

Configuration requise

Trois conditions doivent être réunies pour utiliser le framework :

Le modèle (~3 milliards de paramètres) pèse environ 3 Go et se télécharge automatiquement après l'activation d'Apple Intelligence. Ce téléchargement s'effectue en arrière-plan et peut prendre plusieurs minutes selon la connexion.

Premiers pas : LanguageModelSession

Session simple

La classe LanguageModelSession est le point d'entrée principal du framework. Elle gère la communication avec le modèle et maintient l'historique de la conversation :

Cette approche attend que le modèle génère l'intégralité de sa réponse avant de la retourner. Pour des réponses longues, l'utilisateur peut avoir l'impression que l'application ne répond plus.

Streaming des réponses

Pour une expérience utilisateur fluide, utilisez streamResponse qui retourne un AsyncThrowingStream :

Le streaming permet d'afficher le texte caractère par caractère, exactement comme les interfaces de chat modernes. L'utilisateur voit la réponse se construire en temps réel.

Instructions système

Les instructions définissent le comportement et la personnalité du modèle pour toute la durée de la session :

Les instructions sont plus puissantes qu'un simple préfixe de prompt. Le modèle les considère comme des directives prioritaires et les applique de manière cohérente tout au long de la conversation.

Génération guidée : @Generable et @Guide

La génération guidée est la fonctionnalité phare du Framework Foundation Models. Elle permet d'obtenir des réponses structurées sous forme de types Swift natifs, sans parsing JSON fragile.

Le macro @Generable

Annotez vos structures avec @Generable pour que le modèle puisse les instancier directement :

Le modèle utilise le "constrained decoding" pour garantir que la sortie respecte exactement la structure définie. Pas de JSON malformé, pas de champs manquants.

Contraintes avec @Guide

Le macro @Guide permet d'affiner le comportement de génération pour chaque propriété :

Les contraintes disponibles incluent :

Contrainte Usage Exemple
description Guide sémantique "Nom du personnage"
.range() Plage numérique .range(1...100)
.anyOf() Valeurs énumérées .anyOf(["A", "B", "C"])
.count() Taille de tableau .count(3...5)
.regex() Pattern de string .regex(/[A-Z]{2}-\d{4}/)

Ordre des propriétés

L'ordre de déclaration des propriétés est crucial. Le modèle génère les valeurs séquentiellement, de haut en bas :

Si vous placez summary avant mainTopics, le modèle ne pourra pas s'appuyer sur les sujets identifiés pour construire le résumé.

Génération avec streaming

Combinez génération guidée et streaming pour une UX optimale :

Le type PartiallyGenerated expose chaque propriété comme optionnelle, permettant d'afficher les valeurs au fur et à mesure de leur génération.

Tool Calling : Étendre les capacités du modèle

Le modèle embarqué a une connaissance limitée (données d'entraînement jusqu'à 2023) et aucun accès aux données externes. Le Tool Calling permet de combler ces lacunes en lui donnant accès à vos APIs.

Anatomie d'un Tool

Un Tool implémente le protocole Tool avec les éléments suivants :

    • description : guide le modèle sur quand utiliser l'outil
    • Arguments : struct @Generable et Sendable définissant les paramètres attendus
    • func call() : implémentation retournant un String (ou tout type PromptRepresentable)

Le name est auto-généré depuis le nom de la struct/class et peut être omis.

Enregistrement et utilisation

Les tools sont passés à la session lors de sa création :

Exemple complet : Tool avec HealthKit

Voici un exemple réaliste intégrant HealthKit pour les données de santé :

Chaînage de tools

Le modèle peut appeler plusieurs tools en séquence pour répondre à une requête complexe :

Le framework gère automatiquement l'insertion des résultats des tools dans le transcript de la conversation.

Gestion des erreurs

Le Framework Foundation Models définit des erreurs spécifiques via GenerationError :

Erreur Description
guardrailViolation Contenu bloqué par les filtres de sécurité
exceededContextWindowSize Conversation dépassant 4096 tokens
rateLimited Trop de requêtes ou app en arrière-plan
unsupportedLanguageOrLocale Langue non supportée
concurrentRequests Tentative d'envoi pendant une génération
assetsUnavailable Modèle supprimé ou espace disque insuffisant
unsupportedGuide @Guide avec pattern non supporté
decodingFailure Échec de désérialisation du type Generable
refusal Le modèle refuse de répondre (explication possible via .explanation)

Les Guardrails en détail

Apple applique des filtres de sécurité stricts et non désactivables. Certains contenus déclenchent systématiquement une violation :

    • Contenu violent ou explicite
    • Demandes liées à des activités illégales
    • Certains sujets politiques sensibles
    • Informations médicales ou juridiques critiques

Ces guardrails sont parfois trop restrictifs (un article de presse sur un décès peut être bloqué). Apple travaille à améliorer ces faux positifs — signalez-les via Feedback Assistant.

Limitations à connaître

Caractéristiques du modèle

Aspect Valeur Implication
Paramètres ~3 milliards Moins puissant que GPT-4 ou Claude
Context window 4096 tokens Conversations limitées en longueur
Quantization 2-bit Optimisé pour la mémoire, pas la précision
RAM utilisée ~3 Go Impact sur les apps gourmandes en mémoire

Ce que le modèle ne fait PAS bien

Apple recommande d'éviter ces cas d'usage :

    • Génération de code : Résultats inconsistants et souvent incorrects
    • Calculs mathématiques : Erreurs fréquentes sur les opérations complexes
    • Connaissance factuelle récente : Données d'entraînement jusqu'à 2023
    • Conversations générales : Non conçu comme chatbot généraliste

Le modèle excelle en revanche pour :

    • Summarization et extraction d'entités
    • Génération de contenu créatif court
    • Classification et tagging
    • Compréhension de texte structuré

Optimisation des performances

Préchauffage du modèle

Le chargement initial du modèle prend quelques secondes. Utilisez prewarm() pour anticiper. Cette méthode est synchrone et ne lance pas d'erreur — elle retourne immédiatement et le chargement s'effectue en arrière-plan :

Appelez prewarm() dès que vous anticipez l'utilisation du modèle (ex: quand l'utilisateur ouvre l'écran de chat).

Gestion de la mémoire

Avec ~3 Go de RAM utilisés par le modèle, surveillez l'empreinte mémoire :

Limitation des propriétés Generable

Chaque propriété d'un type @Generable est générée séquentiellement. Plus il y a de propriétés, plus la génération est lente :

Concevez vos types Generable avec uniquement les propriétés que vous afficherez réellement.

Exemple complet : Mini Chat Conversationnel

Voici une implémentation complète d'un assistant conversationnel avec SwiftUI et iOS 26 :

Modèle de données

ViewModel avec session managée

Vue principale du Chat

Cette implémentation gère :

    • La vérification de disponibilité du modèle
    • Le streaming des réponses en temps réel
    • La gestion complète des erreurs
    • L'historique de conversation maintenu par la session
    • Le préchauffage pour des temps de réponse optimaux

Pour aller plus loin

Le Framework Foundation Models ouvre des possibilités considérables pour les applications iOS. Il ne remplace pas les modèles cloud pour les tâches complexes, mais excelle pour les fonctionnalités de qualité de vie qui fonctionnent offline et respectent la vie privée.

Ressources officielles

Exemples d'intégration