For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navigation principale

Migrez vers l’API Responses

L’API Responses est notre nouvelle primitive d’API. Cette évolution de Chat Completions simplifie vos intégrations et leur apporte de puissantes primitives agentiques.

Chat Completions reste pris en charge, mais Responses est recommandé pour tous les nouveaux projets.

À propos de l’API Responses

L’API Responses est une interface unifiée qui permet de créer des applications puissantes fonctionnant comme des agents. Elle propose :

Avantages de Responses

L’API Responses présente plusieurs avantages par rapport à Chat Completions :

  • De meilleures performances : les modèles de raisonnement, comme GPT-5, font preuve d’une plus grande intelligence avec Responses qu’avec Chat Completions. Nos évaluations internes montrent une amélioration de 3 % sur SWE-bench, avec le même prompt et la même configuration.
  • Un fonctionnement agentique par défaut : l’API Responses fonctionne comme une boucle agentique, permettant au modèle d’appeler plusieurs outils, comme web_search, image_generation, file_search, code_interpreter et des serveurs MCP distants, ainsi que vos propres fonctions personnalisées, au cours d’une seule requête API.
  • Des coûts réduits : une meilleure utilisation du cache réduit les coûts (amélioration de 40 % à 80 % par rapport à Chat Completions lors de tests internes).
  • Un contexte avec état : utilisez store: true pour maintenir l’état d’un tour à l’autre, en préservant le contexte du raisonnement et des outils.
  • Des entrées flexibles : transmettez une chaîne avec input ou une liste de messages ; utilisez instructions pour les consignes au niveau système.
  • Un raisonnement chiffré : désactivez la conservation de l’état tout en bénéficiant d’un raisonnement avancé.
  • Une API conçue pour l’avenir : prête pour les modèles à venir.
CapacitésAPI Chat CompletionsAPI Responses
Génération de texte
AudioBientôt disponible
Vision
Sorties structurées
Appel de fonction
Recherche web
Recherche de fichiers
Utilisation de l’ordinateur
Interpréteur de code
MCP
Génération d’images
Résumés du raisonnement

Exemples

Comparez l’API Responses à l’API Chat Completions dans des scénarios précis.

Messages et éléments

Les deux API permettent de générer facilement des sorties à partir de nos modèles. L’entrée et le résultat d’un appel à Chat Completions prennent la forme d’un tableau de messages, tandis que l’API Responses utilise des éléments. Un élément est une union de plusieurs types, qui représentent l’ensemble des actions possibles du modèle. Un message est un type d’élément, tout comme un function_call ou un function_call_output. Contrairement à un message Chat Completions, où plusieurs responsabilités sont regroupées dans un même objet, les éléments sont distincts les uns des autres et représentent mieux l’unité de base du contexte du modèle.

De plus, Chat Completions peut renvoyer plusieurs générations parallèles sous forme de choices, à l’aide du paramètre n. Dans Responses, nous avons supprimé ce paramètre : une seule génération est possible.

API Chat Completions
from openai import OpenAI

client = OpenAI()

completion = client.chat.completions.create(
    model="gpt-6-astra",
    messages=[
        {
            "role": "user",
            "content": "Write a one-sentence bedtime story about a unicorn.",
        }
    ],
)

print(completion.choices[0].message.content)
API Responses
from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-6-astra",
    input="Write a one-sentence bedtime story about a unicorn.",
)

print(response.output_text)

Les champs de la réponse renvoyée par l’API Responses diffèrent légèrement. Au lieu d’un message, vous recevez un objet response typé avec son propre id. Les réponses de Responses sont stockées par défaut. Celles de Chat Completions sont stockées par défaut pour les nouveaux comptes. Pour désactiver le stockage dans l’une ou l’autre API, définissez store: false.

Les objets renvoyés par ces API diffèrent légèrement. Avec Chat Completions, vous recevez un tableau de choices, chacun contenant un message. Avec Responses, vous recevez un tableau d’éléments nommé output.

API Chat Completions
{
  "id": "chatcmpl-C9EDpkjH60VPPIB86j2zIhiR8kWiC",
  "object": "chat.completion",
  "created": 1756315657,
  "model": "gpt-5.5",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Under a blanket of starlight, a sleepy unicorn tiptoed through moonlit meadows, gathering dreams like dew to tuck beneath its silver mane until morning.",
        "refusal": null,
        "annotations": []
      },
      "finish_reason": "stop"
    }
  ],
  ...
}
API Responses
{
  "id": "resp_68af4030592c81938ec0a5fbab4a3e9f05438e46b5f69a3b",
  "object": "response",
  "created_at": 1756315696,
  "model": "gpt-5.5",
  "output": [
    {
      "id": "rs_68af4030baa48193b0b43b4c2a176a1a05438e46b5f69a3b",
      "type": "reasoning",
      "content": [],
      "summary": []
    },
    {
      "id": "msg_68af40337e58819392e935fb404414d005438e46b5f69a3b",
      "type": "message",
      "status": "completed",
      "content": [
        {
          "type": "output_text",
          "annotations": [],
          "logprobs": [],
          "text": "Under a quilt of moonlight, a drowsy unicorn wandered through quiet meadows, brushing blossoms with her glowing horn so they sighed soft lullabies that carried every dreamer gently to sleep."
        }
      ],
      "role": "assistant"
    }
  ],
  ...
}

