Aller au contenu principal

Apple Foundation Models 3 & la stack LLM on-device pour utilisateurs de Claude

Intermédiaire

À la WWDC 2026 (annoncée le 8 juin 2026), Apple a livré la troisième génération de ses Foundation Models — AFM 3 — et a étendu le framework Foundation Models d'une manière qui compte même si vous n'écrivez jamais de Swift : le framework accepte maintenant des fournisseurs LLM tiers (Anthropic Claude et Google Gemini sont livrés comme packages Swift), et le chemin on-device cesse d'être un jouet 3B et ajoute un MoE sparse à 20 milliards de paramètres qui tourne sur Apple Silicon en gardant la plupart des experts en NAND et en n'échangeant que ce dont un prompt a besoin en RAM. Si vous construisez des apps Claude et avez traité « on-device » comme un univers séparé de vos workflows API, cet écart se referme cette année. Cette page décortique ce qui a réellement été livré, les mécanismes non évidents, et les choix concrets de migration et de compatibilité dont vous disposez maintenant.

What you'll learn
  • Nommer les quatre modèles AFM 3 — Core (3B), Core Advanced (20B sparse), Cloud, Cloud Pro — et lequel tourne où
  • Comprendre l'astuce de routage d'experts flash-plus-DRAM qui permet à un modèle 20B de tenir sur un iPhone du tout
  • Utiliser les macros @Generable / @Guide du framework Foundation Models pour du décodage contraint — le modèle ne peut littéralement pas émettre du JSON invalide
  • Savoir ce qui a changé à la WWDC26 : les protocoles LanguageModel / LanguageModelExecutor qui vous permettent de brancher Claude ou tout autre LLM sur la même API session Swift
  • Décider quand attraper le 3B on-device, quand sauter à Private Cloud Compute, et quand garder la charge sur l'API Claude

La version en une phrase​

AFM 3 est le deuxième vrai coup d'Apple sur les LLM on-device : un modèle dense 3B (Core) reconstruit, un nouveau MoE sparse 20B (Core Advanced) qui tourne sur iPhone en gardant la plupart des experts en stockage flash, une paire Cloud et Cloud Pro sur Apple Silicon plus GPU NVIDIA dans Google Cloud, et un framework qui traite maintenant Anthropic Claude et Google Gemini comme des fournisseurs interchangeables de première classe derrière le même protocole LanguageModel. Gratuit pour les développeurs à appeler on-device ; gratuit sur Private Cloud Compute pour les membres du programme App Store Small Business sous les 2M de premiers téléchargements.

Trois choses non évidentes sur AFM 3​

Tout le monde écrit le titre « Apple a un modèle 3B on-device ». Voici les mécanismes que la plupart des articles sautent.

1. Le modèle 20B tient sur iPhone parce que la plupart vit en NAND, pas en RAM​

La lecture naïve de « modèle à 20 milliards de paramètres sur iPhone » est impossible : même en 4-bit, 20B de poids fait ~10 Go, bien au-delà de ce qu'un iPhone peut tenir en RAM. L'astuce d'Apple, selon l'annonce WWDC 2026, est de stocker le modèle AFM 3 Core Advanced complet en mémoire flash (NAND) et de n'échanger que les experts routés dépendants de l'entrée en DRAM au moment de l'inférence. L'architecture a des experts partagés qui restent résidents et des experts routés qu'un routeur choisit par prompt (activant 1–4B de paramètres à la fois, pas les 20B complets). Combiné avec le Quantization Aware Training, c'est ce qui permet à Apple de livrer un modèle de classe 20B sur un appareil qui a ~8 Go de RAM utilisable. La conséquence pour vous : la latence côté iPhone est maintenant dominée moins par la multiplication de matrices et plus par la bande passante de lecture NAND et les choix du routeur — une enveloppe de performance très différente d'un modèle dense 3B.

