Développement IA

Comment Siri AI sous iOS 27 appelle une app ? App Intents, agents, JSON et automatisation

Environ 15 min

L'utilisateur dit « cherche A-1042 ». Pour qui écrit du JSON, la question n'est pas si Siri sait bavarder, mais si cette phrase devient un paramètre d'Intent légal et si votre app exécute un effet de bord dans perform(). Ce guide sépare les App Intents, l'agent IA, les données JSON et l'exécution automatisée.

Avant de lire

Idée Une ligne Où ça vit
App Intents Une action que l'app enregistre auprès du système perform() + un objet de paramètres
Siri AI Un dispatcher qui remplit un Intent depuis une phrase Dispatch seulement — pas d'effets de bord
AI Agent Une boucle d'outils : proposer, exécuter, relire LanguageModelSession + Intents
JSON Schema Le diamètre d'exécution pour paramètres et état Un fichier source dans le dépôt, pas une note Swift

Retenir la découpe : Siri livre un objet, les App Intents sont la porte, l'agent est la boucle, le Schema est la porte avant execute. Les aplatir en « Siri a ouvert l'app » et le saut suivant parse de la prose.

Poser « appeler une app » correctement

Nous sommes en septembre 2026. iOS 27 sort avec la gamme iPhone 18. Le diamètre logiciel a été fixé à la WWDC 2026 : Siri reconstruit sur un LLM, SiriKit déprécié, entrée tierce uniquement par App Intents. que vaut l'IA de l'iPhone 18 a demandé la force de la pile. Ce texte n'en demande qu'une — comment Siri appelle votre app.

Si « appeler une app » signifie « ouvrir une UI et lire un paragraphe », vous concevez la mauvaise chose. Le système entend une phrase, choisit un nom d'Intent, remplit un objet de paramètres et le donne au perform() hôte. L'UI peut rester fermée.

  • L'utilisateur parle en langue naturelle. Le système doit remettre un objet.
  • Siri est le dispatcher. Recherches, remboursements et courrier restent dans votre app.
  • L'automatisation multi-étapes n'est pas une autre fenêtre de chat. Ce sont plusieurs appels d'Intent légaux.

Ce guide suit le chemin d'exécution : porte → paramètres → boucle d'agent → porte Schema → Shortcuts / Spotlight. Chaque saut pose la même question : l'objet est-il légal ?

Le chemin d'appel : comment une phrase devient perform()

L'ancienne Siri matchait des phrases et SiriKit. La nouvelle Siri remplit des slots : « A-1042 », « rembourse ça », « rembourse si payé » deviennent des champs, puis atterrissent sur un Intent déjà enregistré.

Un appel réussi passe au moins quatre sauts :

  1. Entendre. Sur l'appareil ou Private Cloud Compute, la voix / le texte devient une intention — pas un journal de chat.
  2. Choisir qui. Le système prend un nom dans les App Intents qu'il voit. Pas d'enregistrement, pas de tour.
  3. Remplir. Entités, vues à l'écran et index Spotlight se plient en un objet de paramètres.
  4. L'hôte exécute. Votre perform() fait l'effet de bord et renvoie un résultat structuré.

En JSON, un saut LookupOrder ressemble à ceci :

{
  "intent": "LookupOrder",
  "app": "com.example.shop",
  "source": "siri",
  "parameters": {
    "order_id": "A-1042"
  }
}

source peut être siri, shortcut, spotlight ou agent. Portes différentes, même forme d'objet. Ouvrir une UI est une présentation, pas l'appel.

App Intents : la seule porte que la nouvelle Siri voit

Après la WWDC 2026, la nouvelle Siri ne voit pas une app qui ne parle pas App Intents. SiriKit a une fenêtre de migration de deux à trois ans, mais la nouvelle capacité n'atterrit que sur les Intents. Phrases de réveil, vocabulaire maison et anciens fichiers de définition ne sont plus le chemin principal.

Pour le système, un Intent est un outil dispatchable : un nom, des types de paramètres, s'il faut confirmer, s'il ouvre une UI, à quel domaine il appartient. Siri, Shortcuts, Spotlight et l'agent sur l'appareil partagent ce catalogue.

  • Schémas d'Intent : domaines système (tâches, photos, communication, commerce). S'aligner sur un domaine et Siri n'a plus besoin de votre phrase figée.
  • Schémas d'entité : commandes, contacts et fichiers entrent dans l'index sémantique Spotlight ; le contexte personnel revient avec attribution.
  • View Annotations : marquer la vue visible comme entité pour que « rembourse celui-ci » ait quelque chose à lier — pas de second ID.
  • App Intents Testing : exercer Siri / Shortcuts / Spotlight sur de vrais chemins système. On teste des objets, pas des slogans.

Vous écrivez AppIntent en Swift ; le système voit une description appelable. le guide Agent IA dessine « le modèle propose, l'hôte exécute ». Sous iOS, la proposition vient souvent de Siri ; l'exécution reste toujours dans votre perform().

