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

Compactage

Gérez les conversations de longue durée grâce au compactage côté serveur ou autonome.

Vue d’ensemble

Lors d’interactions de longue durée, le compactage permet de réduire la taille du contexte tout en conservant l’état nécessaire aux échanges suivants.

À mesure que la conversation s’allonge, le compactage vous aide à trouver un équilibre entre qualité, coût et latence. Pour savoir comment préserver le raisonnement lorsque vous modifiez l’historique de la conversation, consultez le guide Conserver le préfixe inchangé.

Compactage côté serveur

Pour activer le compactage côté serveur dans une requête de création de réponse de l’API Responses (POST /responses ou client.responses.create), configurez context_management en y indiquant compact_threshold.

  • Lorsque le nombre de tokens du contexte après rendu dépasse le seuil configuré, le serveur compacte le contexte.
  • Dans ce mode, aucun appel distinct à /responses/compact n’est nécessaire.
  • Le flux de réponse contient l’élément de compactage chiffré.
  • Le compactage côté serveur est compatible avec la politique de non-conservation des données (ZDR) si vous définissez store=false dans vos requêtes de création de réponse de l’API Responses.

L’élément de compactage renvoyé transmet à l’exécution suivante les informations essentielles de l’état et du raisonnement antérieurs, avec moins de tokens. Son contenu est opaque et n’est pas conçu pour être interprété par une personne.

Pour enchaîner des requêtes sans état à l’aide de tableaux d’entrée, ajoutez les éléments de sortie comme d’habitude. Si vous utilisez previous_response_id, transmettez uniquement le nouveau message de l’utilisateur à chaque tour. Dans les deux cas, l’élément de compactage contient le contexte nécessaire à la fenêtre suivante.

Une fois les éléments de sortie ajoutés à la suite des éléments d’entrée précédents, vous pouvez supprimer tout ce qui précède le dernier élément de compactage. Vous réduisez ainsi la taille des requêtes et la latence des appels les plus lents. Le dernier élément de compactage contient le contexte nécessaire pour poursuivre la conversation. Si vous enchaînez les requêtes avec previous_response_id, ne supprimez aucun élément manuellement.

Déroulement du compactage côté serveur

  1. Appelez /responses comme d’habitude, en incluant context_management avec compact_threshold pour activer le compactage côté serveur.
  2. Si la taille du contexte dépasse le seuil pendant la transmission de la réponse, le serveur déclenche le compactage, émet un élément de compactage dans le même flux de sortie et réduit le contexte avant de poursuivre l’inférence.
  3. Pour poursuivre la boucle, choisissez l’une des deux méthodes. Pour enchaîner les requêtes sans état, ajoutez les éléments de sortie, y compris les éléments de compactage, à votre prochain tableau d’entrée. Pour les enchaîner avec previous_response_id, transmettez uniquement le nouveau message de l’utilisateur à chaque tour et reprenez l’identifiant de la réponse précédente.

Exemple de mise en œuvre

import OpenAI from "openai";
import { toResponseInputItems } from "openai/lib/responses/ResponseInputItems";
import { createInterface } from "node:readline";

const client = new OpenAI();

const conversation = [
  {
    type: "message",
    role: "user",
    content: "Let's begin a long coding task.",
  },
];

// Subscribe before generation so piped follow-up turns are not lost.
const lines = createInterface({ input: process.stdin, crlfDelay: Infinity });
const turns = lines[Symbol.asyncIterator]();

async function respond() {
  const response = await client.responses.create({
    model: "gpt-5.3-codex",
    input: conversation,
    store: false,
    context_management: [{ type: "compaction", compact_threshold: 200_000 }],
  });

  conversation.push(...toResponseInputItems(response.output));
  console.log(response.output_text);
}

try {
  await respond();
  for await (const line of turns) {
    if (!line.trim()) continue;
    conversation.push({ type: "message", role: "user", content: line });
    await respond();
  }
} finally {
  lines.close();
}

Point de terminaison de compactage autonome

Pour choisir quand compacter le contexte dans un workflow de longue durée, utilisez le point de terminaison de compactage autonome, qui fonctionne sans état.

Ce point de terminaison est entièrement sans état et compatible avec la politique de non-conservation des données (ZDR).

Envoyez une fenêtre de contexte complète (messages, outils et autres éléments). Le point de terminaison renvoie une nouvelle fenêtre de contexte compactée que vous pouvez transmettre lors de votre prochain appel à /responses.

La fenêtre compactée renvoyée contient un élément de compactage chiffré qui conserve les informations essentielles de l’état et du raisonnement antérieurs avec moins de tokens. Le contenu de cet élément est opaque et n’est pas conçu pour être interprété par une personne.

En général, la fenêtre compactée ne contient pas uniquement l’élément de compactage. Elle peut aussi conserver des éléments de la fenêtre précédente.

Ne supprimez aucun élément de la sortie de /responses/compact. La fenêtre renvoyée constitue votre prochaine fenêtre de contexte. Transmettez-la telle quelle lors de votre prochain appel à /responses.

Déroulement du compactage autonome

  1. Utilisez /responses comme d’habitude en envoyant des éléments d’entrée qui comprennent les messages de l’utilisateur, les sorties de l’assistant et les interactions avec les outils.
  2. Lorsque votre fenêtre de contexte devient volumineuse, appelez /responses/compact pour générer une nouvelle fenêtre de contexte compactée. La fenêtre que vous envoyez à /responses/compact doit encore tenir dans la fenêtre de contexte de votre modèle.
  3. Lors des appels suivants à /responses, transmettez en entrée la fenêtre compactée renvoyée, y compris l’élément de compactage, à la place de l’historique complet des échanges.

Exemple de mise en œuvre

import OpenAI from "openai";

const client = new OpenAI();

const conversation = [{ role: "user", content: "Plan a trip to Kyoto." }];

const compacted = await client.responses.compact({
  model: "gpt-6-astra",
  input: conversation,
});

const nextInput = [
  ...compacted.output.map((item) => item),
  { role: "user", content: "Add two more days to the itinerary." },
];

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

console.log(response.output_text);