Autres différences

  • Les réponses de Responses sont stockées par défaut. Celles de Chat Completions sont stockées par défaut pour les nouveaux comptes. Pour désactiver le stockage dans l’une ou l’autre API, définissez store: false.
  • Les modèles de raisonnement bénéficient de fonctionnalités plus riches dans l’API Responses, avec une meilleure utilisation des outils. À partir de GPT-5.4, Chat Completions ne prend pas en charge les appels d’outils lorsque reasoning_effort a une valeur autre que none.
  • La structure de l’API pour les sorties structurées est différente. Dans Responses, utilisez text.format au lieu de response_format. Pour en savoir plus, consultez le guide des sorties structurées.
  • La structure de l’API pour les appels de fonctions est différente, tant pour la configuration des fonctions dans la requête que pour les appels de fonctions renvoyés dans la réponse. Consultez le guide des appels de fonctions pour connaître toutes les différences.
  • Le SDK Responses dispose d’un utilitaire output_text, absent du SDK Chat Completions.
  • Avec Chat Completions, vous devez gérer manuellement l’état de la conversation. L’API Responses est compatible avec l’API Conversations pour les conversations persistantes et permet aussi de transmettre un previous_response_id pour enchaîner facilement les réponses.

Migration depuis Chat Completions

Abordez la migration comme trois changements liés : envoyez les requêtes à /v1/responses, lisez les sorties dans un tableau output typé et choisissez comment votre application conservera l’état entre les tours.

1. Mettez à jour les points de terminaison de génération

Commencez par remplacer vos points de terminaison de génération post /v1/chat/completions par post /v1/responses.

Si vous n’utilisez ni fonctions ni entrées multimodales, les messages simples fournis en entrée sont compatibles d’une API à l’autre :

Réutilisez des messages simples en entrée
const context = [
  { role: "system", content: "You are a helpful assistant." },
  { role: "user", content: "Hello!" },
];

const completion = await client.chat.completions.create({
  model: "gpt-6-astra",
  messages: context,
});

const response = await client.responses.create({
  model: "gpt-6-astra",
  input: context,
});

Avec Chat Completions, vous créez un tableau messages et récupérez le texte du modèle dans completion.choices[0].message.content.
Générez du texte avec un modèle
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

const completion = await client.chat.completions.create({
  model: "gpt-6-astra",
  messages: [
    { role: "system", content: "You are a helpful assistant." },
    { role: "user", content: "Hello!" },
  ],
});
console.log(completion.choices[0].message.content);

2. Faites correspondre les messages aux éléments

Chat Completions utilise messages en entrée comme en sortie. Responses utilise des tableaux input et output d’éléments typés. message est un type d’élément, au même titre que reasoning, function_call et function_call_output.

Concept dans Chat CompletionsÉquivalent dans Responses
messages[]input, sous forme de chaîne ou de tableau d’éléments d’entrée
Instructions système ou développeurinstructions au premier niveau, ou des éléments de type message compatibles si vous devez conserver un historique de conversation existant
Message utilisateurUn élément d’entrée de type message avec role: "user"
Message de l’assistantUn élément de sortie de type message dans response.output ; transmettez-le à nouveau dans input si vous gérez l’état manuellement
Appel d’outil ou de fonctionUn élément de sortie de type function_call
Résultat d’un outil ou d’une fonctionUn élément d’entrée de type function_call_output, associé à l’appel par call_id
Générations multiples avec nNon disponible dans Responses ; envoyez des requêtes distinctes si vous avez besoin de plusieurs sorties candidates

Si vous avez uniquement besoin du texte final, utilisez l’utilitaire output_text du SDK. Si votre workflow utilise le raisonnement, des outils ou des sorties multimodales, parcourez response.output et traitez chaque élément selon son type.

3. Adaptez les conversations à plusieurs tours

Si votre application propose des conversations à plusieurs tours, adaptez votre logique de gestion du contexte. Responses offre trois options courantes pour gérer l’état :

  • Utilisez previous_response_id si vous souhaitez qu’OpenAI gère le contexte des réponses précédentes. Renvoyez les mêmes instructions à chaque requête, car previous_response_id ne reprend pas les instructions de premier niveau de la réponse précédente.
  • Transmettez à nouveau les éléments output précédents dans la requête suivante si vous devez gérer ou réduire vous-même le contexte.
  • Utilisez l’API Conversations si vous avez besoin d’un objet de conversation persistant.