Ouvrir l'app n'est qu'une présentation. Recherches, changements d'état et passages inter-apps peuvent finir en arrière-plan — si les paramètres sont légaux et que vous avez déclaré une confirmation pour le destructif.

Les paramètres sont un objet JSON, pas une phrase de réveil

L'ancien chemin traitait le langage naturel comme une chaîne de recherche. Le nouveau le traite comme un formulaire. Si un champ est stocké en prose, perform() doit parser à nouveau — le dispatch est perdu.

Chaque Intent devrait avoir un JSON Schema. Le type Swift est une projection. @Generable, Structured Outputs cloud, la suite d'évals et les clients non Swift devraient pointer vers une seule source.

Un contrat minimal LookupOrder peut ressembler à ceci :

{
  "$id": "https://example.com/schemas/intents/lookup-order.json",
  "type": "object",
  "properties": {
    "intent": { "const": "LookupOrder" },
    "parameters": {
      "type": "object",
      "properties": {
        "order_id": { "type": "string", "pattern": "^A-[0-9]{4,}$" }
      },
      "required": ["order_id"],
      "additionalProperties": false
    }
  },
  "required": ["intent", "parameters"]
}

Les mots-clés sont dans le tutoriel JSON Schema. Noms de propriétés courts, enum figé, tableaux plafonnés par maximumCount. pourquoi l'IA a besoin de JSON Schema l'a déjà dit : le Schema est le diamètre, pas la phrase « veuillez renvoyer du JSON ».

Un mauvais remplissage Siri, une entité périmée ou une clé en trop atteignent encore votre fonction. Serrer l'Intent, puis valider le même Schema avant d'exécuter. Déboguer avec formatage, extraire order_id via extraction JSONPath, JSON Diff contre l'objet de la semaine dernière. Ne collez pas de commandes utilisateur sur un site public.

Agents IA : l'automatisation est une boucle, pas un Intent

Les utilisateurs veulent rarement un seul saut. « Cherche A-1042 et rembourse si payé » exige d'abord LookupOrder, puis la décision d'exécuter CreateRefund. C'est un agent : proposer, exécuter, lire, proposer encore.

Sur la pile Apple, la boucle vit dans une LanguageModelSession. Les outils sont souvent des App Intents, ou l'OCR / Spotlight système. Le squelette rejoint le Function Calling cloud : le modèle émet un nom et des arguments ; l'hôte valide et exécute.

  • Le catalogue par défaut, ce sont les Intents que le système voit, pas une longue liste tools[] que vous tenez seuls.
  • Chaque saut a un objet en entrée et en sortie. La prose d'une capture ne peut pas être le paramètre suivant.
  • PCC fait environ 32K. Les résultats d'outils mangent la fenêtre en premier. Couper avant la session.
  • Les chaînes inter-apps sont permises. Chaque saut a encore besoin de paramètres légaux et de sa propre politique de confirmation.
{
  "agent": "on_device",
  "goal": "refund_if_paid",
  "plan": [
    {
      "step": 1,
      "tool": "LookupOrder",
      "arguments": { "order_id": "A-1042" }
    },
    {
      "step": 2,
      "tool": "CreateRefund",
      "arguments": { "order_id": "A-1042", "reason": "duplicate" }
    }
  ]
}

Un plan minimal « rembourser si payé » ressemble au bloc ci-dessus. Le modèle peut proposer l'étape 2 ; il ne peut pas sauter l'hôte. Si status n'est pas paid, si amount dépasse, ou si la confirmation manque, CreateRefund ne doit pas tourner. agents IA et le flux JSON Schema aligne les portes ; MCP Tool Schema vs Function Calling est une autre orthographe du JSON d'outils. Apple écrit le même dictionnaire en App Intents.

Ne pas écrire Siri et agent comme un seul mot. Siri décide qui appeler. L'agent décide quel outil vient ensuite. Les deux passent un objet comme témoin.

Le Schema est la porte avant execute, pas une annexe

Guided Generation arrête les jetons illégaux. Il ne fait pas l'auth, les plafonds ni une seconde confirmation. Les paramètres remplis par Siri peuvent encore manquer un champ, user un mauvais enum ou pointer une entité périmée.

Aplatir les quatre en « Siri est devenue plus maligne » et les métiers se perdent. Les séparer :

Couche Ce que fait le système Sans Schema
Siri AI Transforme une phrase en appel d'Intent La prose entre dans perform() ; l'effet de bord démarre
App Intents Enregistre des actions appelables auprès du système La nouvelle Siri ne vous voit pas ; les vieilles phrases ne sauvent pas
AI Agent Appelle des outils sur plusieurs étapes dans une session L'état se devine dans un journal de chat ; le saut suivant lie le mauvais objet
JSON Schema Ne fait rien — c'est la règle Si la règle n'existe que dans une macro Swift, le cloud et la CI ne mesurent pas

Après un lookup réussi, l'état d'automatisation doit aussi être un objet, pas la phrase « trouvé » :

