Cómo mantener conversaciones y agentes largos sin perder el contexto importante
Responses API ofrece varias formas de conservar estado entre turnos. Puedes encadenar respuestas con previous_response_id, utilizar Conversations para persistir items en el servidor y aplicar compaction cuando el historial crece demasiado. La clave es conservar decisiones, IDs, resultados de tools y objetivos activos sin reenviar indefinidamente todo el historial.
Context management en Responses API: guía completa para conversaciones y agentes
Context management en Responses API: compaction, Conversations y contexto largo
Aprende a mantener conversaciones y agentes de larga duración sin reenviar indefinidamente todo el historial, perder decisiones importantes o alcanzar el límite de contexto de forma inesperada.
Context management en Responses API es el conjunto de decisiones que determinan qué información recibe el modelo en cada turno, cómo se conserva el estado y qué hacer cuando una conversación crece durante horas, días o cientos de ejecuciones.
En una aplicación sencilla, enviar unos cuantos mensajes anteriores puede ser suficiente. Sin embargo, un agente que utiliza herramientas, recupera archivos, crea tareas y mantiene objetivos durante muchos turnos necesita una estrategia más sólida.
OpenAI ofrece varias piezas para resolver este problema. Puedes encadenar
Responses mediante previous_response_id, guardar items dentro
de una Conversation y aplicar compaction cuando el historial se vuelve
demasiado grande.
El problema del contexto largo en agentes de IA
Cada modelo tiene una ventana de contexto finita. Por tanto, una conversación no puede crecer indefinidamente sin que llegue un momento en el que necesites eliminar, resumir o compactar información anterior.
Además, el problema no es únicamente técnico. Un contexto más grande puede aumentar el número de tokens procesados. Asimismo, cuanto más ruido incluyes, más difícil puede resultar mantener clara la tarea principal.
Más historial
Cada turno añade mensajes, resultados de herramientas, decisiones y datos recuperados.
Más tokens
Reenviar información antigua una y otra vez puede aumentar el volumen de entrada procesado.
Más ruido
Información que ya no afecta al objetivo puede competir con instrucciones y datos realmente importantes.
Turno 2 · Turno 3
cada vez mayor
+ límite de contexto
Tres formas de mantener estado con Responses API
No existe una única estrategia. La mejor opción depende de si quieres que OpenAI gestione el hilo, si necesitas control manual o si tu aplicación debe funcionar de manera stateless.
| Enfoque | Cómo funciona | Cuándo usarlo |
|---|---|---|
| previous_response_id | Cada nueva Response referencia la Response anterior. | Chats sencillos y secuencias lineales de varios turnos. |
| Conversation | Un objeto Conversation almacena items y las nuevas Responses se añaden automáticamente. | Hilos persistentes, agentes, productos con sesión y CRM. |
| Estado manual | Tu aplicación decide qué output items devolver en el siguiente input. | store:false, Zero Data Retention o control avanzado. |
conversation y
previous_response_id son alternativas en una misma petición.
La referencia oficial de Responses indica que no pueden utilizarse
simultáneamente.Cómo usar previous_response_id
Para una conversación lineal, previous_response_id
es una de las formas más sencillas de continuar un turno anterior.
Primero creas una Response. Después, utilizas su ID en la siguiente petición. De esta forma, Responses API puede continuar la conversación sin que tengas que reconstruir manualmente todos los mensajes.
from openai import OpenAI
client = OpenAI()
first = client.responses.create(
model="gpt-5.6",
instructions="Eres un asistente técnico para una aplicación SaaS.",
input="Mi cliente utiliza PostgreSQL y Redis."
)
second = client.responses.create(
model="gpt-5.6",
instructions="Eres un asistente técnico para una aplicación SaaS.",
previous_response_id=first.id,
input="¿Qué arquitectura de caché recomendarías?"
)
print(second.output_text)
La referencia actual de Responses API aclara que las
instructions del Response anterior no se heredan
automáticamente cuando continúas mediante
previous_response_id.
Ventajas
Muy sencillo
Solo necesitas guardar el ID de la Response anterior para continuar una secuencia.
Bueno para chats lineales
Funciona bien cuando cada nuevo turno deriva directamente del anterior.
Cuándo se queda corto
Si el producto necesita sesiones que sobreviven durante días, varias interfaces accediendo al mismo hilo o una gestión explícita de items, suele ser más natural utilizar Conversations.
Cómo utilizar Conversations API
Conversations API crea un objeto persistente al que puedes asociar diferentes Responses. Además, puedes añadir metadata para relacionar la conversación con tu propia aplicación.
Cuando una Response incluye el identificador de la Conversation, los items existentes se añaden al contexto de la petición. Después, los inputs y outputs nuevos se incorporan automáticamente a esa Conversation.
from openai import OpenAI
client = OpenAI()
conversation = client.conversations.create(
metadata={
"customer_id": "customer_482",
"channel": "support"
}
)
print(conversation.id)response = client.responses.create(
model="gpt-5.6",
conversation=conversation.id,
instructions=(
"Ayuda al usuario con su cuenta. "
"No inventes datos que no existan en el contexto."
),
input="Estoy intentando configurar el webhook de pagos."
)
print(response.output_text)
next_response = client.responses.create(
model="gpt-5.6",
conversation=conversation.id,
instructions=(
"Ayuda al usuario con su cuenta. "
"No inventes datos que no existan en el contexto."
),
input="El endpoint ya responde 200. ¿Qué debería validar ahora?"
)
print(next_response.output_text)conv_123
input + output
continúa estado
Qué guarda realmente una Conversation
Una Conversation no debe imaginarse solamente como una lista de mensajes. Responses API trabaja con items, y esos items pueden representar diferentes partes de una ejecución.
Por tanto, un agente puede mantener más que texto. Según la operación, el contexto puede incluir mensajes, llamadas a herramientas, resultados y otros items compatibles con Responses API.
Mensajes
Instrucciones del usuario y salidas visibles que forman parte de la conversación.
Tool calls
Acciones que el modelo decidió ejecutar durante un flujo agentic.
Tool outputs
Resultados que posteriormente pueden ser relevantes para decisiones del agente.
Qué es compaction en Responses API
Compaction está diseñada para conversaciones y flujos de larga duración. En lugar de seguir enviando un historial completo cada vez más grande, puedes ejecutar una pasada de compactación.
El endpoint actual es POST /responses/compact.
El resultado contiene los mensajes de usuario correspondientes
y un item de compaction con contenido cifrado.
Ese item es opaco. En consecuencia, tu aplicación no debería intentar interpretar su estructura interna ni convertirlo en una fuente de información para la interfaz.
+ tools + resultados
/compact
reutilizable
Cuándo resulta útil
Agentes largos
Procesos que realizan muchas acciones antes de completar el objetivo.
Tool-heavy workflows
Sesiones que acumulan múltiples llamadas y resultados de herramientas.
Chats persistentes
Conversaciones donde todavía necesitas información importante de turnos antiguos.
Cómo compactar una conversación paso a paso
El patrón general es sencillo. Primero conservas los items relevantes del flujo. Después, llamas al endpoint de compaction. Finalmente, reutilizas el output compacto como parte del siguiente input.
Acumula estado útil
Conserva mensajes, outputs y resultados necesarios para continuar el trabajo.
Decide el momento de compactar
Hazlo antes de que la conversación se aproxime peligrosamente al límite del modelo.
Llama a responses.compact
Envía el estado que quieres comprimir utilizando un modelo compatible.
Guarda el output compacto
Trata el item de compaction como contenido opaco.
Continúa la tarea
Usa ese estado reducido junto con el siguiente input del usuario.
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5.6",
input="Diseña la arquitectura inicial de un CRM con agentes."
)
history = [
{
"role": "user",
"content": "Diseña la arquitectura inicial de un CRM con agentes."
},
*[item.model_dump() for item in response.output]
]
compacted = client.responses.compact(
model="gpt-5.6",
input=history
)
compact_state = [
item.model_dump()
for item in compacted.output
]
next_response = client.responses.create(
model="gpt-5.6",
input=[
*compact_state,
{
"role": "user",
"content": "Ahora agrega facturación y permisos por equipo."
}
]
)
print(next_response.output_text)OpenAI continúa ampliando Responses API y context management. En producción, utiliza la versión actual del SDK y revisa la referencia del endpoint antes de desplegar.
Context management automático en Responses API
Además del endpoint manual de compaction, la referencia actual
de responses.create expone una configuración
context_management.
Esta configuración incluye un umbral de compactación. Por tanto, la API puede ayudarte a definir cuándo debe intervenir la gestión de contexto en lugar de depender únicamente de lógica personalizada en tu backend.
Manual
Tu backend mide el estado y decide exactamente cuándo llamar
a /responses/compact.
- Máximo control.
- Más lógica propia.
- Fácil de instrumentar con reglas internas.
Context management
La propia petición configura la estrategia de gestión y su umbral de compactación.
- Menos orquestación manual.
- Más integrado con Responses API.
- Revisa siempre el schema vigente.
Arquitectura recomendada para un agente de larga duración
Una buena arquitectura separa tres tipos de memoria. Primero, utiliza el contexto del modelo para el trabajo inmediato. Después, usa Conversations o estado equivalente para continuidad. Finalmente, guarda hechos duraderos en tu propia base de datos.
Contexto activo
Objetivo actual, últimos turnos, resultados recientes y herramientas necesarias para la siguiente decisión.
Estado conversacional
Conversation, previous response o items compactados que permiten continuar el hilo.
Memoria de negocio
Clientes, pedidos, permisos, preferencias y hechos que deben sobrevivir aunque cambies de conversación.
hechos duraderos
contexto activo
del agente
Qué debes conservar cuando el agente utiliza herramientas
Los agentes de producción no generan únicamente texto. También llaman APIs, consultan bases de datos y ejecutan acciones. Por eso, el contexto importante incluye resultados operativos.
Conserva
- Objetivo activo.
- Acciones ya completadas.
- IDs creados por herramientas.
- Resultados que afectan decisiones futuras.
- Supuestos todavía vigentes.
- Bloqueos no resueltos.
Reduce cuando sea posible
- Logs repetitivos.
- Resultados enormes ya procesados.
- Mensajes sociales sin impacto futuro.
- Opciones descartadas definitivamente.
- Datos duplicados.
- Explicaciones intermedias innecesarias.
Ejemplo
Si un agente creó una orden con ID ord_7281,
ese identificador puede ser importante diez turnos después.
En cambio, probablemente no necesitas conservar cada campo
de la respuesta JSON original si ya guardaste la orden en tu base de datos.
Qué cambia con store:false o Zero Data Retention
Algunas aplicaciones no quieren depender del estado almacenado por Responses API. En ese caso, tu backend debe reenviar los items relevantes en los turnos posteriores.
La guía actual de modelos de OpenAI recomienda preservar los output items relevantes cuando administras el historial manualmente. Esto es especialmente importante en flujos de razonamiento y tools.
devuelve items
guarda estado
reenvía items
Compaction vs prompt caching: resuelven problemas diferentes
Prompt caching y compaction pueden parecer similares porque ambos ayudan con prompts grandes. Sin embargo, no hacen lo mismo.
| Característica | Compaction | Prompt caching |
|---|---|---|
| Objetivo | Reducir el estado necesario para continuar. | Reutilizar prefijos de input repetidos. |
| Modifica el estado | Sí, genera un estado compacto. | No sustituye el contenido lógico del prompt. |
| Uso ideal | Conversaciones y agentes largos. | Instrucciones y contexto repetido entre requests. |
| Beneficio principal | Controlar crecimiento del contexto. | Mejorar eficiencia de inputs repetidos. |
Por tanto, una aplicación puede utilizar ambas estrategias. Puedes mantener un prompt estable que aproveche caching y, al mismo tiempo, compactar una conversación cuando su estado crece demasiado.
Por qué truncation no debería ser tu estrategia principal
Responses API todavía expone truncation en su referencia,
aunque actualmente aparece como deprecado.
Con la opción automática, el sistema puede eliminar items del principio cuando el input supera la ventana disponible. El problema es que esos items antiguos pueden contener una decisión o ID que siga siendo crítico.
Truncar elimina contexto. Compaction intenta conservar la información relevante en un estado comprimido para continuar. Por eso, una estrategia de producción debería preferir gestión intencional del estado.
Cómo reducir tokens sin perder memoria útil
La optimización no consiste en eliminar información al azar. Primero debes identificar qué datos siguen afectando las decisiones futuras.
Separa hechos de conversación
Guarda datos duraderos en tu propia base de datos en lugar de depender de mensajes antiguos.
Evita outputs gigantes de tools
Filtra o transforma resultados antes de introducirlos al contexto cuando no necesitas todos los campos.
Compacta después de hitos
Un buen momento puede ser al finalizar una fase importante del workflow.
Mide usage
Registra tokens de entrada y salida para detectar conversaciones que crecen demasiado rápido.
Conserva IDs y decisiones
Reducir contexto nunca debería borrar el estado operativo necesario para continuar.
Ejemplo: agente de soporte que dura varios días
Imagina un agente que resuelve una incidencia compleja. Durante el primer día consulta documentación y crea un ticket. Después, el segundo día revisa logs y ejecuta una prueba. Finalmente, el tercer día recibe la confirmación del cliente.
diagnóstico + ticket
conserva estado
continúa caso
El agente no necesita recordar cada frase del primer día. Sin embargo, sí debe conservar el ID del ticket, el diagnóstico, las acciones realizadas, el error pendiente y el siguiente paso.
Esa diferencia entre “historial completo” y “estado útil” es el centro de una buena estrategia de context management.
Errores frecuentes al gestionar contexto
Reenviar todo para siempre
El historial puede crecer sin control y añadir coste y ruido.
Confundir Conversation con base de datos
Los hechos permanentes del negocio deberían vivir también en tu infraestructura.
Compactar después del límite
Gestiona el crecimiento antes de que la petición ya no pueda procesarse.
Intentar leer el compaction item
Debe tratarse como estado opaco destinado a futuras peticiones.
Perder IDs de herramientas
El agente puede recordar la conversación pero quedarse sin el identificador necesario para continuar.
Confiar en truncation
Eliminar items antiguos sin estrategia puede borrar información todavía necesaria.
Checklist de context management para producción
- Definiste si usarás Conversation, previous_response_id o estado manual.
- No utilizas conversation y previous_response_id en la misma petición.
- Guardas el conversation_id o response_id en tu backend.
- Los datos permanentes viven también en una base de datos.
- Conservas IDs producidos por tools.
- Guardas decisiones y acciones completadas.
- El agente conoce los bloqueos todavía abiertos.
- Mides crecimiento de tokens por sesión.
- Compactas antes de acercarte demasiado al límite de contexto.
- Tratas el compaction item como contenido opaco.
- No dependes de truncation para proteger el estado.
- Reenvías instructions cuando utilizas previous_response_id y siguen siendo necesarias.
- Pruebas conversaciones mucho más largas que un demo normal.
- Simulas múltiples tool calls antes de publicar.
- Revisas la versión actual del SDK y Responses API.
La memoria de un agente no debería depender de un solo lugar
Una aplicación robusta utiliza diferentes capas de estado. El modelo necesita contexto inmediato para decidir. La Conversation necesita continuidad entre turnos. Sin embargo, la empresa también necesita datos persistentes y consultables.
Por ejemplo, el nombre de un cliente, su plan y su saldo no deberían existir únicamente porque aparecieron cien mensajes atrás. Esos datos pertenecen a una base estructurada.
Cómo encaja con la migración desde Assistants API
Si vienes de Assistants API, el cambio conceptual más importante es dejar de pensar únicamente en Threads y Runs. En Responses API puedes separar estado, ejecución y herramientas de una manera más flexible.
Para entender esa transición completa, consulta también: cómo migrar Assistants API a Responses API paso a paso .
Preguntas frecuentes sobre context management en Responses API
¿Qué es context management en Responses API?
Es la estrategia para decidir qué estado recibe el modelo, cómo se conserva entre turnos y cómo se controla el crecimiento de conversaciones largas.
¿Qué es una Conversation en OpenAI?
Es un objeto que almacena items de conversación y puede asociarse a múltiples Responses para mantener continuidad.
¿Qué ocurre cuando envío conversation en responses.create?
Los items existentes de esa Conversation se incorporan al contexto y los nuevos inputs y outputs se añaden automáticamente cuando finaliza la Response.
¿Qué es previous_response_id?
Es el ID de una Response anterior que puedes utilizar para continuar una conversación multi-turno.
¿Puedo usar conversation y previous_response_id juntos?
No. La referencia actual de Responses API indica que ambos parámetros no se utilizan simultáneamente.
¿Las instructions anteriores se heredan con previous_response_id?
No necesariamente. La documentación actual indica que las instructions de la Response anterior no se arrastran automáticamente a la siguiente.
¿Qué es compaction?
Es un proceso que comprime el estado anterior para permitir que un flujo largo continúe con una huella de contexto menor.
¿Cuál es el endpoint de compaction?
OpenAI documenta actualmente
POST /responses/compact.
¿Puedo leer el contenido interno de una compaction?
No deberías depender de él. El contenido cifrado del item debe tratarse como opaco.
¿Compaction es lo mismo que prompt caching?
No. Compaction reduce estado conversacional. Prompt caching optimiza la reutilización de prefijos de input.
¿Compaction reemplaza una base de datos?
No. Datos de negocio duraderos deberían almacenarse en una base estructurada de tu aplicación.
¿Qué pasa con store:false?
Tu aplicación debe administrar y reenviar los output items relevantes para continuar el estado de forma manual.
¿Conviene compactar en cada turno?
Normalmente no. Conviene hacerlo cuando el crecimiento del contexto lo justifique o después de hitos importantes.
¿Debo usar truncation:auto?
No como estrategia principal. Además, la referencia actual marca truncation como deprecado. Una gestión intencional del estado ofrece mayor control.
Conclusión
Responses API ofrece varias herramientas para construir conversaciones y agentes que duran mucho más que unos cuantos turnos.
Para un chat lineal, previous_response_id puede ser suficiente.
En cambio, Conversations resulta útil cuando necesitas un hilo persistente
y múltiples Responses asociadas al mismo caso.
Cuando el estado se hace demasiado grande, compaction permite reducir la huella del historial sin depender únicamente de eliminar los primeros mensajes.
Finalmente, conserva la información de negocio en tu propia base de datos. Así, el modelo mantiene una memoria de trabajo eficiente, mientras tu aplicación conserva una fuente de verdad estable.
Fuentes oficiales consultadas
¿Quieres construir un agente de IA que pueda trabajar durante horas o días?
En Zadrig Technology podemos ayudarte a diseñar aplicaciones con Responses API, Conversations, tools, MCP, bases de datos y agentes con memoria de trabajo controlada para evitar arquitecturas que pierdan contexto o crezcan sin límite.
Hablar con Zadrig Technology →