2. Le décodage contraint est cuit dans le compilateur Swift, pas dans le runtime​

La macro @Generable du framework est souvent décrite comme « sortie structurée », ce qui minimise ce qu'elle fait. @Generable tourne à la compilation : elle génère un schéma JSON et un parseur pour votre type Swift, et le framework utilise ensuite ce schéma pour du décodage contraint — le modèle on-device est forcé, au niveau des tokens, à produire une sortie qui se parse en votre struct Swift. Il n'y a pas de « on espère que c'est du JSON valide, puis on réessaie ». Une annotation @Guide vous laisse ajouter des contraintes (.anyOf(["PG", "PG-13", "R", "G"]), des plages, des descriptions) qui sont aussi appliquées au moment du décodage. Si vous avez passé du temps à écrire des fallbacks de réparation JSON autour d'une boucle d'utilisation d'outils Claude, le côté modèle 3B on-device de votre app peut abandonner toute cette couche de retry.

3. Le framework accepte maintenant n'importe quel LLM — y compris Claude et Gemini — derrière une API Swift​

La session WWDC 2026 « Bring an LLM provider to the Foundation Models framework » a livré deux nouveaux protocoles : LanguageModel (déclare les capacités et la configuration de l'exécuteur) et LanguageModelExecutor (gère la génération réelle, le cache KV et le streaming). N'importe qui peut livrer un package Swift qui s'y conforme — Apple a explicitement nommé Anthropic Claude et Google Gemini comme fournisseurs au lancement. La conséquence : du point de vue de l'app, la même LanguageModelSession, les mêmes types @Generable, le même contrat d'appel d'outils, et le même modèle de transcript s'appliquent que le modèle sous-jacent soit le 3B on-device, Private Cloud Compute, Claude sur l'API Anthropic, Gemini sur Google Cloud, ou un fichier de poids MLX depuis Hugging Face. Le choix de modèle devient une dépendance de package Swift plutôt qu'une réécriture de SDK.

AFM 3 en un coup d'œil​

Appuyez sur Entrée ou Espace pour retourner la carte. Utilisez les flèches gauche et droite pour naviguer entre les cartes.Terme affiché.
1 / 6

Ce qui tourne réellement où​

Guided walkthrough1 of 4
  1. Tourne sur n'importe quel appareil Apple Intelligence. Gratuit à appeler depuis Swift via le framework Foundation Models — pas de clé API, pas de réseau, pas de facture par token. C'est là que vous mettez classification, extraction, résumés, réécritures on-device, et tout ce qui doit marcher en mode avion.

Un appel on-device minimal​

La fonctionnalité phare du framework est que vous pouvez obtenir une sortie typée et validée par schéma depuis le 3B on-device avec presque aucune cérémonie.

Appel on-device 3B avec sortie structurée @Generable (Swift)

import FoundationModels

@Generable
struct TripIdea {
  @Guide(description: "Short, evocative title")
  let title: String

  @Guide(description: "One-paragraph pitch, 40–80 words")
  let summary: String

  @Guide(.range(1...14))
  let estimatedDays: Int

  @Guide(.anyOf(["easy", "moderate", "hard"]))
  let difficulty: String
}

let session = LanguageModelSession()   // defaults to on-device Core
let idea = try await session.respond(
  to: "Suggest a shoulder-season trip in Puglia for a family with a 6-year-old.",
  generating: TripIdea.self          // constrained decoding
)

print(idea.title, idea.difficulty, idea.estimatedDays)

Au runtime, le modèle est forcé, au niveau des tokens, à émettre des tokens qui gardent le texte en cours parseable comme un TripIdea. Vous ne voyez jamais une chaîne JSON ; vous recevez une valeur TripIdea. C'est le même contrat que la session parle au 3B on-device, à PCC, ou à un fournisseur tiers que vous avez branché comme package Swift.

Amener Claude dans la même session Swift​

La session WWDC 2026 « Bring an LLM provider » a rendu ça concret : implémentez LanguageModel et LanguageModelExecutor, publiez-le comme un package Swift avec tag git, et le code d'app qui utilisait déjà le 3B on-device peut appeler votre fournisseur en changeant un initialiseur.

Esquisse d'un fournisseur tiers se conformant à LanguageModel

import FoundationModels

public struct ClaudeSonnet5: LanguageModel {
  public let capabilities = LanguageModelCapabilities(capabilities: [
      .toolCalling, .guidedGeneration, .reasoning
  ])
  public var executorConfiguration: ClaudeExecutor.Configuration
}

public final class ClaudeExecutor: LanguageModelExecutor {
  public struct Configuration: Hashable {   // hashable = KV-cache key
      public var modelID: String
      public var tokenProvider: TokenProvider   // NOT a plain API key string
  }

  public required init(configuration: Configuration) throws { /* … */ }

  public func respond(
      to request: LanguageModelExecutorGenerationRequest,
      model: Model,
      streamingInto channel: LanguageModelExecutorGenerationChannel
  ) async throws {
      // 1. Map Foundation Models transcript → Anthropic /messages payload
      // 2. Stream deltas back via channel.send(.response(action: .appendText(...)))
      // 3. Surface tool calls / reasoning via the same transcript entry types
  }
}

Deux subtilités vers lesquelles l'API vous pousse délibérément. Premièrement, Configuration est Hashable exprès : le framework cache les exécuteurs par configuration, donc même config = même exécuteur = cache KV préservé entre les tours. Deuxièmement, la guidance décourage explicitement les chaînes de clé API en clair dans les initialiseurs — préférez un TokenProvider ou un flux de connexion, la persistance des tokens dans le keychain, et utilisez App Attest pour les appels cloud pour vérifier que l'appareil n'est pas un build altéré tapant sur votre endpoint depuis l'extérieur.

Quand utiliser quoi — un tableau de décision pour les développeurs Claude​

Pro tip
  • Attrapez AFM 3 Core (3B) on-device : résumés, classification, extraction d'entités, réécritures on-device, suggestions de clavier — tout ce où un prompt borné et une sortie typée battent un aller-retour réseau. Gratuit.
  • Attrapez AFM 3 Core Advanced (20B) : raisonnement privé qui ne peut pas quitter l'appareil (santé, finance, documents non publiés) et que le 3B rate. Attendez-vous à une latence variable à cause de l'échange d'experts NAND.
  • Attrapez Private Cloud Compute (Cloud / Cloud Pro) : contexte plus large, raisonnement plus long, ou multimodal où le 20B on-device ne peut pas suivre mais la confidentialité exclut toujours les API tierces.
  • Restez sur Claude via l'API Anthropic (ou le nouveau fournisseur via package Swift) : longues runs d'agents, extended thinking, travail sur grosses bases de code, et apps multi-plateformes qui ont besoin du même modèle sur Android et web. Voir la page fondations Claude vs autres.
  • Ne PAS envelopper le 3B on-device dans une boucle de réparation JSON : il a du décodage contraint. Si votre sortie ne se parse pas, le schéma est faux ou vous avez sauté @Generable.

Liens croisés​

Vérification rapide​

Check yourself

0/5
  1. Comment AFM 3 Core Advanced fait-il tenir un modèle à 20B paramètres sur un iPhone ?
  2. Que vous donne la macro @Generable que le prompting JSON à la main ne donne pas ?
  3. Vous voulez appeler Claude Sonnet 5 depuis une app iOS qui utilise déjà le framework Foundation Models pour des résumés on-device. Quel est le chemin natif WWDC26 ?
  4. Quel groupe de développeurs obtient les appels Private Cloud Compute gratuits depuis le framework ?
  5. Pourquoi le type `Configuration` de l'exécuteur doit-il être `Hashable` ?

Sources et lectures complémentaires​