programa
La primera vez que le di a GPT-6 Astra una herramienta lenta y otra rápida en el mismo turno, esperaba un bucle sincrónico tradicional: pediría la herramienta lenta y bloquearía mi código mientras todos esperábamos. La documentación de llamadas asíncronas a herramientas de OpenAI decía que Astra podía seguir trabajando, pero no me terminaba de convencer. La aplicación sigue gestionando el trabajo en segundo plano, así que el uso asíncrono no elimina la orquestación. La cuestión es si cambia lo suficiente como para que merezca la pena.
Nuestro resumen de GPT-6 Astra cubre el lanzamiento y los benchmarks, y nuestra guía GPT-6 Astra vs. Claude Fable 5.1 compara su rendimiento y precios con su mayor competidor. En este tutorial, pondremos a trabajar a GPT-6 Astra para crear un flujo de comprobación de releases con una suite de tests, un endpoint de salud y una comprobación de navegador fija. En demos separadas veremos uso del ordenador redactado por el modelo y steering a mitad de turno.
Verás cómo:
- Hacer una llamada a la API de GPT-6 Astra
- Crear un bucle sincrónico de llamadas a herramientas como base
- Pasar las comprobaciones lentas a llamadas asíncronas
- Ejecutar una comprobación de uso del ordenador con límites
- Comparar steering con una base de finalizar y reiniciar por WebSocket
- Subir el esfuerzo de razonamiento solo para el diagnóstico final
- Devolver un informe go/no-go validado con salidas estructuradas
- Calcular bien el coste de la API, incluidas escrituras en caché
- Seguir la ejecución en vivo en Streamlit
- Manejar los edge cases que crean los trabajos async
Resumen
GPT-6 Astra añade tres funciones de API al bucle estándar de Responses: llamadas asíncronas a herramientas, steering a mitad de turno por WebSockets y cambios del esfuerzo de razonamiento a mitad de conversación. Cuatro conclusiones al combinarlas en un único agente de release-check cambiaron cómo lo construiría.
- Las llamadas async redujeron el tiempo de espera, no el trabajo del modelo: el número de turnos sigue dependiendo de la secuencia de llamadas del modelo.
- El steering tardó menos que la base de finalizar y reiniciar, aunque la prueba no comparó todas las políticas de reinicio.
- Un mayor esfuerzo de razonamiento no cambia necesariamente el diagnóstico, aunque use más tokens de razonamiento.
- Ejecutar comprobaciones en paralelo puede destapar condiciones de carrera que una versión secuencial ocultaría.
Estos resultados aplican a este release check, no a todas las cargas de trabajo con agentes. La duración de las herramientas, el estado compartido y el número de turnos que toma el modelo pueden cambiar el resultado.
Trabajar con la API de OpenAI
¿Qué es la API de GPT-6 Astra?
La API de GPT-6 Astra es la forma de acceder al nuevo modelo insignia de OpenAI, lanzado el 3 de septiembre de 2026, a través de la Responses API. Para este tutorial, lo importante es la superficie: gpt-6-astra acepta texto e imágenes a través de la Responses API de OpenAI. Su esfuerzo de razonamiento va de low a max, sin opción none.
Los ejemplos de este tutorial usan client.responses.create en lugar de client.chat.completions.create, pero migrar también exige cambios en los formatos de petición, salida y resultados de herramientas. Elimina los ajustes personalizados de temperature, top_p y probabilidades logarítmicas, ya que Astra no los admite. Antes de la primera llamada, veamos los precios.
¿Cuánto cuesta GPT-6 Astra?
Para peticiones con hasta 272.000 tokens de entrada, la tarifa estándar es de 10 $ por cada millón de tokens de entrada ordinarios y 50 $ por cada millón de tokens de salida. La entrada en caché cuesta 1 $ por millón, y las escrituras en caché 12,50 $ por millón.
Si una petición supera ese umbral, OpenAI aplica un multiplicador de 2x a las tarifas de entrada y caché, y de 1,5x a la tarifa de salida. Las tarifas más altas se aplican a toda la petición, no solo a los tokens que exceden el umbral. Ninguna de las ejecuciones de este tutorial se acercó al umbral.
¿Qué vamos a construir con la API de GPT-6 Astra?
La app de staging es un pequeño panel de tareas en Flask: una página de inicio, un formulario para añadir tareas, un botón para marcarlas como hechas y un endpoint /health . El código completo, incluida la app de staging, está en este repositorio de GitHub.