Avec Chat Completions, vous stockez l’historique de la conversation et envoyez à chaque requête le tableau messages contenant tous les messages accumulés.
Conversation à plusieurs tours
let messages = [
  { role: "system", content: "You are a helpful assistant." },
  { role: "user", content: "What is the capital of France?" },
];
const res1 = await client.chat.completions.create({
  model: "gpt-6-astra",
  messages,
});

messages = messages.concat([res1.choices[0].message]);
messages.push({ role: "user", content: "And its population?" });

const res2 = await client.chat.completions.create({
  model: "gpt-6-astra",
  messages,
});

Même si vous utilisez previous_response_id, tous les tokens d’entrée précédents des réponses de la chaîne sont facturés comme tokens d’entrée dans l’API.

4. Déterminez quand conserver l’état

Les réponses de Responses sont stockées par défaut. Celles de Chat Completions le sont par défaut pour les nouveaux comptes. Pour désactiver le stockage dans l’une ou l’autre API, définissez store: false.

Certaines organisations, notamment celles soumises à une politique de non-conservation des données (ZDR), ne peuvent pas utiliser l’API Responses avec conservation de l’état en raison d’exigences de conformité ou de politiques de conservation des données. Pour répondre à ces besoins, OpenAI propose des éléments de raisonnement chiffrés, qui permettent de garder un workflow sans état tout en bénéficiant des éléments de raisonnement.

Pour désactiver la conservation de l’état tout en bénéficiant du raisonnement :

  • Définissez store: false dans le champ store.
  • Conservez et retransmettez chaque élément de raisonnement renvoyé. Chaque élément inclut encrypted_content par défaut lorsque vous créez une réponse.

L’API renvoie alors une version chiffrée des tokens de raisonnement, que vous pouvez retransmettre dans les requêtes suivantes comme des éléments de raisonnement ordinaires. Pour les organisations soumises à la ZDR, OpenAI impose automatiquement store: false. Lorsqu’une requête inclut encrypted_content, ce contenu est déchiffré en mémoire, utilisé pour générer la réponse suivante, puis supprimé de manière sécurisée. Tous les nouveaux tokens de raisonnement sont immédiatement chiffrés et vous sont renvoyés, ce qui garantit qu’aucun état intermédiaire n’est conservé.

5. Mettez à jour les définitions et les sorties des fonctions

La définition des fonctions présente deux différences mineures, mais notables, entre Chat Completions et Responses.

  1. Dans Chat Completions, les définitions de fonctions utilisent un étiquetage externe. Dans Responses, elles utilisent un étiquetage interne.
  2. Dans Chat Completions, les fonctions ne sont pas strictes par défaut. Dans Responses, si vous omettez strict, l’API tente d’utiliser le mode strict ; si le schéma ne peut pas être rendu compatible, Responses se rabat sur un appel de fonction non strict, sans garantie de conformité au schéma, et renvoie l’outil après résolution avec strict: false. Pour conserver explicitement le comportement non strict dans Responses, définissez strict: false.

L’exemple de fonction de l’API Responses à droite est fonctionnellement équivalent à celui de Chat Completions à gauche.

API Chat Completions
{
  "type": "function",
  "function": {
    "name": "get_weather",
    "description": "Determine weather in my location",
    "strict": true,
    "parameters": {
      "type": "object",
      "properties": {
        "location": {
          "type": "string"
        }
      },
      "additionalProperties": false,
      "required": [
        "location"
      ]
    }
  }
}
API Responses
{
  "type": "function",
  "name": "get_weather",
  "description": "Determine weather in my location",
  "parameters": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string"
      }
    },
    "additionalProperties": false,
    "required": [
      "location"
    ]
  }
}

Suivez les bonnes pratiques d’appel de fonction

Dans Responses, les appels d’outils et leurs sorties sont deux types d’éléments distincts, associés au moyen d’un call_id. Consultez la documentation sur l’appel de fonction pour en savoir plus sur le fonctionnement des appels de fonction dans Responses.

6. Mettez à jour les définitions des sorties structurées

Dans l’API Responses, les définitions des sorties structurées sont passées de response_format à text.format :

Sorties structurées
const completion = await openai.chat.completions.create({
  model: "gpt-6-astra",
  messages: [
    {
      role: "user",
      content: "Jane, 54 years old",
    },
  ],
  response_format: {
    type: "json_schema",
    json_schema: {
      name: "person",
      strict: true,
      schema: {
        type: "object",
        properties: {
          name: {
            type: "string",
            minLength: 1,
          },
          age: {
            type: "number",
            minimum: 0,
            maximum: 130,
          },
        },
        required: ["name", "age"],
        additionalProperties: false,
      },
    },
  },
  reasoning_effort: "medium",
});