{
  "automation": "refund_if_paid",
  "trigger": "siri",
  "state": {
    "order_id": "A-1042",
    "status": "paid",
    "amount": 99.00
  },
  "next": {
    "intent": "CreateRefund",
    "allowed": true
  }
}

allowed doit être calculé par l'hôte à partir du Schema et des règles métier. Le modèle peut dire « suggérer un remboursement ». Il ne peut pas écrire lui-même allowed: true.

Exécution automatisée : Shortcuts, Spotlight et inter-apps

L'automatisation sous iOS 27 n'est pas une autre API. Ce sont d'autres portes sur le même catalogue d'Intents.

  • Shortcuts est un planificateur visuel. Chaque tuile reste un Intent ; chaque passage reste un objet de paramètres.
  • Spotlight sémantique renvoie des entités, pas des extraits web. « La commande de la semaine dernière » doit se résoudre en order_id.
  • Inter-apps : les chaînes vont, mais chaque côté valide son propre perform(). Ne pas nourrir le saut suivant avec la prose de l'autre app.
  • Confirmer le destructif. Remboursement, suppression, envoi sortant : déclarer une politique de confirmation. Renvoyer un résultat structuré, pas juste « OK ».

Le même LookupOrder peut être dit, tapé sur un canevas Shortcuts, ou utilisé comme outil d'agent. Vous tenez un seul Schema.

Si l'automatisation échoue, inspecter d'abord l'objet : required manquant, enum hors liste, entité périmée. Ne pas commencer par réécrire les phrases de réveil.

Comment livrer en 2026

  • Garder schemas/intents/ et schemas/state/ dans le dépôt, chacun avec un $id stable et une version.
  • Écrire le JSON Schema avant AppIntent / @Generable. Le type est une projection, pas la source.
  • Les effets de bord (lookup, remboursement, courrier) passent par un Intent. Extraction, triage et handoff passent par Guided Generation.
  • Nouveaux objets par défaut : additionalProperties: false et un enum explicite. Pour étendre, un metadata à part.
  • Déclarer la confirmation pour remboursements, suppressions et envois sortants. Mettre les paramètres illégaux dans App Intents Testing — pas seulement le happy path.
  • Inspecter secrets et champs utilisateur seulement dans le navigateur : formatage, JSON Diff, zéro envoi.

Le répertoire peut être mince. Ce qui compte, ce sont les fichiers avant la démo. Les formulations de Siri changeront. Le diamètre doit d'abord se stabiliser.

Pièges courants

  • Traiter Siri AI comme ChatGPT. Elle livre un Intent. Elle n'exécute pas vos effets de bord et ne garantit pas des paramètres légaux.
  • Compter sur les phrases de réveil sans App Intents. La nouvelle Siri ne vous voit pas.
  • Sauter la validation parce que Siri a rempli les champs. Clés manquantes, mauvais enums et entités périmées atteignent encore perform().
  • N'écrire que des types Swift, sans source JSON. L'API cloud, les évals et les clients non Swift dériveront.
  • Un large type: object pour éviter de concevoir. Un objet ouvert n'est pas une porte. Versionner, ou ajouter un metadata explicite.

FAQ

Siri sous iOS 27 peut-elle appeler mon app sans App Intents ?

La nouvelle Siri non. SiriKit est encore dans une fenêtre de migration, mais le dispatch en langage naturel, les entités à l'écran et les agents multi-étapes ne voient que les App Intents. Pour être appelée, enregistrez l'action et ses paramètres.

Siri a déjà rempli les paramètres. Dois-je encore valider ?

Oui. Siri est le dispatcher. Champs manquants, mauvais enums et entités périmées peuvent encore atteindre votre perform(). Serrer l'Intent, puis revérifier le même Schema avant d'exécuter.

Shortcuts et Siri sont-ils deux API ?

Non. Ils lisent le même catalogue d'Intents. La différence est la porte : voix, canevas Shortcuts, ou boucle d'agent. La forme d'objet doit correspondre.

Un agent sur l'appareil peut-il écrire la base lui-même ?

Non. Le modèle ne peut que proposer un nom et des arguments. Changements d'état, remboursements et courrier doivent passer par le perform() hôte et votre politique de confirmation.

Comment inspecter ce JSON en local ?

Le formater, vérifier le Schema pour un required manquant ou un mauvais enum, puis Diff contre la dernière version qui passait. JSONSort le fait dans le navigateur et n'envoie rien. Ne collez pas commandes ni contacts sur un site public.

Conclusion

Sous iOS 27, « Siri AI appelle une app » n'ouvre pas une UI de chat. C'est transformer une phrase en paramètre d'Intent légal, laisser l'hôte exécuter, et entrer dans une boucle d'agent multi-étapes si besoin.

Les App Intents sont la porte, l'agent la boucle, le JSON Schema la porte avant execute. Mettez d'abord schemas/intents/lookup-order.json dans le dépôt. Ensuite, décidez quelles phrases méritent une démo.

Pour aller plus loin

Journal : première publication