Tres tareas precargadas aparecen antes de las pruebas. Imagen del autor.
La app tiene un fallo intencional. El agente ejecuta tres comprobaciones, pero solo la suite de tests está diseñada para detectarlo.
¿Por qué la app acepta títulos de tareas en blanco?
El endpoint de creación de tareas no rechaza un título vacío. Dejé ese comportamiento para que el agente tenga un fallo conocido que encontrar sin desvelarlo en el prompt.
¿Qué comprobaciones de release puede ejecutar el agente?
El agente puede llamar a tres herramientas:
-
run_test_suiteejecuta pytest, con una prueba de importación masiva de unas 250 peticiones HTTP. -
check_ui_flowusa Playwright para añadir una tarea y confirmar que aparece. -
check_staging_healthenvía una petición GET a/health.
Las tres corren contra staging, sin mocks. La comprobación de navegador usa código fijo; la demo de uso del ordenador redactada por el modelo viene después.
Cómo configurar la API de GPT-6 Astra en Python
Necesitas una clave de la API de OpenAI con acceso a gpt-6-astra. Crea una clave en platform.openai.com/api-keys y comprueba que tu proyecto tiene gpt-6-astra activado. En los espacios Enterprise, Astra está desactivado por defecto en el lanzamiento.
Los comandos siguientes usan Windows PowerShell e instalan todos los paquetes necesarios para este tutorial, incluido realtime de OpenAI para la demo de steering.
python -m venv .venv
.venv\Scripts\Activate.ps1
Copy-Item .env.example .env
pip install "openai[realtime]" flask pytest playwright pydantic matplotlib python-dotenv streamlit
playwright install chromium
En macOS o Linux, sustituye el comando de activación por source .venv/bin/activate y el de copia por cp .env.example .env.
Luego añade la clave de API al nuevo archivo .env: abre el fichero .env que acabas de copiar y añade OPENAI_API_KEY=sk-..., que python-dotenv carga y el SDK recoge automáticamente, así que no pasas la clave en el código.
Si los archivos .env o las dependencias por proyecto te suenan nuevos, nuestros tutoriales de entornos virtuales y variables de entorno lo explican. Comprueba que la clave funciona antes de seguir.
Si tu clave ya funciona con la Responses API, salta la siguiente subsección y empieza con el bucle sincrónico de herramientas. La primera petición solo verifica la configuración.
Haz tu primera llamada a la API de GPT-6 Astra
Una vez tengas la clave, hay que cargarla con dotenv. Después puedes crear un cliente de OpenAI y enviar tu primera petición con client.responses.create(). La petición más pequeña posible se ve así:
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
client = OpenAI()
response = client.responses.create(
model="gpt-6-astra",
reasoning={"effort": "low"},
input="In one sentence, what is a staging environment used for?",
)
print(response.output_text)
El campo usage de la respuesta lista los recuentos de tokens necesarios para el cálculo de costes posterior.
Crea un bucle sincrónico de herramientas con GPT-6 Astra
Los fragmentos de abajo son extractos; las versiones ejecutables están en el repositorio de GitHub asociado.
Antes de tocar nada asíncrono, construí la versión normal:
-
Llamar al modelo
-
Buscar un elemento
function_call -
Ejecutar la herramienta correspondiente
-
Enviar el resultado de vuelta con
previous_response_id -
Repetir hasta que el modelo deje de pedir herramientas.
Este bucle bloqueante es la base para la comparación async.
for turn in range(max_turns):
response = client.responses.create(
model="gpt-6-astra",
reasoning={"effort": "low"},
tools=TOOLS,
input=next_input,
previous_response_id=previous_response_id,
)
calls = [item for item in response.output if item.type == "function_call"]
if not calls:
final_text = response.output_text
break
outputs = [
{"type": "function_call_output", "call_id": call.call_id, "output": run_tool(call)}
for call in calls
]
next_input, previous_response_id = outputs, response.id
Qué encontró la ejecución base
En la ejecución base, el modelo llamó a cada herramienta por turno. Encontró el fallo de validación conocido y devolvió una decisión de no continuar. En tres ejecuciones, el tiempo medio de muro fue de 23,40 segundos. Ese promedio cubre la ejecución completa, no los tiempos de cada herramienta.
¿Cómo funciona el uso asíncrono de herramientas en GPT-6 Astra?
Marca una herramienta con "async": true en su esquema, y tu app podrá aplazar ese resultado mientras el modelo sigue trabajando o espera. Tu aplicación sigue ejecutando la herramienta y gestionando el trabajo en segundo plano.
Cómo ejecutar comprobaciones independientes en paralelo
Marqué run_test_suite y check_ui_flow como async, y añadí una herramienta wait_for_tasks definida por la app y sin argumentos, ya que esta demo solo tiene un lote de trabajo pendiente a la vez. Esa espera sin argumentos mantiene el ejemplo pequeño.
En un runner de producción, identifica los trabajos con manejadores de tarea, vincula cada manejador a su call_id original, y espera solo cuando el siguiente paso dependa de un resultado pendiente.
Devuelve cada resultado completado en su call_id original, y luego devuelve el estado de espera en el propio call_id de la herramienta de espera.
TOOLS = [
{"type": "function", "name": "run_test_suite", "async": True, ...},
{"type": "function", "name": "check_ui_flow", "async": True, ...},
{"type": "function", "name": "check_staging_health", ...},
{"type": "function", "name": "wait_for_tasks", ...},
]
Para esta ejecución, la app envió cada llamada marcada a un pool de hilos. Mientras corrían las comprobaciones en segundo plano, realizó la comprobación de salud sincrónica rápida. Luego se bloqueó en wait_for_tasks hasta que las comprobaciones pendientes terminaron.
¿Reduce el tiempo total el uso asíncrono?
En tres ejecuciones, async redujo el tiempo medio de 23,40 a 18,94 segundos (−19,1%). El promedio parecía claro hasta ver cada ejecución individual; el gráfico de abajo muestra lo que variaron. Tres ejecuciones bastan para explicar lo que pasó aquí, no para predecir la latencia en producción.

