L’API Responses est notre nouvelle interface de génération. Elle fait évoluer Chat Completions pour simplifier vos intégrations et vous donner accès à de puissantes primitives pour créer des agents.
Nous continuons à prendre en charge Chat Completions et recommandons Responses pour tout nouveau projet.
Présentation de l’API Responses
L’API Responses offre une interface unifiée pour créer des applications capables d’agir comme des agents. Elle propose notamment :
Des échanges sur plusieurs tours où vous pouvez transmettre les réponses précédentes pour obtenir des résultats de raisonnement plus précis.
La prise en charge multimodale native du texte et des images.
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 obtiennent de meilleurs résultats avec Responses qu’avec Chat Completions. À prompt et configuration identiques, nos évaluations internes montrent une amélioration de 3 % sur SWE-bench.
Une boucle d’agent par défaut : au cours d’une seule requête API, le modèle peut appeler plusieurs outils, comme web_search, image_generation, file_search, code_interpreter, des serveurs MCP distants ou encore vos propres fonctions.
Des coûts réduits : Responses exploite mieux le cache, ce qui réduit les coûts. Nos tests internes montrent une amélioration de 40 à 80 % de l’utilisation du cache par rapport à Chat Completions.
Un contexte conservé entre les tours : utilisez store: true pour conserver l’état d’un tour à l’autre, y compris le contexte du raisonnement et des outils.
Des entrées flexibles : transmettez une chaîne de caractères ou une liste de messages dans le champ input. Utilisez le champ instructions pour donner des consignes au niveau système.
Un raisonnement chiffré : utilisez les capacités de raisonnement avancées sans stocker l’état.
Une API conçue pour les futurs modèles : Responses est prévue pour prendre en charge les modèles à venir.
Fonctionnalités
API Chat Completions
API Responses
Génération de texte
Audio
Bientôt disponible
Vision
Sorties structurées
Appel de fonction
Recherche web
Recherche dans les fichiers
Utilisation de l’ordinateur
Interpréteur de code
MCP
Génération d’images
Résumés du raisonnement
Exemples
Comparez le fonctionnement de l’API Responses et de l’API Chat Completions dans quelques cas concrets.
Messages et éléments
Les deux API permettent de générer du contenu avec nos modèles. Un appel à Chat Completions prend en entrée et renvoie en sortie un tableau de messages, tandis que l’API Responses utilise des éléments. Un élément peut être de plusieurs types selon l’action du modèle qu’il représente. Un message est un type d’élément, tout comme function_call ou function_call_output. Dans Chat Completions, un message regroupe plusieurs informations de nature différente dans un même objet. Dans Responses, chaque élément est distinct et représente plus fidèlement une unité de contexte du modèle.
Chat Completions peut également renvoyer plusieurs générations en parallèle dans choices grâce au paramètre n. L’API Responses ne propose pas ce paramètre et ne renvoie qu’une seule génération.
API Chat Completions
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15from openai import OpenAIclient = 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)
1
2
3
4
5
6
7
8
9
10
11
12
13require "openai"client = OpenAI::Client.newcompletion = client.chat.completions.create( model: "gpt-6-astra", messages: [ { role: :user, content: "Write a one-sentence bedtime story about a unicorn." } ])puts(completion.choices.fetch(0).message.content)
API Responses
Python
1
2
3
4
5
6
7
8
9
10from openai import OpenAIclient = OpenAI()response = client.responses.create(model="gpt-6-astra",input="Write a one-sentence bedtime story about a unicorn.",)print(response.output_text)
1
2
3
4
5
6
7
8require "openai"client = OpenAI::Client.newresponse = client.responses.create( model: "gpt-6-astra", input: "Write a one-sentence bedtime story about a unicorn.")puts(response.output_text)
Les champs d’une réponse de l’API Responses sont légèrement différents. À la place d’un message, vous recevez un objet response typé avec son propre id. Responses stocke les réponses par défaut. Chat Completions les stocke par défaut pour les nouveaux comptes. Pour désactiver le stockage dans l’une ou l’autre API, définissez store: false.
La structure des objets renvoyés varie légèrement selon l’API. Avec Chat Completions, vous recevez un tableau choices dont chaque entrée contient un message. Avec Responses, vous recevez un tableau d’éléments dans le champ output.
Chat Completions API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19{"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" } ],...}
Responses API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29{"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
Responses stocke les réponses par défaut. Chat Completions les stocke par défaut pour les nouveaux comptes. Pour désactiver le stockage dans l’une ou l’autre API, définissez store: false.
L’API Responses offre davantage de possibilités aux modèles de raisonnement, notamment grâce à une meilleure utilisation des outils. À partir de GPT-5.4, Chat Completions ne prend en charge les appels d’outils que si reasoning_effort vaut none.
La configuration des sorties structurées diffère entre les deux API. À la place de response_format, utilisez text.format dans Responses. Consultez le guide des sorties structurées pour en savoir plus.
Le format des appels de fonction diffère également, tant pour la configuration des fonctions dans la requête que pour les appels renvoyés dans la réponse. Consultez le guide de l’appel de fonction pour comparer les deux formats en détail.
Le SDK Responses fournit un utilitaire output_text qui n’existe pas dans le SDK Chat Completions.
Avec Chat Completions, vous devez gérer vous-même l’état de la conversation. Avec l’API Responses, vous pouvez utiliser l’API Conversations pour les conversations persistantes ou transmettre un previous_response_id pour enchaîner les réponses.
Migration depuis Chat Completions
La migration comporte trois changements liés : envoyez les requêtes à /v1/responses, lisez la sortie dans le tableau output d’éléments typés et choisissez comment votre application transmettra l’état d’un tour à l’autre.
1. Mettez à jour les points de terminaison de génération
Commencez par remplacer post /v1/chat/completions par post /v1/responses pour vos requêtes de génération.
Si vous n’utilisez ni fonctions ni entrées multimodales, vous pouvez transmettre les mêmes messages d’entrée aux deux API lorsqu’ils contiennent uniquement du texte :
Réutilisation de messages d’entrée contenant uniquement du texte
Chat Completions utilise messages en entrée comme en sortie. Responses utilise les tableaux input et output, qui contiennent des éléments typés. Un message est un type d’élément parmi d’autres, comme reasoning, function_call et function_call_output.
Concept dans Chat Completions
Équivalent dans Responses
messages[]
input, sous forme de chaîne de caractères ou de tableau d’éléments d’entrée
Consignes système ou développeur
Champ instructions au premier niveau, ou éléments de type message compatibles si vous devez conserver un historique existant
Message utilisateur
Élément d’entrée de type message avec role: "user"
Message de l’assistant
Élément de sortie de type message dans response.output. Renvoyez-le dans input si vous gérez vous-même l’état
Appel d’outil ou de fonction
Élément de sortie de type function_call
Résultat d’un outil ou d’une fonction
Élément d’entrée de type function_call_output, associé à l’appel par call_id
Générations multiples avec n
Indisponibles dans Responses. Envoyez des requêtes distinctes si vous avez besoin de plusieurs réponses candidates
Si vous avez seulement besoin du texte final, utilisez l’utilitaire output_text du SDK. Si votre workflow fait appel au raisonnement, à des outils ou à des sorties multimodales, parcourez response.output et traitez chaque élément selon son type.
3. Adaptez les conversations sur plusieurs tours
Si votre application gère des conversations sur plusieurs tours, adaptez la manière dont elle transmet le contexte. Responses propose trois façons courantes de 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 instructions qui restent valables à chaque requête, car previous_response_id ne reprend pas les instructions de premier niveau de la réponse précédente.
Transmettez 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.
Chat Completions
Avec Chat Completions, conservez l’historique et envoyez à chaque requête le tableau messages contenant tous les messages échangés.
Conversation sur plusieurs tours
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16let messages = [ { role: "system", content: "You are a helpful assistant." }, { role: "user", content: "What is the capital of France?" },];constres1=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?" });constres2=await client.chat.completions.create({ model: "gpt-6-astra", messages,});
1
2
3
4
5
6
7
8
9
10messages = [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "What is the capital of France?"},]res1 = client.chat.completions.create(model="gpt-6-astra", messages=messages)messages += [res1.choices[0].message]messages += [{"role": "user", "content": "And its population?"}]res2 = client.chat.completions.create(model="gpt-6-astra", messages=messages)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24import com.openai.client.OpenAIClient;import com.openai.client.okhttp.OpenAIOkHttpClient;import com.openai.models.chat.completions.ChatCompletionCreateParams;var params = ChatCompletionCreateParams.builder() .model("gpt-6-astra") .addSystemMessage("You are a helpful assistant.") .addUserMessage("What is the capital of France?") .build();var first = client.chat().completions().create(params);var second = client .chat() .completions() .create( params.toBuilder() .addAssistantMessage(first.choices().get(0).message().content().orElseThrow()) .addUserMessage("And its population?") .build());second.choices().stream() .flatMap(choice -> choice.message().content().stream()) .forEach(System.out::println);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18using OpenAI.Chat;string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;string model = "gpt-6-astra";ChatClient client = new(model, key);List<ChatMessage> messages =[ new SystemChatMessage("You are a helpful assistant."), new UserChatMessage("What is the capital of France?"),];ChatCompletion first = await client.CompleteChatAsync(messages);messages.Add(new AssistantChatMessage(first));messages.Add(new UserChatMessage("And its population?"));ChatCompletion second = await client.CompleteChatAsync(messages);Console.WriteLine(second.Content[0].Text);
Avec Responses, vous pouvez transmettre vous-même les sorties d’une réponse en entrée de la requête suivante.
Conversation sur plusieurs tours
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19import { toResponseInputItems } from"openai/lib/responses/ResponseInputItems";let context = [{ role: "user", content: "What is the capital of France?" }];constres1=await client.responses.create({ model: "gpt-6-astra", input: context,});// Append the first response’s output to contextcontext = context.concat(toResponseInputItems(res1.output));// Add the next user messagecontext.push({ role: "user", content: "And its population?" });constres2=await client.responses.create({ model: "gpt-6-astra", input: context,});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16context = [{"role": "user", "content": "What is the capital of France?"}]res1 = client.responses.create( model="gpt-6-astra", input=context,)# Append the first response's output to contextcontext += res1.output# Add the next user messagecontext += [{"role": "user", "content": "And its population?"}]res2 = client.responses.create( model="gpt-6-astra", input=context,)
Vous pouvez aussi utiliser previous_response_id pour référencer la réponse précédente et enchaîner les réponses ou créer plusieurs branches à partir d’une même réponse.
Conversation sur plusieurs tours
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12constres1=await client.responses.create({ model: "gpt-6-astra", input: "What is the capital of France?", store: true,});constres2=await client.responses.create({ model: "gpt-6-astra", input: "And its population?", previous_response_id: res1.id, store: true,});
1
2
3
4
5
6
7
8
9
10res1 = client.responses.create( model="gpt-6-astra", input="What is the capital of France?", store=True)res2 = client.responses.create( model="gpt-6-astra", input="And its population?", previous_response_id=res1.id, store=True,)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17using OpenAI.Responses;#pragma warning disable OPENAI001string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;ResponsesClient client = new(key);ResponseResult first = await client.CreateResponseAsync( "gpt-6-astra", "What is the capital of France?");ResponseResult second = await client.CreateResponseAsync( "gpt-6-astra", "And its population?", previousResponseId: first.Id);Console.WriteLine(second.GetOutputText());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18require "openai"client = OpenAI::Client.newfirst = client.responses.create( model: "gpt-6-astra", input: "What is the capital of France?", store: true)second = client.responses.create( model: "gpt-6-astra", previous_response_id: first.id, input: "And its population?", store: true)puts(second.output_text)
Même avec previous_response_id, l’API facture comme tokens d’entrée tous les tokens d’entrée des réponses précédentes de la chaîne.
4. Choisissez quand stocker l’état
Responses stocke les réponses par défaut. Chat Completions les stocke 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 stockage de l’état en raison de leurs obligations de conformité ou de leurs règles de conservation des données. OpenAI propose donc des éléments de raisonnement chiffrés que vous pouvez utiliser dans un workflow sans état.
Pour désactiver le stockage de l’état tout en continuant à utiliser le raisonnement :
Conservez et retransmettez chaque élément de raisonnement renvoyé. Lorsque vous créez une réponse, chacun de ces éléments contient par défaut encrypted_content.
L’API renvoie alors une version chiffrée des tokens de raisonnement. Vous pouvez la transmettre dans vos prochaines requêtes comme vous le feriez pour des éléments de raisonnement ordinaires.
Pour les organisations soumises à la politique ZDR, OpenAI impose automatiquement store: false. Lorsqu’une requête contient encrypted_content, OpenAI déchiffre son contenu en mémoire, l’utilise pour générer la réponse suivante, puis l’efface de manière sécurisée. OpenAI chiffre immédiatement tout nouveau token de raisonnement et vous le renvoie, sans conserver d’état intermédiaire.
5. Mettez à jour les définitions et les sorties des fonctions
Les définitions de fonctions diffèrent sur deux points entre Chat Completions et Responses :
Dans Chat Completions, le champ indiquant le type se trouve à l’extérieur de l’objet qui définit la fonction. Dans Responses, ce champ se trouve dans l’objet lui-même.
Dans Chat Completions, les fonctions utilisent le mode non strict par défaut. Dans Responses, si vous omettez strict, l’API tente d’appliquer le mode strict. Si elle ne peut pas rendre le schéma compatible, elle effectue l’appel de fonction en mode non strict, sans garantir le respect du schéma, et renvoie la configuration effective de l’outil avec strict: false. Pour conserver explicitement le mode non strict dans Responses, définissez strict: false.
L’exemple de fonction de l’API Responses, à droite, a le même comportement que celui de Chat Completions, à gauche.
Suivez les bonnes pratiques pour les appels de fonction
Dans Responses, les appels d’outils et leurs sorties correspondent à deux types d’éléments distincts, reliés par un call_id. Consultez la documentation sur l’appel de fonction pour en savoir plus sur son fonctionnement dans Responses.
6. Mettez à jour les définitions des sorties structurées
Dans l’API Responses, les définitions des sorties structurées passent de response_format à text.format :
En mode streaming, Chat Completions renvoie des fragments successifs contenant un champ delta. Responses utilise des événements typés envoyés par le serveur. Adaptez le code qui lit le flux pour distinguer les événements selon leur type et traiter ceux dont votre interface ou votre couche d’orchestration a besoin.
Pour recevoir du texte en streaming, écoutez notamment les événements suivants :
Si les outils natifs d’OpenAI répondent à certains besoins de votre application, adaptez vos appels d’outils pour les utiliser directement.
Chat Completions
Avec Chat Completions, les outils hébergés par OpenAI ne sont pas accessibles nativement. Vous devez écrire votre propre intégration.
Cet exemple utilise GPT-5.6 Terra avec le raisonnement désactivé. Pour appeler des outils avec GPT-6 Astra ou GPT-6.1 Sol, vous devez utiliser l’API Responses.
Outil de recherche web
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25asyncfunctionweb_search(query) {constres=awaitfetch(`https://api.example.com/search?q=${query}`);constdata=await res.json();return data.results;}constcompletion=await client.chat.completions.create({ model: "gpt-5.6-terra", reasoning_effort: "none", 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"], }, }, ],});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import requestsdef web_search(query): r = requests.get(f"https://api.example.com/search?q={query}") return r.json().get("results", [])completion = client.chat.completions.create( model="gpt-5.6-terra", reasoning_effort="none", 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"], }, } ],)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34package mainimport ( "context" "fmt" "github.com/openai/openai-go/v3" "github.com/openai/openai-go/v3/shared")func main() { client := openai.NewClient() completion, err := client.Chat.Completions.New(context.Background(), openai.ChatCompletionNewParams{ Model: "gpt-5.6-terra", Messages: []openai.ChatCompletionMessageParamUnion{ openai.SystemMessage("You are a helpful assistant."), openai.UserMessage("Who is the current president of France?"), }, Functions: []openai.ChatCompletionNewParamsFunction{{ Name: "web_search", Description: openai.String("Search the web for information"), Parameters: map[string]any{ "type": "object", "properties": map[string]any{"query": map[string]any{"type": "string"}}, "required": []string{"query"}, }, }}, ReasoningEffort: shared.ReasoningEffortNone, }) if err != nil { panic(err) } fmt.Println(completion.Choices[0].Message)}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33import com.openai.client.OpenAIClient;import com.openai.client.okhttp.OpenAIOkHttpClient;import com.openai.core.JsonValue;import com.openai.models.FunctionParameters;import com.openai.models.ReasoningEffort;import com.openai.models.chat.completions.ChatCompletionCreateParams;import java.util.List;import java.util.Map;ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() .model("gpt-5.6-terra") .reasoningEffort(ReasoningEffort.NONE) .addSystemMessage("You are a helpful assistant.") .addUserMessage("Who is the current president of France?") .addFunction( ChatCompletionCreateParams.Function.builder() .name("web_search") .description("Search the web for information") .parameters( FunctionParameters.builder() .putAdditionalProperty("type", JsonValue.from("object")) .putAdditionalProperty( "properties", JsonValue.from(Map.of("query", Map.of("type", "string")))) .putAdditionalProperty("required", JsonValue.from(List.of("query"))) .build()) .build()) .build();client.chat().completions().create(params).choices().stream() .map(choice -> choice.message()) .forEach(System.out::println);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31require "openai"client = OpenAI::Client.newcompletion = client.chat.completions.create( model: "gpt-5.6-terra", reasoning_effort: :none, 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"] } } ])puts(completion.choices.fetch(0).message)
Avec Responses, vous pouvez préciser quels outils vous souhaitez que le modèle utilise.
Outil de recherche web
JavaScript
1
2
3
4
5
6
7constanswer=await client.responses.create({ model: "gpt-6-astra", input: "Who is the current president of France?", tools: [{ type: "web_search" }],});console.log(answer.output_text);
1
2
3
4
5
6
7answer = client.responses.create( model="gpt-6-astra", input="Who is the current president of France?", tools=[{"type": "web_search"}],)print(answer.output_text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import com.openai.client.OpenAIClient;import com.openai.client.okhttp.OpenAIOkHttpClient;import com.openai.models.responses.ResponseCreateParams;import com.openai.models.responses.WebSearchTool;ResponseCreateParams params = ResponseCreateParams.builder() .model("gpt-6-astra") .input("Who is the current president of France?") .addTool(WebSearchTool.builder().type(WebSearchTool.Type.WEB_SEARCH).build()) .build();client.responses().create(params).output().stream() .flatMap(item -> item.message().stream()) .flatMap(message -> message.content().stream()) .flatMap(content -> content.outputText().stream()) .forEach(text -> System.out.println(text.text()));
1
2
3
4
5
6
7
8
9
10
11
12
13
14using OpenAI.Responses;#pragma warning disable OPENAI001string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;ResponsesClient client = new(key);CreateResponseOptions options = new() { Model = "gpt-6-astra" };options.Tools.Add(ResponseTool.CreateWebSearchTool());options.InputItems.Add( ResponseItem.CreateUserMessageItem("Who is the current president of France?"));ResponseResult response = await client.CreateResponseAsync(options);Console.WriteLine(response.GetOutputText());
1
2
3
4
5
6
7
8
9
10
11require "openai"client = OpenAI::Client.newresponse = client.responses.create( model: "gpt-6-astra", input: "Who is the current president of France?", tools: [{ type: :web_search }])puts(response.output_text)
1
2
3
4
5
6
7
8curl https://api.openai.com/v1/responses \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -d '{ "model": "gpt-6-astra", "input": "Who is the current president of France?", "tools": [{"type": "web_search"}] }'
9. Vérifiez les erreurs de migration courantes
Lorsque vous migrez votre code de Chat Completions vers Responses, vérifiez qu’il ne présente aucune des erreurs suivantes :
Lire choices[0].message.content au lieu de response.output_text ou 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 des éléments de raisonnement, des appels de fonction ou leurs sorties lorsque vous transmettez vous-même le contexte pour générer 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 flux de Chat Completions sans prendre en charge les événements typés de Responses.
Supposer que previous_response_id dispense de payer pour le contexte antérieur. Les tokens d’entrée des réponses précédentes de la chaîne restent facturés comme tokens d’entrée.
Liste de vérification pour un déploiement progressif
Chat Completions reste pris en charge. Vous pouvez donc migrer un parcours utilisateur à la fois.
Commencez par un parcours de génération de texte.
Mettez à jour le point de terminaison, le corps de la requête et le traitement de la sortie.
Choisissez comment gérer l’état du parcours : utilisez previous_response_id, retransmettez vous-même les éléments ou utilisez l’API Conversations.
Si le parcours fonctionne sans état ou relève de la politique ZDR, ajoutez store: false et incluez les éléments de raisonnement chiffrés lorsque le contexte de raisonnement doit être transmis d’un tour à l’autre.
Migrez les définitions des fonctions et vérifiez que les sorties des appels de fonction contiennent le bon call_id.
Déplacez les schémas des sorties structurées de response_format vers text.format.
Adaptez le code qui lit les flux pour qu’il traite les événements typés de Responses.
Remplacez votre logique d’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 de diriger davantage de trafic vers Responses.
Nous vous recommandons de migrer progressivement tous vos parcours vers l’API Responses pour bénéficier 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é plusieurs améliorations importantes à l’API Responses pour la rendre plus flexible, plus rapide et plus simple à utiliser. C’est sur l’API Responses que s’appuie désormais le développement d’agents sur la plateforme OpenAI.
L’API Assistants a été officiellement retirée le 26 août 2026 et n’est plus disponible. Suivez le guide de migration pour adapter votre intégration à l’API Responses.