Skip to main content
Avec Foundation Models, une session représente un contexte de génération. Le modèle se souvient de ce qui s’est passé dans cette session, ainsi que des instructions et des tools que vous lui avez donnés. Le bon pattern est simple : une session doit rester ciblée.

Créer une session

import FoundationModels

let session = LanguageModelSession()
Ou avec un cadrage plus précis :
let session = LanguageModelSession(
    instructions: """
    You help intermediate Swift developers.
    Keep answers concise.
    """
)
Ou encore avec des tools :
let session = LanguageModelSession(
    tools: [WeatherTool()]
)

Quand réutiliser une session

Réutilisez la même session si :
  • vous êtes dans une conversation multi-tours
  • la tâche reste la même
  • le contexte précédent est encore utile
Exemple : un chat ou un assistant attaché à une feature précise.

Quand créer une nouvelle session

Créez une nouvelle session si :
  • vous changez de tâche
  • vous changez de rôle ou d’instructions
  • le contexte précédent n’aide plus
  • la conversation est devenue trop longue
Exemple : ne réutilisez pas la même session pour une aide culinaire puis une analyse de ticket produit.

Un bon pattern avec un view model

import FoundationModels
import Observation

@Observable
@MainActor
final class ChatViewModel {
    var messages: [String] = []
    var errorMessage: String?
    var isResponding: Bool { session.isResponding }

    private var session = LanguageModelSession(
        instructions: "You are a concise assistant."
    )

    func send(_ prompt: String) async {
        errorMessage = nil

        do {
            let response = try await session.respond(to: prompt)
            messages.append("Vous : \(prompt)")
            messages.append("IA : \(response.content)")
        } catch {
            errorMessage = error.localizedDescription
        }
    }

    func resetConversation() {
        session = LanguageModelSession(
            instructions: "You are a concise assistant."
        )
        messages.removeAll()
    }
}
Cette structure vous donne un cycle de vie clair et évite une session globale trop floue.

transcript

La session maintient un transcript. Il peut être utile pour :
  • inspecter la conversation
  • debugger le comportement
  • comprendre pourquoi une réponse a été influencée par le contexte précédent
Gardez en tête que plus le transcript grossit, plus la session devient coûteuse en contexte. Apple documente aussi init(model:tools:transcript:) pour réhydrater une session à partir d’un historique existant.
import FoundationModels

let existingSession = LanguageModelSession()
let savedTranscript = existingSession.transcript

let restoredSession = LanguageModelSession(
    model: SystemLanguageModel.default,
    tools: [],
    transcript: savedTranscript
)
C’est utile si vous voulez reprendre une conversation, restaurer un brouillon ou déplacer l’état d’une feature entre plusieurs écrans.

isResponding

La propriété isResponding est la façon la plus simple de protéger votre UI contre les doubles envois :
Button("Envoyer") {
    Task { await viewModel.send(userPrompt) }
}
.disabled(viewModel.isResponding)
Dans votre code produit, vous l’utiliserez souvent via un view model plutôt que directement depuis la vue.

prewarm

Le prewarming sert à réduire le coût du premier appel quand vous savez qu’une fonctionnalité IA va être utilisée.
let session = LanguageModelSession()
session.prewarm()
Apple documente prewarm(promptPrefix:) pour un cas plus précis : charger les ressources de la session tout en mettant en cache un début de prompt commun. Vous pouvez l’utiliser :
  • quand une vue IA va s’ouvrir
  • quand l’utilisateur se prépare à interagir
  • quand la feature fait partie du parcours principal
Si votre feature répète toujours le même cadrage, ce préfixe commun peut réduire la latence du premier vrai appel. Ne prewarmez pas partout par défaut. Faites-le seulement pour les flows qui le justifient.

Le piège le plus courant

Le mauvais réflexe consiste à partager une seule session dans toute l’app. Cela crée vite :
  • un contexte pollué
  • des responsabilités floues
  • des collisions entre features
Préférez :
  • une session par conversation
  • ou une session par feature clairement identifiée