Los tiempos variaron en ambos modos. Imagen del autor.
¿Por qué las comprobaciones concurrentes causaron una condición de carrera?
Ejecutar a la vez la comprobación de navegador y la prueba de importación masiva hacía que a veces fallara la aserción de importación porque ambas modificaban la misma lista de tareas en memoria. Eso rompió la suposición de acceso exclusivo del test. Aislar los datos en el runner o en los tests evitaría la condición de carrera.
Uso de ordenador acotado con GPT-6 Astra para pruebas de UI
Para el uso del ordenador, la documentación de GPT-6 Astra recomienda ejecución de código, mientras que la herramienta estructurada computer sigue admitida como alternativa. Con ejecución de código, una llamada puede combinar varias acciones, bucles y lógica condicional; la herramienta computer devuelve una acción estructurada de ratón o teclado por vez para que tu app la traduzca y reprograme.
Cómo limitar el runner de uso del ordenador
Llamé a la clase BrowserSandbox, pero el nombre exagera su protección. Da al código redactado por el modelo una page de Playwright, una función log() y un helper expect_text() . Python aún puede inyectar built-ins en exec(), y la página puede navegar a otro origen.
sandbox_globals = {"page": self.page, "log": log, "expect_text": expect_text}
exec(code, sandbox_globals)
Trátalo como un runner de demo, no como un límite de seguridad. El código redactado por el modelo necesita un proceso o contenedor aislado con restricciones de sistema de archivos, procesos, red y orígenes.
¿Qué ocurrió en la comprobación de UI?
Tope el bucle en ocho turnos porque una comprobación acotada necesita un corte duro. El modelo inspeccionó la página, encontró el input del formulario, creó el título "UI flow check, cobalt otter 73921", envió la tarea y confirmó que aparecía; tardó 13 segundos. Nuestro tutorial de uso del ordenador con GPT-5.4 cubre un ejemplo detallado con un predecesor de Astra.
¿Cómo funciona el steering a mitad de turno en GPT-6 Astra?
El steering a mitad de turno está disponible solo para gpt-6-astra mediante conexión WebSocket.
Abre una conexión y crea una respuesta, luego envía un evento response.steer con nuevas instrucciones mientras se genera la respuesta. Un evento response.steer.accepted significa que la actualización está en cola, no aplicada. Antes de crear la continuación automática, el servidor termina el elemento de salida actual y cualquier trabajo de herramienta alojada ya en ejecución.
Si aún necesita el resultado de una herramienta del cliente o una aprobación, response.steer.pending identifica la entrada que falta.
async with client.responses.connect() as connection:
await connection.response.create(model="gpt-6-astra", input=TASK)
async for event in connection:
if event.type == "response.created" and initial_response_id is None:
initial_response_id = event.response.id
await asyncio.sleep(1.0)
await connection.response.steer(
previous_response_id=initial_response_id,
input="Also add a rollback plan, but skip mobile.",
)
El retardo de un segundo replica el código del experimento y da tiempo a que empiece la primera respuesta. Sin ese retardo, probarías otro punto del ciclo de vida de la respuesta.
¿Qué no cambia el steering a mitad de turno?
El steering no reescribe la respuesta original. Si la actualización la interrumpe, esa respuesta termina con status: "incomplete" y incomplete_details.reason: "steered". Una respuesta sucesora continúa con la nueva instrucción.
Si la primera respuesta termina antes de que la actualización surta efecto, se mantiene completada. El steering no revierte ni cancela acciones del lado del cliente que ya hayan empezado; tu aplicación sigue siendo responsable. El steering en cola solo existe en la conexión WebSocket actual, así que registra la actualización antes de intentar reconectar.
La ruta de comparación deja que la primera respuesta termine y luego envía una nueva petición con las instrucciones combinadas. En dos ejecuciones, el steering promedió 26,91 segundos frente a 50,02 segundos de la vía de finalizar y reiniciar. Esta comparación no cubre una política de cancelar y reiniciar ni puntúa el texto final por corrección.

