Le modèle répond sans appeler la fonction, ou l’Agent s’arrête après l’exécution alors que l’API métier a réussi.
La solution la plus rapide : ne changez pas encore de modèle et n’élargissez pas les permissions. Reproduisez la panne à travers cinq couches — définition de l’outil, requête d’appel, exécution, état de session, reprise et retour arrière — puis n’activez les appels parallèles qu’après avoir stabilisé un outil unique.
Cette méthode s’adresse aux développeurs qui viennent de terminer le Quickstart de l’OpenAI Agents API mais obtiennent des résultats irréguliers. Elle convient aussi aux ingénieurs applicatifs qui branchent des fonctions, du MCP ou des API métier à un Agent de production, ainsi qu’aux responsables de plateforme qui doivent conserver des journaux exploitables et organiser la récupération après incident.
Le point de départ : une reproduction minimale
Un « appel d’outil échoué » ne désigne pas nécessairement la même panne. Une réponse finale incorrecte peut venir d’une mauvaise décision du modèle, d’une fonction jamais appelée, d’un paramètre refusé par votre code, d’une API métier indisponible ou d’un résultat correctement produit mais jamais renvoyé à l’Agent. Mélanger ces symptômes vous pousse souvent à modifier la mauvaise couche.
L’explication officielle du function calling sépare précisément la demande de l’outil, son exécution par votre application et la transmission du résultat. Reproduisez cette séparation dans vos journaux.
Pour votre premier test, choisissez une fonction sans effet secondaire : lire un fichier de configuration, rechercher un enregistrement de test ou calculer une valeur déterministe. Utilisez une entrée fixe et une demande dont le résultat attendu est connu. Évitez d’introduire en même temps un serveur MCP, une API lente et plusieurs fonctions.
Conservez au minimum :
- la requête complète envoyée au modèle, avec la définition de l’outil ;
- la réponse brute contenant, ou non, un appel d’outil ;
- le JSON transmis à l’exécuteur ;
- le résultat brut de l’exécuteur et son statut ;
- le contenu exact réinjecté dans le tour suivant ;
- l’identifiant de session, de tour et d’élément lorsqu’ils existent ;
- les erreurs d’autorisation, de réseau, de délai d’attente et de validation.
Ne masquez pas les identifiants nécessaires à la corrélation, mais retirez les secrets, les jetons et les données personnelles avant de partager le journal.
| Symptôme observé | Vérification immédiate | Couche probablement concernée | Réaction adaptée |
|---|---|---|---|
| Aucun appel d’outil dans la réponse | Examiner les outils réellement transmis et la décision du modèle | Définition ou sélection de l’outil | Corriger le contrat et répéter avec une entrée fixe |
| Appel présent, paramètres refusés | Comparer le JSON reçu avec le validateur de l’exécuteur | Contrat de paramètres | Corriger les types, champs obligatoires ou valeurs autorisées |
| API métier en erreur | Rejouer le même appel hors Agent | Exécution | Traiter l’erreur métier, les droits ou le réseau |
| Exécution réussie, Agent bloqué | Comparer le résultat produit et celui réinjecté | Retour d’outil ou session | Restaurer l’identifiant, le format et le tour attendus |
| Effet externe déjà produit | Chercher la clé d’idempotence et l’état de confirmation | Reprise et effets secondaires | Stopper les répétitions, vérifier l’état puis décider d’une reprise |
Cette matrice est votre premier outil de décision : elle empêche de qualifier trop vite le problème de « modèle instable ».
Le premier jalon : le contrat de l’outil
Un outil utilisable par l’Agent n’est pas seulement une fonction disponible dans votre code. Il possède un nom, une description, des paramètres et un format de sortie compris par plusieurs composants. Le moindre écart entre le schéma déclaré et le validateur réel peut produire un échec qui ressemble à une mauvaise compréhension du modèle.
Vérifiez les éléments suivants, dans cet ordre :
- le nom déclaré est exactement celui attendu par l’exécuteur ;
- la description explique quand utiliser la fonction et quand ne pas l’utiliser ;
- chaque propriété obligatoire existe réellement dans le code ;
- les types correspondent, notamment pour les nombres, les booléens et les tableaux ;
- les valeurs énumérées utilisent les mêmes libellés partout ;
- les objets imbriqués acceptent le niveau de profondeur déclaré ;
- la politique concernant les champs inconnus est explicite ;
- une valeur absente, vide ou nulle possède un comportement défini.
Pour MCP et les connecteurs, ne supposez pas que la découverte d’un outil garantit son exécution. Les droits disponibles, le serveur exposé et les paramètres acceptés restent des points distincts. Consultez la documentation officielle sur les outils MCP et les connecteurs lorsque le catalogue visible par l’Agent ne correspond pas à celui que votre application journalise.
Créez ensuite des exemples fixes. Testez un cas nominal, un champ obligatoire absent, une valeur énumérée invalide, un objet partiellement rempli et une valeur nulle. Le but n’est pas de mesurer la performance du modèle : il s’agit de déterminer si votre contrat laisse passer ou rejette correctement chaque entrée.
| Test de contrat | Résultat attendu | Indice de panne |
|---|---|---|
| Paramètres complets et valides | L’exécuteur reçoit un objet directement exploitable | Si l’appel échoue, cherchez une différence de sérialisation |
| Champ obligatoire absent | Le validateur refuse clairement la demande | Une exécution malgré tout indique un contrat trop permissif |
| Valeur hors énumération | Erreur explicite avant l’appel métier | Une erreur distante signifie que la validation est trop tardive |
| Objet imbriqué incomplet | Rejet local avec chemin de propriété | Un message vague complique la correction et la reprise |
| Valeur nulle ou chaîne vide | Comportement documenté | Les conversions implicites créent des erreurs difficiles à reproduire |
Évitez de résoudre un schéma incohérent en ajoutant des permissions. Une fonction trop permissive augmente la surface d’action sans corriger l’écart entre l’outil annoncé et l’outil exécuté.
Le second jalon : l’exécution et le retour
Une fois le contrat validé, séparez trois événements dans le journal : ce que le modèle a demandé, ce que votre application a exécuté et ce que l’Agent a reçu en retour. Ces événements peuvent porter des noms proches tout en décrivant des objets différents.
Un appel correct peut échouer pendant l’exécution pour des raisons qui ne relèvent pas du modèle :
- l’API métier refuse l’identité ou le périmètre demandé ;
- la requête expire ou rencontre une erreur réseau ;
- une conversion locale transforme un nombre, une date ou une valeur vide ;
- le service répond avec un succès HTTP mais un contenu inutilisable ;
- l’exécuteur termine son travail sans remettre le résultat au gestionnaire de tour.
Le statut HTTP ne suffit donc pas. Validez aussi la structure du contenu, l’identifiant de corrélation et la présence d’un résultat exploitable par l’Agent. Si votre API répond avec une page d’erreur ou un objet différent après un succès apparent, enregistrez cette réponse comme un échec de contrat de sortie.
La récupération dépend de la cause :
- pour une indisponibilité temporaire, retentez selon une limite définie et observez le délai ;
- pour une erreur de paramètre, corrigez la demande ou le schéma, sans répéter mécaniquement ;
- pour un refus d’autorisation, arrêtez l’appel et demandez une intervention ;
- pour un résultat mal formé, bloquez la poursuite et conservez la réponse fautive ;
- pour une exécution réussie sans poursuite, inspectez la réinjection dans le tour.
Rappel : une fonction qui a modifié un système externe ne doit pas être rejouée uniquement parce que la réponse de l’Agent est absente. Vérifiez d’abord l’état réel de l’opération et son identifiant d’idempotence.
Le troisième jalon : la session et les tâches à plusieurs étapes
Les tâches en plusieurs étapes ajoutent un risque différent : l’outil suivant dépend parfois du résultat du précédent, alors que l’orchestrateur traite les appels comme indépendants. À l’inverse, des appels réellement indépendants peuvent être exécutés en série sans nécessité. Dans les deux cas, une mauvaise modélisation du flux complique le diagnostic.
Préparez deux scénarios contrôlés :
- deux outils indépendants, par exemple récupérer une miniature et lire les métadonnées d’un fichier vidéo ;
- deux outils dépendants, par exemple créer un projet puis téléverser un élément dans ce projet.
Dans le premier scénario, vérifiez que l’exécution concurrente ne mélange ni les identifiants ni les sorties. Dans le second, interdisez l’appel dépendant tant que l’identifiant produit par la première étape n’est pas confirmé et conservé.
La documentation officielle des Agents et de leurs modes d’exécution doit servir de référence pour distinguer l’état géré par l’API de celui que votre application doit conserver. Ne confondez pas :
- l’état de session, qui représente le contexte géré par l’environnement Agent ;
- le tour, qui organise une séquence d’interaction ;
- les éléments, qui peuvent inclure des messages, appels et résultats ;
- l’état métier, qui contient vos identifiants, statuts et décisions ;
- l’état d’effet externe, qui confirme ce qui a réellement été écrit ou publié.
Votre application doit pouvoir retrouver le statut métier même si l’interface Agent est interrompue. À l’inverse, elle ne doit pas recréer arbitrairement des éléments de session pour masquer un état perdu. Journalisez les identifiants retournés par chaque couche et utilisez une corrélation unique pour relier l’appel, l’exécution et le résultat.
| Organisation du flux | Autorisée lorsque | Risque principal | Contrôle requis |
|---|---|---|---|
| Appels parallèles | Les outils ne partagent ni entrée ni effet | Résultats associés au mauvais élément | Corrélation par identifiant et validation des sorties |
| Appels séquentiels | Le second outil dépend du premier | Blocage ou perte de l’identifiant produit | Persistance de l’état métier avant l’étape suivante |
| Reprise après interruption | L’état réel est connu | Duplication d’un effet déjà réalisé | Recherche par clé d’idempotence |
| Intervention humaine | L’action possède un risque externe | Approbation donnée sur un contexte obsolète | Afficher paramètres, effet attendu et état actuel |
Pour les approbations, les garde-fous et la reprise humaine, utilisez les mécanismes officiels de validation et d’approbation. Ils sont particulièrement importants pour les outils qui écrivent dans un système, déclenchent une publication audio ou vidéo, suppriment une ressource ou lancent une opération financière.
Le quatrième jalon : la grisaille avant la production
Ne passez pas directement du test local à l’automatisation complète. Faites circuler un petit ensemble de tâches représentatives avec des droits limités, des données non critiques et une observation complète. La question n’est pas seulement « l’Agent réussit-il ? », mais « pouvez-vous expliquer chaque arrêt et empêcher une répétition dangereuse ? »
Classez les erreurs avant de définir une reprise :
- Rejouable : délai réseau temporaire ou service momentanément indisponible, avec limite et délai contrôlés ;
- Non rejouable automatiquement : paramètre invalide, ressource inexistante ou règle métier violée ;
- Erreur de permission : arrêt immédiat, car répéter ne crée pas le droit manquant ;
- Effet potentiellement déjà produit : vérification de l’état externe avant toute nouvelle tentative.
Pour une écriture, un paiement, une suppression ou une publication, ajoutez une clé d’idempotence générée avant l’appel. Enregistrez son statut : préparé, accepté, confirmé, refusé ou inconnu. Si l’état est inconnu, la priorité est la réconciliation, pas une nouvelle exécution.
Les environnements hébergés et les espaces distants introduisent également des frontières de réseau, de secret et de permission. La documentation officielle sur la sécurité des environnements Agents rappelle pourquoi l’accès disponible dans l’environnement d’exécution ne doit pas être assimilé aux droits métier de votre application.
Pour une reproduction distante, vous pouvez utiliser une machine Mac louée comme environnement séparé afin de comparer le poste local et l’espace d’exécution. Kvmkit présente par exemple ses options de location de Mac mini au Japon et ses options de location de Mac mini aux États-Unis. Ce choix ne corrige pas un schéma défectueux ; il aide à isoler les différences de réseau, de session, de secrets et de dépendances.
Le cinquième jalon : l’observation durable
Une fois la panne reproduite et corrigée, conservez le parcours de diagnostic. Les tableaux de bord doivent distinguer au moins l’appel demandé, l’exécution commencée, l’exécution terminée, le résultat réinjecté et la réponse suivante de l’Agent. Un seul indicateur de « réussite de la tâche » masque trop de causes.
La documentation officielle sur l’observabilité des Agents constitue le point de départ pour organiser ces traces. Ajoutez toutefois vos propres champs métier :
- identifiant de tâche et version du contrat d’outil ;
- nom logique de l’outil et version de l’exécuteur ;
- identifiant de session, de tour et d’élément ;
- clé d’idempotence et état de l’effet externe ;
- cause classée de l’échec ;
- décision prise : reprise, arrêt, approbation ou retour arrière.
Conservez aussi la version du schéma utilisée au moment de l’appel. Une évolution anodine du validateur peut expliquer pourquoi une ancienne tâche réussit alors qu’une nouvelle tâche échoue. Lors d’une mise à jour du SDK ou de la documentation API, rejouez votre scénario minimal, votre scénario dépendant et votre scénario d’effet externe avant de modifier les droits de production.
Si la séparation entre poste local et environnement distant reste difficile, documentez-la dans un cadre de fonctionnement Kvmkit en précisant les accès nécessaires, les secrets qui ne doivent jamais être copiés et les conditions de reprise. L’objectif est de rendre le diagnostic transférable à un autre opérateur, pas de dépendre d’une session interactive unique.
Questions fréquentes
Pourquoi l’Agent ignore-t-il une fonction pourtant déclarée ?
Vérifiez d’abord la requête réellement envoyée, et non la configuration supposée de votre application. Le nom, la description, le contexte, les droits et la sélection d’outil peuvent empêcher l’appel. Si le journal ne contient aucun appel, l’exécuteur n’est pas encore en cause. Reproduisez avec une fonction déterministe, une entrée fixe et un seul outil visible.
Comment diagnostiquer un échec de validation des paramètres ?
Comparez le JSON généré avec le schéma et avec le validateur qui protège votre fonction. Inspectez les champs obligatoires, les énumérations, les objets imbriqués, les chaînes vides et les valeurs nulles. Faites cette comparaison avant l’appel réseau. Un message de validation local, associé au chemin exact de la propriété, est plus utile qu’une erreur générale renvoyée par l’API métier.
Pourquoi l’Agent ne poursuit-il pas après un appel réussi ?
Un succès du service appelé ne signifie pas que le résultat a été remis au bon tour. Contrôlez l’identifiant de l’appel, le format du résultat, la séquence des éléments et l’état de session. Si votre application conserve l’état métier séparément, vérifiez aussi que l’identifiant produit lors de la première étape est disponible pour la suivante. Ne relancez pas une opération externe avant cette vérification.
Comment organiser les reprises et le retour arrière ?
Commencez par classer la cause, puis décidez si l’action est rejouable. Une erreur réseau transitoire peut suivre une politique limitée, mais une permission refusée doit s’arrêter. Pour une action à effet externe, utilisez une clé d’idempotence, confirmez l’état réel et prévoyez une approbation humaine. Le retour arrière doit être défini par opération, car toutes les actions ne sont pas réversibles.
Lorsque votre environnement actuel mélange poste local, dépendances installées à la main et session distante difficile à retrouver, vous subissez souvent trois limites : l’état de l’Agent n’est pas reproductible, les secrets et permissions varient selon l’opérateur, et les erreurs réseau ou de processus sont difficiles à comparer. Une machine Mac dédiée ou louée ne remplace pas votre instrumentation, mais elle peut fournir un espace de test plus constant pour les tâches audio, vidéo, design ou automatisées. Si votre besoin est temporaire, exploratoire ou lié à une campagne de tests, louer un Mac avec Kvmkit peut donc être plus simple que maintenir une machine personnelle uniquement pour reproduire un appel d’outil. En revanche, pour une charge lourde et stable sur le long terme, un achat ou une infrastructure maîtrisée reste à comparer ; la location est surtout pertinente quand vous cherchez un environnement isolé sans immobiliser du matériel.
FAQ
Pourquoi mon Agent ne déclenche-t-il jamais la fonction disponible ?
Commencez par vérifier que l’outil est réellement présent dans la requête, que son nom est unique et que sa description permet au modèle de distinguer son usage. Conservez la requête complète et la réponse brute. Si aucun appel d’outil n’apparaît, le problème se situe avant l’exécuteur : sélection de l’outil, contexte ou contrat transmis.
Comment isoler une erreur de validation des paramètres ?
Exécutez la fonction avec un exemple fixe couvrant les champs obligatoires, les valeurs énumérées, les objets imbriqués et les valeurs nulles. Comparez ensuite le JSON reçu avec le schéma réellement accepté par votre code. Une conversion implicite, un nom de propriété différent ou une chaîne vide peut suffire à faire échouer le contrat.
Que faire après un appel d’outil sans nouvelle réponse de l’Agent ?
Vérifiez que le résultat d’exécution est réinjecté dans le même tour, avec l’identifiant et la structure attendus. Le succès de votre API métier ne prouve pas que l’Agent a reçu son résultat. Journalisez la sortie envoyée, puis recherchez une réponse suivante. À défaut, contrôlez la gestion de session et l’état conservé par votre application.
Comment sécuriser les reprises lors d’une tâche à plusieurs outils ?
Classez les erreurs avant d’ajouter une reprise. Une indisponibilité temporaire peut être retentée avec une limite, tandis qu’un refus d’autorisation doit être corrigé ou transmis à un opérateur. Pour une écriture, un paiement, une suppression ou une publication, utilisez une clé d’idempotence, une approbation et un point de retour arrière plutôt qu’une répétition automatique.
CI/CD sur Mac mini M4 — le plus simple
Xcode, Fastlane, CocoaPods, and SPM are first-class on macOS. Mac mini M4 unified memory keeps signing and archiving smooth; ~4W standby power suits 24/7 build nodes.