L'API OpenAI Decisions est un point de terminaison POST /v1/decisions, fonctionnant sur GPT-6 Luna, qui prend du texte ou des images ainsi qu'une liste de questions et renvoie des réponses typées au lieu de prose : une probabilité de prédicat, un choix avec des probabilités par option, ou un score sur des niveaux ordonnés. Les entrées coûtent 0,10 $ par million de jetons sans sortie, sans frais de lecture ou d'écriture de cache, et le point de terminaison est en bêta publique depuis le 06-10-2026, OpenAI annonçant une disponibilité générale prévue "dans les prochaines semaines".
Cet article couvre ce que le point de terminaison renvoie, son coût, sa place par rapport aux sorties structurées et à l'appel de fonction, et comment le tester. Pour le guide pas à pas avec curl, Python et JavaScript, lisez ensuite comment utiliser l'API OpenAI Decisions ; si vous utilisez déjà l'API Responses, la comparaison Decisions vs Responses montre le même travail effectué des deux manières. Tout au long, nous utiliserons Apidog pour stocker la clé, enregistrer les requêtes et effectuer des assertions sur le tableau answers afin qu'un changement de comportement du modèle fasse échouer un test au lieu de mal acheminer un ticket.
Anatomie d'une requête et d'une réponse Decisions
Trois champs de requête, trois champs de réponse. Pas d'id, pas de texte généré, rien à analyser.
| Partie | Champ | Contenu |
|---|---|---|
| Requête | model |
gpt-6-luna, le seul modèle disponible aujourd'hui |
| Requête | input |
Une chaîne de caractères, ou un tableau de messages utilisateur dont le contenu mélange des parties input_text et input_image |
| Requête | questions |
Un tableau de questions, chacune avec un type, des instructions requises et un name optionnel |
| Requête | safety_identifier |
ID d'utilisateur final optionnel, jusqu'à 128 caractères |
| Réponse | model |
Écho de gpt-6-luna |
| Réponse | answers |
Une entrée par question, dans l'ordre où vous l'avez posée, avec type et name |
| Réponse | usage |
input_tokens, input_tokens_details, output_tokens, output_tokens_details, total_tokens |
Notez ce qui manque : pas de temperature, reasoning, stream, store, tools ou text.format. Pour ceux-ci, vous voulez l'API Responses. Et output_tokens est 0 dans l'exemple de référence d'OpenAI, c'est pourquoi la tarification ci-dessous n'a pas de ligne de sortie.
Les trois types de questions
Chaque question a son propre type, et vous pouvez mélanger les types sur une même entrée. Posez des questions indépendantes dans la même requête ; pour les décisions qui dépendent d'une réponse antérieure, le guide d'OpenAI indique d'envoyer des requêtes séparées.
predicate : une probabilité oui/non
Un prédicat demande si une condition est vraie et renvoie une probabilité de 0 à 1 qu'elle le soit.
curl https://api.openai.com/v1/decisions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6-luna",
"input": "The box arrived crushed and the screen is cracked.",
"questions": [
{"type": "predicate", "name": "damaged",
"instructions": "Is the product described as damaged?"}
]
}'
L'exemple de référence d'OpenAI pour cette forme renvoie :
{
"model": "gpt-6-luna",
"answers": [
{"type": "predicate", "name": "damaged", "probability": 0.95}
],
"usage": {
"input_tokens": 42,
"input_tokens_details": {"cached_tokens":0,"cache_write_tokens":0},
"output_tokens": 0,
"output_tokens_details": {"reasoning_tokens":0},
"total_tokens": 42
}
}
choice : une étiquette d'un ensemble non ordonné
Un choix ajoute un tableau choices d'objets {value, description} : 2 à 255 choix uniques, où value est une chaîne de caractères ou un booléen (true et "true" sont distincts). OpenAI recommande une option de repli comme other lorsque vos catégories ne couvrent pas toutes les entrées.
{
"model": "gpt-6-luna",
"input": "I was charged twice for my order.",
"questions": [
{"type": "choice", "name": "department",
"instructions": "Which team should handle this ticket?",
"choices": [
{"value":"billing"}, {"value":"technical"},
{"value":"shipping"}, {"value":"other"}
]}
]
}
La réponse illustrative du guide pour cette entrée :
{"type": "choice", "name": "department", "choice": "billing",
"probabilities": [
{"value":"billing","probability":0.95},
{"value":"technical","probability":0.02},
{"value":"shipping","probability":0.01},
{"value":"other","probability":0.02}
],
"confidence": 0.93}
score : une position sur une échelle ordonnée
Un score ajoute des levels, un tableau d'objets {label, description} ordonnés du plus bas au plus haut. Les indices commencent à 0, et le score renvoyé est la moyenne pondérée par les probabilités de ces indices, il peut donc se situer entre les niveaux.
{
"model": "gpt-6-luna",
"input": "Export fails in Safari but works in Chrome.",
"questions": [
{"type": "score", "name": "severity",
"instructions": "How badly does this bug block the user?",
"levels": [
{"label":"Cosmetic"},
{"label":"Workaround available"},
{"label":"Fully blocked"}
]}
]
}
Dans l'exemple du guide, les probabilités sont de 0,1, 0,7 et 0,2 pour les trois niveaux, donnant un score de 1,1 et une confidence de 0,55. Lisez 1,1 comme "entre le niveau 1 et le niveau 2, proche de 1". La règle du guide : choice pour les catégories non ordonnées comme les départements ; score pour les niveaux ordonnés comme la gravité.
Un quatrième type de réponse, refusal, peut apparaître pour toute question unique sous la forme {"type":"refusal","name":...}. D'autres questions dans la même requête peuvent toujours obtenir des réponses, donc utilisez une branche sur type avant de lire un champ.
Vitesse, telle que décrite par OpenAI
OpenAI affirme que l'API Decisions est environ 10 fois plus rapide que l'API Responses ; l'annonce le formule comme étant jusqu'à 10 fois plus rapide que GPT-6 Luna via Responses. OpenAI ne publie pas de chiffre de latence absolue. Un développeur sur le forum d'OpenAI a signalé des décisions basées sur des images renvoyées en environ 0,8 seconde sur une connexion lente : une anecdote, pas un benchmark. Mesurez votre propre p95 avant de promettre quoi que ce soit.
Tarification : 0,10 $ par million de jetons d'entrée, rien d'autre
Avec gpt-6-luna, les entrées coûtent 0,10 $ par million de jetons. Vous ne payez que pour les jetons d'entrée : il n'y a pas de frais de lecture de cache, d'écriture de cache ou de jetons de sortie. L'objet usage contient les champs cached_tokens et cache_write_tokens, mais selon une réponse sur le forum des développeurs d'OpenAI, il n'y a pas encore de mise en cache sur Decisions, attendez-vous donc à 0.
Deux multiplicateurs s'appliquent. Les entrées de plus de 272 000 jetons sont facturées à 2x, ce qui représente 0,20 $ par million (dérivé du multiplicateur de contexte long de la page de tarification). Le traitement régional via les points de terminaison de résidence des données aux États-Unis ou en Europe ajoute 10 %. Aucun niveau Batch, Flex ou Fast n'est documenté pour /v1/decisions, ne prévoyez donc pas de réduction qui n'existe que sur Responses.
Voici le calcul pour une charge de travail de routage de support. Un ticket de 500 jetons avec trois questions dans une seule requête coûte 500 / 1 000 000 x 0,10 $ = 0,00005 $. Un million de ces tickets coûte 50 $. Le même ticket via l'API Responses avec une étiquette JSON de 40 jetons à 0,50 $ par million de sorties ajoute 40 / 1 000 000 x 0,50 $ = 0,00002 $ par requête en plus de l'entrée, avant les jetons de raisonnement, que Luna facture comme sortie sur Responses et Decisions ne facture pas du tout. La formulation honnête est "Decisions ne facture aucun jeton de sortie", pas un pourcentage. Pour le tarif complet de Luna et ce que le mise en cache des prompts fait sur Responses, voir qu'est-ce que GPT-6 Luna.
Quand utiliser Decisions, les sorties structurées ou l'appel de fonction
OpenAI trace la ligne elle-même : utilisez les sorties structurées avec l'API Responses lorsque vous avez besoin d'un objet qui suit votre propre schéma JSON, comme des champs extraits ou une explication écrite, ou l'appel de fonction lorsque vous avez besoin que le modèle demande un appel d'outil avec des arguments. Decisions est destiné à classer du contenu, à router des requêtes et à prioriser le travail.
| Vous avez besoin de | Utilisez |
|---|---|
| Une étiquette, une probabilité ou une gravité avec une confiance | API Decisions |
| Un objet dans votre propre schéma JSON (champs extraits, une explication) | Sorties structurées sur Responses |
| Que le modèle choisisse un outil et remplisse ses arguments | Appel de fonction sur Responses |
| Streaming, état de conversation, outils, mise en cache ou Batch | API Responses |
Une énumération de sorties structurées peut renvoyer une étiquette. Elle ne peut pas renvoyer une distribution de probabilité ou un champ confidence à moins que vous ne demandiez au modèle d'en écrire un, et alors il s'agit de texte généré, pas d'une probabilité mesurée. Decisions vous donne des nombres que vous pouvez seuiller. OpenAI vous dit de définir ces seuils à partir d'exemples étiquetés dans votre propre application, en pesant le coût des faux positifs par rapport aux faux négatifs, car aucune donnée de précision ou de calibration n'est publiée. Vous envisagez un deuxième fournisseur de décisions typées ? La comparaison Decisions vs Jev couvre le prix, les entrées et les formes de sortie côte à côte.
Images, et la mise en garde Base64
input accepte les messages utilisateur dont le contenu mélange des parties input_text et input_image, avec un detail optionnel de low, high, auto (par défaut) ou original. Le guide indique que les images doivent être des URL de données base64 intégrées ; les URL hébergées et file_id ne sont pas pris en charge. La référence API liste également les URL HTTP(S) accessibles publiquement, jusqu'à 128 images par requête. Considérez base64 comme le chemin documenté et testez une URL hébergée avant de vous y fier.
Contrôles des données
L'API Decisions prend en charge la Rétention Zéro de Données et l'utilisation HIPAA pour les clients éligibles. La résidence des données et le traitement régional sont pris en charge aux États-Unis et en Europe (EEE plus Suisse) via us.api.openai.com et eu.api.openai.com. Le point de terminaison est accessible depuis toutes les régions API prises en charge, bien que la disponibilité dans une région n'implique pas que l'inférence y soit exécutée. Les journaux de surveillance des abus sont conservés jusqu'à 30 jours par défaut. Si vous acheminez des messages de patients, lisez d'abord notre guide de conformité API HIPAA.
Disponibilité : bêta maintenant, disponibilité générale bientôt
Le point de terminaison est passé en bêta publique pour tous les développeurs le 06-10-2026 et se trouve sous "Beta APIs" dans la référence. Le guide d'OpenAI indique que la disponibilité générale est prévue "dans les prochaines semaines" ; aucune date n'est donnée. Les exemples SDK nécessitent Python 3.26.0, JavaScript 7.30.0, Go 3.73.0, Ruby 0.101.0 ou Java 4.78.0 ou version ultérieure ; l'appel est client.decisions.create(...) en Python et JavaScript. Un Playground à platform.openai.com/decisions vous permet d'essayer des questions avant d'écrire du code. Aucune limite de débit spécifique à Decisions n'est publiée ; vérifiez les limites de votre organisation. Il n'y a pas de niveau Decisions gratuit ; pour un accès gratuit à Luna, consultez notre article sur les routes gratuites de Luna.
Tester les appels Decisions dans Apidog
Les réponses typées sont faciles à vérifier, c'est tout l'intérêt. Trois étapes couvrent la plupart des équipes.
Stockez la clé une seule fois. Placez OPENAI_API_KEY dans une variable d'environnement Apidog et référencez {{OPENAI_API_KEY}} dans l'en-tête Authorization: Bearer, afin que la clé littérale n'atterrisse jamais dans une requête partagée.
Enregistrez une requête par type de question, avec des assertions JSONPath : statut 200, $.answers[0].type égal à choice, $.answers[0].choice égal à billing, $.answers[0].confidence supérieur à 0,8, $.answers[?(@.name=='damaged')].probability supérieur à 0,9, et $.usage.output_tokens égal à 0, ce qui permet de détecter une surprise de facturation avant votre facture.
Choisissez des seuils à partir d'un ensemble étiqueté. Créez un scénario de test dans Apidog qui exécute la même requête sur un CSV de texte de ticket et de service attendu, puis définissez le seuil de routage automatique là où le coût des faux positifs dépasse le coût de la file d'attente de révision. Exécutez-le en CI avec l'Apidog CLI afin qu'un changement de modèle ou d'alias fasse échouer un test au lieu d'un client. Le guide pratique couvre chaque étape, y compris la simulation du tableau answers afin que le frontend puisse être construit avant que le routeur ne soit finalisé.
FAQ
L'API Decisions est-elle un nouveau modèle ? Non. C'est un point de terminaison, POST /v1/decisions, qui fonctionne sur GPT-6 Luna. Luna a été lancé le 22-09-2026 ; le point de terminaison est passé en bêta publique le 06-10-2026.
Combien coûte l'API Decisions ? 0,10 $ par million de jetons d'entrée sans frais de sortie, de lecture ou d'écriture de cache. Les entrées de plus de 272 000 jetons sont facturées à 2x, et le traitement régional ajoute 10 %.
Renvoie-t-elle mon propre schéma JSON ? Non. Elle renvoie des answers avec des champs probability, choice ou score. Pour votre propre schéma, utilisez les sorties structurées sur l'API Responses.
Quelle est sa précision ? OpenAI ne publie aucune donnée de précision ou de calibration. Définissez les seuils à partir de vos propres données étiquetées ; un scénario de test LLM basé sur les données est la méthode pratique.
Par où commencer
Choisissez une décision de routage que votre application prend aujourd'hui avec une expression régulière ou une boucle prompt-and-parse, écrivez-la comme une seule question de type choice avec un repli other, et exécutez-la sur 50 exemples étiquetés. Si la distribution de confiance se sépare clairement, vous avez un seuil et un test. Si ce n'est pas le cas, la question nécessite des critères plus précis. Pour exécuter cette expérience avec des requêtes enregistrées et des assertions, téléchargez Apidog et importez le curl ci-dessus.
