For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegación principal
Theme

Compactación

Gestiona conversaciones prolongadas con la compactación en el servidor y la compactación independiente.

Descripción general

En interacciones prolongadas, puedes usar la compactación para reducir el tamaño del contexto y conservar el estado necesario para los turnos posteriores.

A medida que se alargan las conversaciones, la compactación te ayuda a equilibrar la calidad, el costo y la latencia. Para saber cómo conservar el razonamiento al modificar el historial de la conversación, consulta Mantener el prefijo sin cambios.

Compactación en el servidor

Puedes habilitar la compactación en el servidor en una solicitud de creación de respuestas de la API Responses (POST /responses o client.responses.create). Para ello, configura context_management con compact_threshold.

  • Cuando la cantidad de tokens del contexto renderizado supera el umbral configurado, el servidor ejecuta la compactación.
  • En este modo no necesitas hacer una llamada por separado a /responses/compact.
  • El flujo de respuesta incluye el elemento de compactación cifrado.
  • La compactación en el servidor es compatible con la retención cero de datos (ZDR) si estableces store=false en tus solicitudes de creación de respuestas de la API Responses.

El elemento de compactación que devuelve el servidor conserva la información esencial del estado y del razonamiento previos para la siguiente ejecución y ocupa menos tokens. Su contenido es opaco y no está diseñado para que lo interpreten las personas.

Si encadenas solicitudes sin mantener estado mediante arreglos de entrada, agrega los elementos de salida como de costumbre. Si usas previous_response_id, envía solo el mensaje nuevo del usuario en cada turno. En ambos casos, el elemento de compactación conserva el contexto necesario para la siguiente ventana.

Una vez que hayas agregado los elementos de salida al arreglo de entrada anterior, puedes descartar los elementos que precedan al elemento de compactación más reciente. Así reduces el tamaño de las solicitudes y la latencia en los casos más lentos. El elemento de compactación más reciente conserva el contexto necesario para continuar la conversación. Si encadenas solicitudes con previous_response_id, no elimines elementos manualmente.

Pasos para usar la compactación en el servidor

  1. Llama a /responses como de costumbre e incluye context_management con compact_threshold para habilitar la compactación en el servidor.
  2. Si el tamaño del contexto supera el umbral durante la transmisión de la respuesta, el servidor ejecuta la compactación, emite un elemento de compactación como salida en el mismo flujo y recorta el contexto antes de continuar con la inferencia.
  3. Continúa el ciclo con uno de estos métodos. Si encadenas solicitudes sin mantener estado, agrega la salida, incluidos los elementos de compactación, al siguiente arreglo de entrada. Si encadenas solicitudes con previous_response_id, envía solo el mensaje nuevo del usuario en cada turno y pasa el ID de la respuesta al turno siguiente.

Ejemplo de uso

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();
}

Punto de acceso de compactación independiente

Para controlar cuándo se realiza la compactación sin estado en flujos de trabajo prolongados, usa el punto de acceso de compactación independiente.

Este punto de acceso funciona completamente sin estado y es compatible con ZDR.

Envía una ventana de contexto completa con los mensajes, las herramientas y los demás elementos. El punto de acceso devuelve una nueva ventana de contexto compactada que puedes enviar en tu siguiente llamada a /responses.

La ventana compactada que recibes incluye un elemento de compactación cifrado que conserva la información esencial del estado y del razonamiento previos y ocupa menos tokens. Su contenido es opaco y no está diseñado para que lo interpreten las personas.

Por lo general, la ventana compactada contiene otros elementos además del elemento de compactación. También puede incluir elementos que se conservaron de la ventana anterior.

Al procesar la salida de /responses/compact, no elimines ningún elemento. La ventana que recibes es la que debes usar como siguiente ventana de contexto. Envíala tal como la recibiste en tu siguiente llamada a /responses.

Pasos para usar la compactación independiente

  1. Usa /responses como de costumbre y envía elementos de entrada que incluyan mensajes del usuario, salidas del asistente e interacciones con herramientas.
  2. Cuando tu ventana de contexto alcance un tamaño considerable, llama a /responses/compact para generar una nueva ventana de contexto compactada. El contexto que envíes a /responses/compact debe caber en la ventana de contexto de tu modelo.
  3. En las llamadas posteriores a /responses, envía como entrada la ventana compactada que recibiste, incluido el elemento de compactación, en lugar de la transcripción completa.

Ejemplo de uso

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);