Promedios de dos ejecuciones para tiempo y coste. Imagen del autor.
La ruta de reinicio genera dos respuestas completas que cubren parte de las mismas peticiones. Eso explica parte de la diferencia de tiempo, así que no tomaría estas dos ejecuciones como benchmark general del steering.
Cómo cambiar el esfuerzo de razonamiento de GPT-6 Astra a mitad de conversación
gpt-6-astra admite esfuerzo de razonamiento de low a max. Un mayor esfuerzo puede aumentar el uso de tokens de razonamiento, pero no garantiza una respuesta distinta. Una configuration_update cambia las respuestas siguientes hasta que otra actualización la sobrescriba, mientras el ajuste al nivel de petición permanece igual.
En esta canalización, el informe cierra la conversación, así que la actualización afecta solo a ese último paso.
response = client.responses.create(
model="gpt-6-astra",
previous_response_id=previous_id,
reasoning={"effort": "low"}, # default remains low
input=[
{"type": "configuration_update", "reasoning": {"effort": "high"}},
{"role": "user", "content": "Diagnose the root cause and recommend a fix."},
],
)
Usé la misma traza de fallo en ambos niveles de esfuerzo y comparé el diagnóstico y el uso de tokens.
Un matiz: el campo reasoning.effort de la respuesta sigue informando del ajuste al nivel de petición, no del esfuerzo seleccionado por configuration_update. No uses ese campo para verificar si la actualización surtió efecto.
¿Cambió el diagnóstico con un esfuerzo alto?
En la ejecución combinada completa, el paso escalado usó 108 tokens de razonamiento. Todos los demás pasos en low usaron cero. En una prueba aislada anterior con una traza de fallo más larga, el esfuerzo bajo usó cero tokens de razonamiento y el alto 318. Ambas versiones identificaron el bug de validación, así que subir el esfuerzo cambió el uso de tokens pero no el diagnóstico.
Las actualizaciones de configuración funcionan solo en peticiones estándar de un solo agente. La API rechaza actualizaciones adyacentes y no se pueden combinar con compactación o truncado automáticos.
Cómo usar las salidas estructuradas de GPT-6 Astra
El último paso de la canalización llama a client.responses.parse para sustituir texto libre por un modelo validado de Pydantic.
class GoNoGoReport(BaseModel):
decision: str
summary: str
checks_completed: list[str]
failures: list[str]
risks: list[str]
follow_up_actions: list[str]
confidence: float
response = client.responses.parse(
model="gpt-6-astra",
previous_response_id=previous_id,
text_format=GoNoGoReport,
input=[...],
)
Pydantic valida los tipos de campo declarados aquí. No prueba que el informe se ajuste a las evidencias, y esta versión no restringe decision a dos valores ni confidence a un rango.
¿Qué detectó el informe go/no-go?
El informe devolvió decision: "no_go". Clasificó el fallo de validación mencionado antes en failures y el problema de concurrencia en risks. Para este último, escribió: "possible interference from concurrent UI checks against shared staging data." El prompt no nombraba ese riesgo.
Mantén latencia y coste fuera de este esquema y calcúlalos en código. El modelo rellena los campos del informe a partir de la evidencia de herramientas.
La interfaz de Streamlit consume el mismo generador que el runner por línea de comandos. Renderiza cada evento de herramienta a medida que llega y luego muestra el informe parseado en las pestañas Informe y JSON.
Progreso en vivo del agente junto al informe final. Vídeo del autor.
El panel ejecuta la canalización de release combinada async con su comprobación de navegador fija, actualización de razonamiento, informe estructurado y visualización de tiempos. Su panel de costes lee el mismo libro mayor que el runner por línea de comandos. No ejecuta las demos separadas de uso del ordenador redactado por el modelo ni de steering.
Cómo controlar el uso de tokens y el coste de la API de GPT-6 Astra
Para la parte de tokens de modelo en estas ejecuciones, el campo usage contiene los cuatro recuentos necesarios para calcular el precio de cada respuesta. Las escrituras en caché tienen su propia tarifa, así que no las agrupes con la entrada ordinaria. Aquí las herramientas se ejecutan en tu aplicación; si añades una herramienta alojada con tarifa aparte, incluye ese coste también.
details = usage.input_tokens_details
cached_tokens = details.cached_tokens
cache_write_tokens = details.cache_write_tokens
ordinary_tokens = usage.input_tokens - cached_tokens - cache_write_tokens
cost = (
ordinary_tokens * PRICE_INPUT
+ cached_tokens * PRICE_CACHED_INPUT
+ cache_write_tokens * PRICE_CACHE_WRITE
+ usage.output_tokens * PRICE_OUTPUT
) / 1_000_000
Este cálculo cubre una respuesta. El libro mayor lo aplica tras cada respuesta y luego suma los totales de la llamada.
Registra cache_write_tokens incluso cuando sea cero. Si no, una escritura en caché futura puede esconderse dentro del recuento de entrada ordinaria, y es una manera muy molesta de descubrir un error de facturación.
Consideraciones para producción de un agente con GPT-6 Astra
La demo necesita estos cambios antes de poder bloquear despliegues.
Permisos y aislamiento de herramientas
Mantén el límite de staging y aísla BrowserSandbox como se describe arriba. No le des credenciales de base de datos ni acceso a producción.
Ciclo de vida de trabajos async
En la demo, todo trabajo pendiente termina y nadie más lo toca. Un runner desplegado debe sobrevivir a los casos en que ninguna de las dos cosas sea cierta. Para cada entrada pendiente, necesita:
- Un plazo y un estado final, para que nada quede pendiente para siempre
- Una marca de entrega, para que una devolución de llamada y un reintento no envíen el mismo resultado dos veces
- Marcas de tiempo de inicio y fin, para distinguir un timeout de una finalización tardía pero válida
- Rechazo de llamadas duplicadas, para que una misma tarea no se lance dos veces
- Gestión de errores en hilos de fondo, para que una excepción no se pierda en el pool
- Cancelación, lo que implica ignorar un resultado tardío y detener cualquier trabajo externo ya en marcha
Steering y acciones irreversibles
Un steer puede cambiar instrucciones futuras, pero no puede deshacer un efecto lateral ya completado. Si una herramienta ya ha modificado un sistema externo, otra acción debe compensarlo.
Supervisión de desalineación
La detención automática aplica a peticiones de la Responses API que usan razonamiento persistente, WebSockets o compactación de OpenAI. Otras peticiones pueden disparar alertas, pero no se detienen automáticamente.
Antes del streaming, la supervisión de desalineación puede bloquear una ejecución cubierta con HTTP 403 y el código misalignment_policy_violation. Un cliente en streaming puede recibir un error después de que haya empezado la salida. La API no ofrece una reanudación general de la conversación detenida.
Checklist de despliegue de un agente con GPT-6 Astra
Antes de pasar este agente de una demo local a producción, añade estos controles. Deben ir en el código de la aplicación, no en las instrucciones del modelo.
-
Configura timeouts explícitos en las llamadas HTTP de la app de staging y en la conexión WebSocket
-
Registra entrada ordinaria, entrada en caché, escrituras en caché, salida, ID de respuesta y número de turnos
-
Alerta sobre ejecuciones incompletas o que alcanzan el tope de turnos. Configura una alerta aparte para sobrecostes
-
Fija la versión del SDK
openaiy vuelve a comprobar el comportamiento de async, steering yconfiguration_updateantes de actualizar
¿Cuándo usar herramientas async o steering con GPT-6 Astra?
Elige el camino más simple que encaje con el trabajo.
- Empieza con una petición sincrónica y salidas estructuradas cuando las herramientas devuelven rápido y los requisitos no cambian.
- Añade llamadas async cuando el modelo u otra herramienta puedan avanzar trabajo útil durante una llamada lenta, y el tiempo ahorrado justifique la gestión adicional de trabajos.
- Usa steering a mitad de turno cuando los requisitos cambien durante la ejecución.
Conclusiones
El release check sincrónico ganó utilidad al poder solapar herramientas lentas, aunque no fue una victoria limpia. En tres ejecuciones, async bajó el tiempo medio de 23,40 a 18,94 segundos y destapó una condición de carrera por estado compartido que el bucle secuencial ocultaba.
Aislaría el navegador y los datos de test, mantendría los turnos rutinarios en low y subiría el esfuerzo de razonamiento solo cuando la evidencia requiera mirarla de cerca. Si las herramientas terminan rápido y los requisitos no cambian, quédate con el bucle sincrónico y salidas estructuradas. Usa async cuando el trabajo independiente pueda solaparse, y steering cuando las instrucciones cambien durante una respuesta.
Para lo básico de la API, te recomendamos nuestro curso Working with the OpenAI API. Para sistemas de agentes a mayor escala, consulta el curso Building Scalable Agentic Systems.
FAQs
¿Puedo usar Chat Completions con GPT-6 Astra?
Para texto plano, sí. Para llamadas a herramientas, no: Astra requiere la Responses API, así que todos los ejemplos aquí usan client.responses.create.
¿Qué modelos admiten llamadas async a herramientas y steering?
Las llamadas asíncronas a herramientas se introdujeron con GPT-6 Astra. El steering a mitad de turno es exclusivo de Astra y solo por WebSocket; GPT-5.6 y anteriores no lo admiten.
¿Qué se rompe al cambiar una petición existente a gpt-6-astra?
Tres cosas. reasoning.effort: "none" devuelve HTTP 400, así que empieza en low. Los ajustes de temperature, top_p y probabilidades logarítmicas deben desaparecer. Y las llamadas a herramientas deben pasar a Responses si aún no están allí.
¿Sustituye async a las llamadas paralelas a herramientas?
No, resuelven problemas distintos. Las llamadas paralelas permiten que el modelo pida varias herramientas en un turno; async deja que tu app aplace el resultado de una herramienta mientras el modelo sigue.
¿Por qué mi llamada async a herramienta falló por falta de function_call_output?
Este error puede ocurrir cuando una llamada de herramienta no asíncrona en el mismo lote no se ha resuelto. Async solo aplaza la llamada marcada; toda otra llamada a herramienta sigue necesitando un output primero.
¿Las llamadas async a herramientas requieren WebSockets?
No. La implementación async anterior usa llamadas normales de la Responses API.
¿Llegó a detectar el bug del título en blanco la comprobación de UI en lugar de la suite de tests?
No. Solo la suite de tests ejercitó la validación de título en blanco; las comprobaciones de UI y salud probaron otro comportamiento.
¿Por qué usamos previous_response_id en el bucle de herramientas?
Conecta cada resultado de herramienta con la respuesta que lo solicitó. El bucle puede continuar la misma conversación en la Responses API sin reenviar la transcripción completa en cada llamada.
Soy ingeniero de datos y creador de comunidades. Trabajo con canalizaciones de datos, nube y herramientas de IA, al tiempo que escribo tutoriales prácticos y de gran impacto para DataCamp y programadores emergentes.