7. Mettez à jour le code qui traite les flux

La diffusion en continu de Chat Completions renvoie des fragments incrémentaux contenant un champ delta. Celle de Responses utilise des événements typés envoyés par le serveur. Mettez à jour le code qui traite les flux pour qu’il adapte le traitement au type de chaque événement et gère les événements nécessaires à votre interface ou à votre couche d’orchestration.

Pour la diffusion de texte en continu, écoutez des événements tels que :

  • response.created
  • response.output_text.delta
  • response.completed
  • error

Les flux d’appels de fonction peuvent également émettre des événements tels que response.function_call_arguments.delta et response.function_call_arguments.done. Consultez le guide de la diffusion en continu avec Responses et la référence des événements de diffusion en continu de Responses.

8. Passez aux outils natifs

Si certains cas d’utilisation de votre application peuvent bénéficier des outils natifs d’OpenAI, vous pouvez modifier vos appels d’outils pour utiliser directement ces outils prêts à l’emploi.

Avec Chat Completions, vous ne pouvez pas utiliser nativement les outils hébergés par OpenAI et devez écrire votre propre intégration d’outils. Cet exemple utilise GPT-5.6, car GPT-6 Astra nécessite l’API Responses pour les appels d’outils.
Outil de recherche web
async function web_search(query) {
  const res = await fetch(`https://api.example.com/search?q=${query}`);
  const data = await res.json();
  return data.results;
}

const completion = await client.chat.completions.create({
  model: "gpt-5.6",
  messages: [
    { role: "system", content: "You are a helpful assistant." },
    { role: "user", content: "Who is the current president of France?" },
  ],
  functions: [
    {
      name: "web_search",
      description: "Search the web for information",
      parameters: {
        type: "object",
        properties: { query: { type: "string" } },
        required: ["query"],
      },
    },
  ],
});

9. Vérifiez les erreurs de migration courantes

Faites attention aux erreurs suivantes lors du passage de votre code de Chat Completions à Responses :

  • Lire choices[0].message.content au lieu de response.output_text ou de response.output.
  • Traiter chaque entrée de output comme un message. Le raisonnement, les appels d’outils et les appels de fonction correspondent à des types d’éléments distincts.
  • Omettre les éléments de raisonnement, d’appel de fonction ou de sortie d’appel de fonction lors de la transmission manuelle du contexte à la réponse suivante.
  • Envoyer le résultat d’une fonction sans le call_id correspondant.
  • Utiliser response_format dans une requête Responses au lieu de text.format.
  • Réutiliser le code qui traite les fragments de diffusion en continu de Chat Completions sans gérer les événements typés de Responses.
  • Supposer que previous_response_id supprime la facturation du contexte antérieur. Les tokens d’entrée précédents de la chaîne de réponses restent facturés comme des tokens d’entrée.

Liste de contrôle pour un déploiement progressif

Chat Completions reste pris en charge : vous pouvez donc migrer un parcours utilisateur à la fois.

  • Commencez par un workflow simple de génération de texte.
  • Mettez à jour le point de terminaison, le corps de la requête et le traitement des sorties.
  • Choisissez si le workflow utilise previous_response_id, le renvoi manuel des éléments ou l’API Conversations.
  • Si le workflow est sans état ou soumis à la politique ZDR, ajoutez store: false et incluez les éléments de raisonnement chiffrés lorsque le contexte de raisonnement doit être conservé d’un tour à l’autre.
  • Migrez les définitions de fonctions et vérifiez que les sorties des appels de fonction contiennent le bon call_id.
  • Déplacez les schémas de sorties structurées de response_format vers text.format.
  • Mettez à jour le code qui traite les flux pour qu’il gère les événements typés de Responses.
  • Remplacez l’orchestration personnalisée par des outils hébergés par OpenAI lorsqu’ils conviennent au workflow.
  • Comparez le comportement, la latence, la consommation de tokens et les erreurs avant d’acheminer davantage de trafic vers Responses.

Nous recommandons de migrer progressivement tous les workflows vers l’API Responses pour profiter des dernières fonctionnalités et améliorations d’OpenAI.

API Assistants

À partir des retours des développeurs sur la version bêta de l’API Assistants, nous avons apporté des améliorations majeures à l’API Responses pour la rendre plus flexible, plus rapide et plus facile à utiliser. L’API Responses est la voie d’avenir pour créer des agents sur OpenAI.

L’API Assistants a été officiellement arrêtée le 26 août 2026 et n’est plus disponible. Suivez le guide de migration pour adapter votre intégration à l’API Responses.