Communitygithub.com

FoundationModels sur appareil

Framework FoundationModels d'Apple pour LLM sur appareil — génération de texte, génération guidée avec @Generable, appel d'outils et streaming de captures instantanées dans iOS 26+. À utiliser pour ajouter des fonctionnalités LLM sur appareil avec FoundationModels sur iOS 26+.

Qu'est-ce que FoundationModels sur appareil ?

Cette compétence définit les schémas d'intégration du modèle de langage sur appareil d'Apple dans les applications iOS 26+ à l'aide du framework FoundationModels. Elle couvre quatre cas d'utilisation principaux : la génération de texte de base, la génération structurée avec la macro `@Generable`, l'appel d'outils personnalisés et le streaming de captures instantanées pour des mises à jour d'interface utilisateur en temps réel. Toutes les opérations s'exécutent localement sur l'appareil pour garantir la confidentialité (aucune donnée ne quitte l'appareil) et la fonctionnalité hors ligne. La compétence est particulièrement utile pour les développeurs créant des fonctionnalités basées sur l'IA avec Apple Intelligence, telles que l'extraction de données structurées à partir de texte naturel, la synthèse ou l'implémentation d'actions IA spécifiques à un domaine. Les schémas incluent des vérifications de disponibilité, une gestion appropriée d'une session unique avec les instructions du système, la définition de types `@Generable` avec des contraintes de guidage, la construction d'outils personnalisés avec gestion des erreurs, et l'utilisation de types `PartiallyGenerated` pour des interfaces utilisateur réactives. Une attention particulière est portée aux bonnes pratiques, aux limites (comme le plafond de 4096 tokens) et aux anti-schémas afin d'assurer une intégration robuste.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/foundation-models-on-device

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

FoundationModels : LLM sur appareil (iOS 26)

Schémas d'intégration du modèle de langage sur appareil d'Apple dans les applications à l'aide du framework FoundationModels. Couvre la génération de texte, la sortie structurée avec @Generable, l'appel d'outils personnalisé et le streaming de captures instantanées — le tout exécuté localement pour la confidentialité et le support hors ligne.

Quand activer

  • Construire des fonctionnalités basées sur l'IA à l'aide d'Apple Intelligence sur appareil
  • Générer ou résumer du texte sans dépendance au cloud
  • Extraire des données structurées à partir d'une entrée en langage naturel
  • Implémenter un appel d'outils personnalisé pour des actions IA spécifiques à un domaine
  • Streamer des réponses structurées pour des mises à jour d'interface utilisateur en temps réel
  • Besoin d'une IA préservant la confidentialité (aucune donnée ne quitte l'appareil)

Schéma principal — Vérification de disponibilité

Vérifiez toujours la disponibilité du modèle avant de créer une session :

struct GenerativeView: View {
    private var model = SystemLanguageModel.default

    var body: some View {
        switch model.availability {
        case .available:
            ContentView()
        case .unavailable(.deviceNotEligible):
            Text("L'appareil n'est pas éligible pour Apple Intelligence")
        case .unavailable(.appleIntelligenceNotEnabled):
            Text("Veuillez activer Apple Intelligence dans Réglages")
        case .unavailable(.modelNotReady):
            Text("Le modèle est en cours de téléchargement ou pas prêt")
        case .unavailable(let other):
            Text("Modèle indisponible : \(other)")
        }
    }
}

Schéma principal — Session de base

// Tour unique : créer une nouvelle session à chaque fois
let session = LanguageModelSession()
let response = try await session.respond(to: "Quel est un bon mois pour visiter Paris ?")
print(response.content)

// Tours multiples : réutiliser la session pour le contexte de conversation
let session = LanguageModelSession(instructions: """
    Vous êtes un assistant culinaire.
    Suggérez des recettes en fonction des ingrédients.
    Gardez les suggestions brèves et pratiques.
    """)

let first = try await session.respond(to: "J'ai du poulet et du riz")
let followUp = try await session.respond(to: "Qu'en est-il d'une option végétarienne ?")

Points clés pour les instructions :

  • Définir le rôle du modèle ("Vous êtes un mentor")
  • Spécifier ce qu'il doit faire ("Aidez à extraire des événements de calendrier")
  • Définir les préférences de style ("Répondez aussi brièvement que possible")
  • Ajouter des mesures de sécurité ("Répondez par 'Je ne peux pas vous aider avec ça' pour les demandes dangereuses")

Schéma principal — Génération guidée avec @Generable

Générez des types Swift structurés au lieu de chaînes brutes :

1. Définir un type Generable

@Generable(description: "Informations de profil de base sur un chat")
struct CatProfile {
    var name: String

    @Guide(description: "L'âge du chat", .range(0...20))
    var age: Int

    @Guide(description: "Un profil d'une phrase sur la personnalité du chat")
    var profile: String
}

2. Demander une sortie structurée

let response = try await session.respond(
    to: "Générez un joli chat à adopter",
    generating: CatProfile.self
)

// Accéder directement aux champs structurés
print("Nom : \(response.content.name)")
print("Âge : \(response.content.age)")
print("Profil : \(response.content.profile)")

