La orientación durante el turno permite a los usuarios agregar requisitos o cambiar de rumbo sin esperar a que termine una respuesta.
La orientación durante el turno está disponible con GPT-6 Astra (gpt-6-astra) mediante una
conexión WebSocket a la API Responses. GPT-5.6 y los modelos anteriores no
admiten la orientación.
La orientación no reescribe la salida ya enviada a tu aplicación, no deshace acciones anteriores ni cancela herramientas que ya se hayan iniciado.
Para conocer la configuración de la conexión y el comportamiento general del transporte, consulta Modo WebSocket. Para ver las definiciones exactas de los eventos, consulta la referencia de eventos WebSocket de Responses.
Enviar un mensaje de orientación
Inicia una respuesta con response.create. Después de recibir su evento response.created, envía response.steer por la misma conexión, usando el ID de esa respuesta como previous_response_id:
{
"type": "response.steer",
"previous_response_id": "resp_1",
"input": "Keep the scope small enough for one developer to finish in two weeks."
}
El evento solo acepta type, previous_response_id y input. Establece input en una cadena o un arreglo no vacío de mensajes de usuario con tipos de contenido compatibles.
La API confirma que la entrada está en cola con response.steer.accepted:
{
"type": "response.steer.accepted",
"sequence_number": 4,
"steer": {
"id": "steer_0123456789abcdef0123456789abcdef",
"previous_response_id": "resp_1"
}
}
La aceptación significa que la entrada está en cola, no que el modelo haya actuado en función de ella. La API crea automáticamente una nueva respuesta con tu actualización, a menos que necesite un resultado de herramienta o una aprobación de tu aplicación.
Antes de crear esta continuación automática, el servidor termina el elemento de salida actual y cualquier trabajo de herramientas alojadas que ya esté en ejecución. Sigue leyendo eventos para recibir la respuesta con tu actualización; no envíes otro response.create.
Si la orientación interrumpe la respuesta original, esta termina con response.incomplete y incomplete_details.reason: "steered". Si la respuesta original termina normalmente antes, conserva su estado de completada y aun así puede tener una continuación de orientación.
Las continuaciones automáticas heredan la configuración de la solicitud original. Los límites de tokens y de llamadas a herramientas se aplican por separado a cada respuesta.
Ejecutar un ejemplo completo
El SDK de .NET no proporciona un cliente WebSocket de Responses, por lo que no hay una variante con el SDK de C# para este ejemplo.
import asyncio
from openai import AsyncOpenAI
async def main():
client = AsyncOpenAI()
initial_response_id = None
successor_response_id = None
async with client.responses.connect() as connection, asyncio.timeout(120):
await connection.response.create(
model="gpt-6-astra",
reasoning={"effort": "medium"},
input="Draft a project plan for building a task-tracking app.",
)
async for event in connection:
if event.type == "response.created":
if initial_response_id is None:
initial_response_id = event.response.id
# Simulate a user adding instructions while the response runs.
await connection.response.steer(
previous_response_id=initial_response_id,
input="Keep the scope small enough for one developer to finish in two weeks.",
)
else:
successor_response_id = event.response.id
elif event.type in {"response.steer.failed", "response.failed", "error"}:
raise RuntimeError(event.to_json())
elif event.type == "response.incomplete":
response = event.response
if (
response.id != initial_response_id
or response.incomplete_details is None
or response.incomplete_details.reason != "steered"
):
raise RuntimeError(event.to_json())
elif (
event.type == "response.completed"
and event.response.id == successor_response_id
):
print(event.response.output_text)
return
# Acceptance only queues the input. Keep reading past the first response.
raise RuntimeError("Connection closed before the steered response finished.")
asyncio.run(main())El ejemplo envía la actualización después del primer evento response.created. En tu aplicación, envíala cuando un usuario proporcione una actualización. Usa el ID de la continuación para enviar nueva orientación una vez que llegue su evento response.created.
Devolver resultados de herramientas o una aprobación
Si la respuesta necesita un resultado de una herramienta del cliente o una aprobación, la API mantiene la orientación en cola. Continúa tu flujo habitual de herramientas o aprobación en la misma conexión.
Por ejemplo, la respuesta original puede completarse con una llamada a get_project_status. Las siguientes cargas útiles muestran solo los campos pertinentes:
{
"type": "response.completed",
"response": {
"id": "resp_1",
"status": "completed",
"output": [
{
"type": "function_call",
"call_id": "call_project",
"name": "get_project_status",
"arguments": "{\"project\":\"task-tracker\"}"
}
]
}
}
Después de que se completa la respuesta original, la API envía response.steer.pending para la orientación aceptada que aún necesita datos de entrada. Su campo required_input identifica los resultados de herramientas o las aprobaciones que la API necesita antes de poder aplicar la actualización:
{
"type": "response.steer.pending",
"sequence_number": 12,
"steer": {
"id": "steer_0123456789abcdef0123456789abcdef",
"previous_response_id": "resp_1"
},
"reason": "waiting_for_required_input",
"required_input": [
{
"type": "function_call_output",
"call_id": "call_project",
"name": "get_project_status"
}
]
}
Devuelve los datos de entrada requeridos con response.create por la misma conexión, estableciendo previous_response_id en resp_1. No repitas la orientación aceptada. Un response.create explícito usa sus propias herramientas, instrucciones y demás ajustes.
Los comentarios de este ejemplo JSONC muestran dónde agrega el servidor la actualización en cola:
{
"type": "response.create",
"model": "gpt-6-astra",
"previous_response_id": "resp_1",
"input": [
// The server implicitly prepends your accepted steer here:
// "Keep the scope small enough for one developer to finish in two weeks."
{
"type": "function_call_output",
"call_id": "call_project",
"output": "Design is complete. Development has not started.",
},
{
"role": "user",
"content": "Show me the updated plan before starting any work.",
},
],
}
No necesitas esperar a response.steer.pending para devolver los resultados de herramientas. Si el servidor ya recibió un response.create correspondiente, puede continuar sin enviar primero esta notificación.
Gestionar fallas y desconexiones
response.steer.failed significa que la API no aplicó la entrada mediante la orientación y no la aplicará automáticamente más adelante. El evento devuelve los valores originales de input y previous_response_id dentro de steer, junto con un objeto error que describe la falla.
Haz un seguimiento de los envíos aceptados mediante steer.id. Una falla posterior usa el mismo ID.
Códigos de error comunes:
invalid_input: usa solo los campos de evento compatibles y mensajes de usuario como entrada.steering_not_supported: el modelo, los parámetros de la solicitud o ambos pueden ser incompatibles con la orientación.response_not_found: la respuesta de destino debe seguir disponible en la misma conexión WebSocket.too_many_pending_steers: hay demasiadas entradas de orientación pendientes. Devuelve los resultados de herramientas o las aprobaciones que se requieran medianteresponse.create; de lo contrario, espera a la continuación automática antes de enviar más. No reenvíes orientación ya aceptada.
Las entradas de orientación en cola existen solo en la conexión actual; no se almacenan con la respuesta original. Registra las entradas de orientación que envíes y compáralas con los eventos y el historial de respuestas antes de volver a enviarlas. No supongas que la orientación pendiente se conservó tras la desconexión. Consulta la guía de recuperación de WebSocket.