Contraintes @Guide prises en charge

  • .range(0...20) — plage numérique
  • .count(3) — nombre d'éléments du tableau
  • description: — guidance sémantique pour la génération

Schéma principal — Appel d'outils

Laissez le modèle invoquer du code personnalisé pour des tâches spécifiques au domaine :

1. Définir un outil

struct RecipeSearchTool: Tool {
    let name = "recipe_search"
    let description = "Rechercher des recettes correspondant à un terme donné et renvoyer une liste de résultats."

    @Generable
    struct Arguments {
        var searchTerm: String
        var numberOfResults: Int
    }

    func call(arguments: Arguments) async throws -> ToolOutput {
        let recipes = await searchRecipes(
            term: arguments.searchTerm,
            limit: arguments.numberOfResults
        )
        return .string(recipes.map { "- \($0.name): \($0.description)" }.joined(separator: "\n"))
    }
}

2. Créer une session avec des outils

let session = LanguageModelSession(tools: [RecipeSearchTool()])
let response = try await session.respond(to: "Trouve-moi des recettes de pâtes")

3. Gérer les erreurs d'outil

do {
    let answer = try await session.respond(to: "Trouve une recette de soupe tomate.")
} catch let error as LanguageModelSession.ToolCallError {
    print(error.tool.name)
    if case .databaseIsEmpty = error.underlyingError as? RecipeSearchToolError {
        // Gérer une erreur d'outil spécifique
    }
}

Schéma principal — Streaming de captures instantanées

Streamer des réponses structurées pour une interface utilisateur en temps réel avec les types PartiallyGenerated :

@Generable
struct TripIdeas {
    @Guide(description: "Idées de voyages à venir")
    var ideas: [String]
}

let stream = session.streamResponse(
    to: "Quelles sont des idées de voyage excitantes ?",
    generating: TripIdeas.self
)

for try await partial in stream {
    // partial : TripIdeas.PartiallyGenerated (toutes les propriétés Optional)
    print(partial)
}

Intégration SwiftUI

@State private var partialResult: TripIdeas.PartiallyGenerated?
@State private var errorMessage: String?

var body: some View {
    List {
        ForEach(partialResult?.ideas ?? [], id: \.self) { idea in
            Text(idea)
        }
    }
    .overlay {
        if let errorMessage { Text(errorMessage).foregroundStyle(.red) }
    }
    .task {
        do {
            let stream = session.streamResponse(to: prompt, generating: TripIdeas.self)
            for try await partial in stream {
                partialResult = partial
            }
        } catch {
            errorMessage = error.localizedDescription
        }
    }
}

Décisions de conception clés

DécisionJustification
Exécution sur appareilConfidentialité — aucune donnée ne quitte l'appareil ; fonctionne hors ligne
Limite de 4 096 tokensContrainte du modèle sur appareil ; segmenter les grandes données sur plusieurs sessions
Streaming de captures instantanées (pas de deltas)Adapté aux sorties structurées ; chaque capture est un état partiel complet
Macro @GenerableSécurité à la compilation pour la génération structurée ; génère automatiquement le type PartiallyGenerated
Une seule requête par sessionisResponding empêche les requêtes concurrentes ; créer plusieurs sessions si nécessaire
response.content (pas .output)API correcte — toujours accéder aux résultats via la propriété .content

Bonnes pratiques

  • Vérifiez toujours model.availability avant de créer une session — gérez tous les cas d'indisponibilité
  • Utilisez instructions pour guider le comportement du modèle — elles ont priorité sur les invites
  • Vérifiez isResponding avant d'envoyer une nouvelle requête — les sessions gèrent une requête à la fois
  • Accédez à response.content pour les résultats — pas .output
  • Divisez les grandes entrées en morceaux — la limite de 4 096 tokens s'applique aux instructions + invite + sortie combinés
  • Utilisez @Generable pour les sorties structurées — garanties plus solides que l'analyse de chaînes brutes
  • Utilisez GenerationOptions(temperature:) pour ajuster la créativité (plus élevé = plus créatif)
  • Surveillez avec Instruments — utilisez Xcode Instruments pour profiler les performances des requêtes

Anti-schémas à éviter

  • Créer des sessions sans vérifier d'abord model.availability
  • Envoyer des entrées dépassant la fenêtre de contexte de 4 096 tokens
  • Tenter des requêtes concurrentes sur une seule session
  • Utiliser .output au lieu de .content pour accéder aux données de réponse
  • Analyser des réponses sous forme de chaînes brutes alors qu'une sortie structurée avec @Generable fonctionnerait
  • Construire une logique multi-étapes complexe dans une seule invite — diviser en plusieurs invites ciblées
  • Supposer que le modèle est toujours disponible — l'éligibilité de l'appareil et les réglages varient

Quand utiliser

  • Génération de texte sur appareil pour des applications sensibles à la confidentialité
  • Extraction de données structurées à partir d'entrées utilisateur (formulaires, commandes en langage naturel)
  • Fonctionnalités assistées par IA qui doivent fonctionner hors ligne
  • Interface utilisateur en streaming qui affiche progressivement le contenu généré
  • Actions IA spécifiques à un domaine via l'appel d'outils (recherche, calcul, consultation)

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Skills associés